标签:使用 get ceo 成员 调用 编译器 而不是 成员变量 判断
子类继承了父类中可访问的数据域和方法,子类也可添加新的数据域和方法,
子类不继承父类的构造函数。
一个子类只能有一个直接父类:单继承。
当第1次创建子类对象时,首先初始化其父类静态成员变量(如果没有父类对象实例化过),然后初始化当前子类对象的静态成员变量。
注意:第1次之后创建子类对象时,不会再次初始化父类和子类的静态成员变量。其实静态成员变量在有任何实例对象之前已经存在。
接着执行该子类对象的父类(若未定义父类,则一定是Object)的构造函数super(…),可能是编译为父类提供的默认无参构造函数super( )。
然后执行子类实例成员变量定义时的初始化表达式,若定义时未给出初始化值,则默认为0或null。
最后执行子类构造函数体中super(…)后面的语句。
利用supper可以显式调用父类的构造函数
super(parametersopt)调用父类的的构造函数。
必须是子类构造函数的第1条且仅1条语句(先构造父类)。
如果子类构造函数中没有显式地调用父类的构造函数,那么将自动调用父类不带参数的构造函数。
编译在为子类添加无参构造函数时,用super( )默认调用父类的无参构造函数,如果找不到父类无参构造函数,则子类添加无参构造函数失败。
如果子类重新定义了从父类中继承的实例方法,称为方法覆盖(method override)。
仅当方法是可访问的实例方法时,才能被覆盖,即私有实例方法不能被覆盖,私有方法自动视为final的。
静态方法不能被覆盖,如果静态方法在子类中重新定义,那么父类方法将被隐藏。
一旦父类中的方法被覆盖,则不能通过引用的子类对象访问被覆盖的父类方法。在子类类体函数中可以使用super引用被覆盖的父类方法。
覆盖:子类对象被父类引用变量引用,父类引用变量调用的相同签名的函数是子类函数(不能发现父类函数、晚期绑定)。
隐藏:同上,但父类引用变量访问的是父类变量、函数(可再发现)。
equals方法:用于测试两个对象的属性是否相等。其默认实现是比较两个变量是否引用同一个对象,而不是检查对象的属性是否相同,故须在子类进行覆盖。例如,在Circle类中覆盖:
public boolean equals(Object o){
if(o instanceof Circle) //应先检查另一对象o的类型
return radius==((Circle)o).radius;//基本类型,==判断即可
return false;
}
toString方法:返回代表这个对象的字符串。其默认实现是返回由类名、@和hashCode组成。
circle.toString( );//Circle@15037e5:默认实现用处小,应在子类覆盖。
getClass方法:用于泛型和反射机制,是一个final方法,故不可覆盖。
多态:使用引用变量调用实例函数时,根据所引用的实际对象的类型,执行该类型的相应实例方法,从而表现出不同的行为称为多态。通过继承时覆盖父类的实例方法实现多态。
当调用实例方法时,由Java虚拟机动态地决定所调用的方法,称为动态绑定(dynamic binding) 或为多态
父类变量引用子类对象,可视为将子类对象转换为父类。
从子类到父类的转换是合法的,称为隐式转换。
Person p=new Manager();//将子类对象转换为父类对象
从父类到子类必须显式转换。
Manager m = p; //编译错
Manager m = (Manager)p;//ok,但转换前没有检查
从父类到子类必须显式转换时进行检查更安全。
Manager m = null;
if(p instanceof Manager) m= (Manager)p; //安全:转换前检查
重载发生在编译时(Compile time),编译时编译器根据方法签名找到最合适的方法。早期绑定
多态发生在运行(Run time)时,运行时JVM根据变量所引用的对象的真正类型来找到最合适的实例方法。晚期绑定
final成员变量:常量,数据初始化后不能再修改。
final方法:最终方法,子类不能覆盖。
private实例方法:自动视为final,子类不能覆盖(这点好像有问题,子类不可见,但是子类可以定义与其相同的函数)
final类:最终类,不能派生子类。
final局部变量:常量,数据初始化后不能再修改。
标签:使用 get ceo 成员 调用 编译器 而不是 成员变量 判断
原文地址:https://www.cnblogs.com/jing-yu/p/9060312.html