第八章 多态

来源:互联网 发布:it中文网 编辑:程序博客网 时间:2024/05/29 09:30

多态是继数据抽象和继承之后的第三种基本特征。

继承允许将对象视为自身的类型或基类的类型来加以处理。多态方法调用允许一种类型表现出与其他相似类型之间的区别,消除类型之间的耦合性。

多态——动态绑定,后期绑定,运行时绑定

8.1向上转型

把对某个对象的引用,视为对其基类型的引用。

8.2 转机

将一个方法调用同其(该方法)主体关联起来,称作绑定。

java中除了static、final方法(private属于final)之外,其他所有方法都是后期绑定。通常情况下,后期绑定会自动发生。

将方法定义为final,防止了覆盖该方法,并且关闭了自动后期绑定。

发送消息给某个对象,让该对象去判定应该做什么事情,后期绑定机制。

多态让程序员将改变的事物与未变的事物分离开来。

Notice

[1]   注意private方法默认是final,对导出类(子类)也是不可见的。虽然在导出类中定义与private方法名相同的方法不会报错,但默认是一个新的方法,不存在覆盖和多态。因此最好不要重名。

[2]   域中,不存在多态,即对于成员变量的访问不存在多态问题。

[3]   静态方法也不存在多态,静态方法属于类,而非某个对象。

 

8.3 构造器和多态

1. 构造器的调用顺序:

[1]   将分配给对象的存储空间初始化为二进制的0(最开始的一步)

[2]   调用基类的构造器,直到最基类,(先执行其成员变量的初始化)再执行构造函数;反复递归到最底层导出类。

[3]   按声明顺序调用成员函数的初始化方法

[4]   调用导出类构造器的主体。

2. 销毁的顺序应该与初始化顺序相反,防止对象之间存在依赖关系。

3. 通过引用计数,来跟踪仍旧访问共享对象的对象数量。

在构造器中,最好不要调用其他方法,或者调用final private方法,无法被覆盖的;要尽量保证初始化简单进行。

 

8.4 协变返回类型

导出类中被覆盖(override)的方法,可以返回基类方法的返回类型的某种导出类型。

基类中:A f(){}

导出类中:@Override B f(){}  // B是A的导出类。

 

8.5 用继承进行设计

1. 纯继承,导出类中不会添加新方法,is-a关系

2. 通常比较常用的是is-like-a关系,导出类会添加新方法。

3. 向下转型和运行时类型识别问题,java中所有转型都会检查。如果不是合理的转型,会抛出ClassCastException。

编译期间检查(只看变量本身的类型,编译器不报错),运行时类型检查(是否是需要的类型,执行时抛出异常)

0 0