多态

Posted by Xsp on January 21, 2018

《think in java》 第8章

多态通过分离做什么和怎么做,分离接口和实现。 多态的作用是消除类型之间的耦合关系。 也被称为动态绑定、后期绑定、运行时绑定。

向上转型

把对某个对象的引用视为对其基类型的引用。可能会缩小接口,但不会比基类接口更窄。

绑定

绑定,将方法调用同一个方法主体关联起来。

前期绑定,在程序执行前根据编译时类型绑定,是面向过程的语言中默认的绑定方式。调用开销较小,如C语言只有前期绑定这种方法调用。

后期绑定,是指在运行时根据对象的类型进行绑定,又叫动态绑定或运行时绑定。实现后期绑定,需要某种机制支持(在对象中安置某种“类型信息”),以便在运行时能判断对象的类型,调用开销比前期绑定大。

Java中的static方法和final方法(private属于final方法?)属于前期绑定,子类无法重写final方法,成员变量(包括静态及非静态)也属于前期绑定。除了static方法和final方法(private属于final方法)之外的其他方法属于后期绑定。

思考:好处,如一个方法可以直接用基类作形参,避免用子类作形参需要多写几个方法,但是子类在向上转型后,调用的方法仍然是子类自身的。

可扩展

大多数方法只与基类接口通信。

私有方法

private 方法自动认为是final的。对导出类屏蔽。

域和静态方法

域?。。变量

构造器

构造器是static的,只不过该static是隐式声明。

调用构造器遵循的顺序:

  • 将分配给对象的存储空间初始化为0
  • 调用基类构造器
  • 按照声明顺序调用成员的初始化方法
  • 调用导出类构造器

编写构造器的原则:以尽可能简单的方法使对象进入正常状态,如果可以的话,避免调用其他方法。

协变返回类型

Java SE5新增。在导出类中的被覆盖方法可以返回基类方法的返回类型的某种导出类型。这个暂不清楚用处?

用继承进行设计

组合 有时候相对于 继承 会更加灵活,可以 动态选择类型 。

纯继承与扩展

“is-a”关系,导出类和基类有相同的接口,是一种纯替代,导出类可以替代基类。

“is-like-a”,像是基类,导出类和基类有相同的基本接口,同时也有扩展方法。但是此时向上转型时会无法调用扩展方法。

向下转型和运行时类型检查

“is-like-a” 向上转型后,可以通过再向下转型来访问一些扩展方法。