<Java SE 详解> 序列二-
1、类是一种抽象的概念,对象是类的一种具体表现形式,是具体的概念。先有类,然后由类来生成对象(Object)。对象又叫做实例(Instance);
2、类由两大部分构成:属性及方法。属性一般由名词表示,方法一般由动词表示;
3、如果一个Java源文件中定义了多个类,那么这些类中最多只能有一个类是public的,换句话说,定义的多个类可以都不是public的;
4、在Java中进行方法的参数传递时,无论传递的是原生数据类型还是引用类型,参数传递的方式统一是值传递(pass by value),Java中没有传引用(pass by reference)的概念;
5、方法重载(Overload):表示两个或多个成员方法名称相同,但是方法参数不同。方法参数不同有三重含义:1> 参数个数不同; 2> 参数类型不同; 3> 参数顺序不同。
注意:方法的返回值对重载没有任何影响,即方法的返回值不是方法的signature,但是方法重写(Override)需要有一致的方法返回值;
6、构造方法重载:只需看参数即可。如果想在一个构造方法中调用另外一个同类中的构造方法,那么可以使用this(...)的方式调用,this(...)括号中的参数表示目标构造方法的参数列表。this(...)必须要作为构造方法的第一个语句,换句话说,this()之前不能有任何可执行的代码;
7、继承(Inheritance):Java是单继承的,意味着一个类智能从另一个类继承(父类,基类 base class),Java中继承使用extends关键字;
8、当生成子类对象时,Java默认首先调用父类的不带参数的构造方法,然后执行该构造方法,生成父类的对象。接下来再去调用子类的构造方法,生成子类的对象。要想生成子类对象,首先需要生成父类的对象,没有父类对象就没有子类对象。比如说:没有父亲就没有孩子;
9、super关键字:super表示对在子类对象生成之前首先生成的父类对象的引用。
10、如果子类使用super(...)显式的调用父类的某个构造方法,那么在执行的时候就会寻找与super(...)所对应的构造方法,而不会再去寻找父类的不带参数的构造方法。与this一样,super也必须要作为子类构造方法的第一条执行语句,前面不能有其他任何语句;
11、关于继承的3点:
a> 父类有的,子类也有;
b> 父类没有的,子类可以增加;
c> 父类有的,子类可以改变。
12、关于继承的注意事项:
a> 构造方法不可被继承;
b> 方法和属性可以被继承;
c> 子类的构造方法隐式的调用父类的无参构造方法;
d> 当父类没有不带参数的构造方法时,子类需要使用super(...)方式来显式地调用父类的构造方法,super指的是对父类对象的引用;
e> super(...)语句必须是子类构造方法中的第一行语句。
13、方法覆写(Override):必须是子类与父类的某一个方法
a> 返回类型一致;
b> 方法名称一样;
c> 参数数量、类型、顺序一致;
这样我们就说子类与父类的方法构成了覆写关系;
覆盖与覆写概念的区别:
覆盖与覆写两个概念是在C#中被区别的,但是在Java中统一被指定为覆写,而对于实例方法没有覆盖的概念,对于类方法仅仅是覆盖概念。
1、覆盖:派生类不能删除它所继承的任何成员,但是它可以隐藏他们;但是当用基类引用指向子类对象的时候,通过基类接口仅仅能访问基类对象中原有的成员,而不能访问在对象的子类部分中相同签名的成员,如例1。但是这种情况使用的不多,多数是使用覆写;
2、覆写:比覆盖的概念更进一步,覆写可以使基类的引用访问“升至”派生类内部。即通过基类接口可以访问对象的子类部分中“相同签名的成员”,但此时不能再访问基类中相同签名的成员,这意味着基类中的相同签名的成员仿佛已经不存在了,存在的只有子类中的成员,但是在子类的内部还是可以使用base或super关键字去访问基类中的同签名成员。
注意:不论是覆盖还是覆写均可以使用base或super关键字去指向父类对象中的成员。
覆写与覆盖区别的例子:
覆盖:(C#代码)
using System;
namespace super
{
class Program
{
static void Main(string[] args)
{
SomeClass sc = new OtherClass(); //使用子类中掩盖的成员
sc.Method1(sc.Field1); //使用子类中掩盖的成员
//输出的是"SomeClass.Method1: SomeClass Field1"
}
}
class SomeClass
{ //基类
public string Field1 = "SomeClass Field1";
public void Method1(string value)
{
Console.WriteLine("SomeClass.Method1: {0}", value);
}
}
class OtherClass : SomeClass
{ //子类
new public string Field1 = "OtherClass Field1"; //隐藏基类成员变量
new public void Method1(string value) //隐藏基类成员方法
{
Console.WriteLine("OtherClass.Method1: {0}", value);
}
}
}
覆写:(Java代码)
package cn.edu.bupt.baseKnowledge;
public class OverrideTest {
public static void main(String[] args) {
SuperClass sc = new DerivedClass();
sc.print(); //打印 "in the super class \n in the derived class"
}
}
class SuperClass {
public void print() {
System.out.println("in the super class");
}
}
class DerivedClass extends SuperClass {
public void print() {
super.print();
System.out.println("in the derived class");
}
}
14、方法覆写和方法重载之间的关系:重载发生在同一个类内部的两个或多个方法;覆写发生在父类和子类之间,覆写一定是伴随着继承过程发生的;
Overload方法时:方法需要具有相同的signature(name, plus the number and type of its parameters)即可;
Override方法时:两个类中的方法不但需要具有相同的signature,而且需要具有相同类型的返回值。
15、当两个方法形成了覆写的关系时,可以在子类成员方法中通类似于过super.run()的方式调用父类中的run()成员方法,其中super.run()不必放在子类成员方法中的第一行语句,因为此时父类对象已经构造完毕,可以在需要调用的地方调用即可,先调用父类的run()成员方法还是先调用子类的run()方法是根据程序的逻辑决定的;
16、在定义一个类的时候,如果没有显式的指定该类的父类,那么该类就会继承于java.lang.Object类(JDK提供的一个类,Object类是Java中所有类的直接或间接父类)。
17、多态(Polymorphism):我们说子类就是父类(玫瑰是花,男人是人),因此多态的意思就是:父类型的引用可以指向子类的实例对象。说白了就是一句话:子类就是父类,但父类不是子类。 十八-30:00
18、多态是运行期的行为而不是编译期的行为;
浙公网安备 33010602011771号