《JAVA编程思想》阅读笔记 第8章 多态

继承后使用父类对象对子类方法进行操作,可以避免增加子类时的大量重复性工作。因为子类从父类继承而来,子类的实例对象本质上也是父类类型,因此使用父类实例对象操作子类方法与直接创建子类对象操作方法效果相同。最大的优点在于,出现新的子类以及新增方法时,可以不对代码进行修改,使用父类对象进行统一操作即可。

由于使用父类对象进行统一操作,当拥有多个子类时,就涉及到如何确定具体代表的子类对象的问题。首先要了解方法调用绑定。

方法调用以及方法主体关联的方式称为绑定程序默认使用的方式是前期绑定,这种方式是指在程序运行前进行绑定。这种方式存在的问题是,如果编译器中只有一个父类引用,会导致无法确定调用哪个方法。解决方式是使用后期绑定,也就是在运行时根据对象类型进行绑定。这种方式依赖于一种方法调用机制来调用正确的方法体,而编译器是无法知道对象类型的。而这种机制在不同语言中实现有所区别。

java 中除了 static 以及 final 方法以外,其它方法都是后期绑定。final 可以关闭动态绑定以生成更有效的代码。

静态方法不具有多态性,因此子类并不能将父类中的静态方法覆盖。覆盖后依然会调用父类中的方法。

基类构造方法在子类构造过程中被调用,而且逐层向上调用,使得所有父类构造方法都能得到调用。这样做的原因在于,构造方法需要检查对象是否被正确地构建。然而子类只能访问自己的成员,无法访问父类的成员,只有父类的构造方法才有权限对本类的元素进行初始化操作。所以如果不是所有的构造方法都被调用,就会存在元素没有被初始化的问题,也就无法得到完整的对象

如果某个对象依赖于其它对象,则销毁顺序与初始化顺序相反,即先销毁子类对象,再销毁父类对象。以此保证能够正确访问到子类对象。

初始化实际过程:

步骤 内容
1 将分配给对象的空间初始化为二进制0
2 调用父类构造方法
3 按声明顺序调用成员初始化方法
4 调用子类构造方法主体

 

构造方法内能够安全调用的方法是父类中的 final 与 private 方法。

协变返回类型:子类中被覆盖的方法可以返回基类方法的返回类型的子类型。

 

 

你可能感兴趣的:(阅读笔记)