多态
面向对象的程序设计语言的特征,抽象、继承、多态。
多态分离“做什么”和“怎么做”,将接口与实现分离。作用:不但能够改善代码的组织结构和可读性,还能够创建“可扩展的”程序。(动态邦定,后期邦定,运行时邦定)
1. 向上转型
前面的章节已经介绍,继承自基类的子类可以自动转化为基类的对象,可以接受所有发送给基类的消息。
2. 忘记对象类型
在编写方法时可以完全忘记对象的类型,而采用基类的类型作为参数。其会自动的认出传入的是什么类型的对象,从而调用相应的方法。
3. 方法调用绑定
方法绑定就是将一个方法调用和一个方法主体关联起来。
若在程序执行前进行邦定叫做前期绑定,C语言的编译器采用这种方法
在运行时根据对象的类型进行绑定叫做后期绑定,Java除了static和final方法外其他方法都是后期绑定。
4. 产生正确的行为
Shape的例子,编译器能做出正确的判断知道应该调用那个类型的方法。
5. Private方法的重载
只有非private方法才可以被重载,在导出中虽然可以写一个和基类的private方法同名的方法,但其并不是基类方法的重载而是子类一个全新的方法。
6. 抽象类和抽象方法
使用abstract关键字修饰,包含抽象方法的类必为抽象类,导出类必须实现抽象的方法。抽象类不能产生对象。
7. 构造器和多态
构造器的初始化顺序,递归的调用基类的构造器,然后按声明顺序初始化导出类的成员,然后是导出类的构造器。
8. 继承与清除
与初始化的顺序刚好相反。清除时子类的dispose方法要显式的调用基类的dispose方法,super.dispose();
9. 构造器内部的多态行为
构造器初始化的顺序,第一先将所有分配给对象的初始化空间置为二进制的零。构造器中调用方法可能会访问没有完全初始化的对象。
“用尽可能简单的方法是对象进入正常状态;如果可以的话,避免调用其它方法”在构造器内部唯一能够安全调用的方法是基类中的final方法。
10. 用继承进行设计
当我们使用现成类来建立新类时,首先选择“组合”,尤其是当你自己不能十分确定应该使用哪一种方式时。组合更加灵活,因为它可以动态选择类型,相反,继承在编译期间就需要知道确切的类型。
“用继承表达行为间的差异,用属性表达状态上的变化”继承重载方法
11. 向下转型
RTTI类型检测,会自动检测能否向下转型,如果不能抛出ClassCastException异常