向上转型
把对某个对象的引用视为对其基类型的引用。
绑定:方法调用同方法主体关联起来。在程序执行前 由编译器和链接程序实现,叫前期绑定。面向过程的程序都是前期绑定。
在运行时,根据对象的类型进行绑定叫做动态绑定或后期绑定。
Java中除了static和final 都是后期绑定。
将方法生命为final:
1.可以防止别人覆盖方法
2.关闭动态绑定。可以生成更有效的代码。
确定Java中所有方法都是动态绑定之后,就可以编写只与基类打交道的代码了。发送消息给某个对象,让对象去判断应该做什么事。
缺陷
1.覆盖私有方法。基类的私有方法不会被覆盖。
2.域与静态方法。只有普通方法是可以多态的。直接访问数据,将在编译期间解析。静态方法是与类而非单个对象相关联的。
构造器与多态
构造器是隐式static的,不具有多态性。
构造器的调用顺序。导出类不能访问基类中的成员。只有基类的构造器才有权限对自己的元素进行初始化。必须令所有构造器都得到调用。
1.调用基类构造器并递归。先执行最原始的基类。
2.按顺序调用成员的初始化方法。(代码测试显示,先执行创建成员,再执行构造函数。如父类中有new ,先执行new。创建了成员,本身的构造器才可能去初始化它们)
3.调用导出构造器的主体。
继承与销毁
销毁的顺序应该和初始化顺序相反。首先对导出类进行清理,再清理基类。
成员存在一个或多个对象共享时,可以使用引用计数。
构造器内部的多态方法的行为
一个构造器的内部调用正在构造的某个动态绑定方法。在一般的方法内部,对象无法知道它是属于方法所在的那个类还是那个类的导出类。
导出类的构造器在调用基类的构造器时,由于多态,基类的方法会被导出类的同名方法覆盖。但是被覆盖的方法在对象没有被完全构造之前就被调用。
初始化的实际过程:
1.在其他任何事物发生前,将分配给对象的存储空间初始化成二进制的零。
2.调用基类构造器。
3.按顺序调用成员的初始化方法。
4.调用到处类的构造器主体。
原则:尽可能简单的使对象进入正常状态。避免调用使用其他方法。构造器内唯一安全调用的是基类中的final和private方法。这些方法不会被覆盖。
协变返回类型
协变返回类型允许将导出类返回给基类对象。
用继承进行设计
向上转型是安全的。而向下转型需要运行时类型识别(RTTI)。