五十五、父类与子类的执行顺序
先父类,后子类。
当有继承关系时,先加载父类(调用父类的静态代码块),在加载子类(调用子类的静态代码块),再调用父类的构造代码块,再调用父类的构造器, 然后才是子类的。
然后初始化子类对象时默认调用super()–父类的无参构造器。
五十六、重写
(1)、private权限不能继承使用,可以通过调用封装的get、set方法赋值和使用。
(2)、重写:方法权限不能低于父类的方法的权限,可以等于。
(3)、final修饰方法时:该方法不能被重写,但是可以被调用,也可以重载。
(4)、final修饰类时:该类不能被继承
(5)、父类的构造方法不能被继承,也不能被重写
(6)、静态方法不能被重写
五十七、在子类中调用父类的方法
(1)、super.sing();————最常用
(2)、this.sing();—————罕见用
五十八、绑定
public static void main(String[] args) {
Che che=new Che();
change(che);
//num的值被change方法改变成6
System.out.println(c.num);
Car c1=new Car();
//因为num为静态属性,并且c.num已经是6,所以c1也是6
System.out.println("Car:静态属性:"+c1.num);
}
public static void change(Che c) {
c.num=6;
System.out.println("修改完成");
}
注意:
(1)、num为父类Che中静态的属性
(2)、如果num不是静态属性,那么c1.num的值将不会变
五十八、绑定机制:
程序在JVM运行过程中,会把类的类型信息、static属性和方法、final常量等元数据加载到方法区,这些在类被加载时就已经知道,不需对象的创建就能访问的,就是静态绑定的内容;需要等对象创建出来,使用时根据堆中的实例对象的类型才进行取用的就是动态绑定的内容。
(1)、前期绑定(静态绑定、编译期的绑定)
属性不能被覆盖:final,private static修饰时,成员属性为前期绑定
(2)、后期绑定(动态绑定、运行时的绑定)
当方法不为final,private static修饰时为后期绑定.
动态绑定
动态绑定(后期绑定)是指:在程序运行过程中,根据具体的实例对象才能具体确定是哪个方法。
在代码的编译阶段,编译器通过 声明对象的类型(即引用本身的类型) 在方法区中该类型的方法表中查找匹配的方法。如果有则编译通过。(这里是根据声明的对象类型来查找的,所以父类声明时是查找 父类的方法表,而父类方法表中是没有子类新增的方法的,所以父类声明指向子类对象时不能调用子类自己的方法)。
编译阶段,在声明对象类型的方法表中查找方法,只是为了安全地通过编译(也为了检验方法是否是存在的)。而在实际运行调用方法时,JVM会把子类对象压入操作数栈,用它来进行调用。用实例对象进行方法调用的过程就是动态绑定。
五十九、多态的好处
消除类型之间的耦合关系
可替换性
可扩充性
接口性
灵活性
简化性