多态通过分离 做什么
和 怎么做
,从另一个角度将接口和实现分离开来。多态不但能够改善代码结构和可读性,还能创建 可拓展
的程序。
多态也称为动态绑定、后期绑定或运行时绑定。
1.再论向上绑定
- 把某个对象引用视为对其基类型的引用的做法称为
向上转型
。
2.转机
2.1 方法调用绑定
- 将一个方法调用同一个方法主体关联起来称作绑定;
- 在程序执行前进行绑定,叫做
前期绑定
。在运行时根据对象的类型进行绑定叫做后期绑定
。 - Java中除了static方法和final方法(private方法属于final方法),其他的方法都是后期绑定。
- 将一个方法声明为final可以有效的关闭
动态绑定
。
2.2 产生正确的行为
- 导出类通过覆盖基类的公用接口,来为每种特殊类型的几何形状提供单独的行为。
2.3缺陷:“覆盖”私有方法
- 只有非private方法才可以被覆盖,但是还需要密切覆盖private方法的现象,这时虽然编译器不会报错,但是也不会按照我们所期望的来执行。确切地说,在导出类中,对于基类中的private方法,最好采用不同的名字。
2.4 缺陷:域和静态方法
- 只有普通的方法调用可以是多态的。如果某个方法是静态的,它的行为就不具有多态性。
3.构造器和多态
3.1 构造器的调用顺序
- 调用基类构造器;
- 按声明顺序调用成员的初始化方法;
- 调用导出类构造器的主题。
3.2 继承与清理
- 通过组合和继承方法来创建新类似,永远不必担心对象的清理问题,子对象通常会留给gc进行处理。如果确实遇到清理问题,那么必须用心为新类创建
dispose()
方法。并且由于继承的缘故,如果我们有其他作为gc一部分的特殊清理动作,就必须再导出类中覆盖dispose()
方法。
3.3 构造器内部的多态方法的行为
-
初始化的实际过程
在其他任何事物发生之前,将分配给对象的存储空间初始化成二进制的零。
调用基类构造器。
按照什么的顺序调用成员的初始化方法。
调用导出类的构造器主体。
4.协变返回类型
- 协变返回类型表示在导出类中的被覆盖方法可以赶回基类方法的返回类型的某种导出类型。
5.用继承进行设计
使用继承会将新类纳入继承体系,这样会加重我们的设计负担。这是使用组合方式会更加灵活,因为它可以动态选择类型。相反,继承在编译时就需要知道确切类型。
继承表达行为间的差异,并用字段表达状态上的变化。
5.1 纯继承与扩展
5.2 向下转型与运行时类型识别
- 在Java语言中,所有转型都会得到检查。在进入运行期时仍然会对其进行检查,以便保证它的确是我们希望的那种类型。如果不是就会返回一个
ClassCastException
。这种在运行期间对类型进行检查的行为称作“运行时类型识别”(RTTI)。
01/06/2019 :created