java编程思想读书笔记----第八章 多态

在OOP中,多态是继数据抽象和继承后的第三种基本特征

1.向上转型

  对象既可以作为它自己本身的类型来用,也可以作为它的基类型来用。而这种把对某个对象的引用视为对其基类型的引用的做法称为向上转型
  Java中除了final和static方法,其他的所有方法都是后期绑定。所谓后期绑定,就是在运行时根据对象的类型进行绑定。如第七章提到的,将方法声明为final可以防止其他人覆盖该方法,更重要的是可以有效的“关闭”动态绑定。但最好是出于设计的考虑来决定是否使用final,而不是出于提高性能的考虑使用final。
  多态具有可拓展性,当添加新类的时候,并不会影响已有的类。
  缺陷:“覆盖”私有方法:基类只有非private方法才能被覆盖;尝试覆盖private方法相当于在导出类中创建一个新的同名方法而已, 编译器并不会报错。在导出类中,对于基类中的私有方法,最好采用不同的命名。如果某个方法是静态的,它就不具有多态性。

2、构造器与多态

构造器的调用顺序

  1. 调用基类构造器,这个步骤会不断地反复递归下去。
  2. 按声明顺序调用成员的初始化方法。
  3. 调用导出类构造器的主体

  调用器的调用顺序很重要。在导出类中,必须假定基类的所有成员都是有效的。在构造器内部,要保证所使用的所有成员都已经构建完毕。那么在进入导出类构造器时,在基类中可供访问的成员都已经初始化,达成这一目的的唯一方法就是调用基类构造器。同时,导出类内部的成员也在定义处尽可能初始化了(即使没有,在调用构造器前也会自动初始化)。若遵从以上原则,则可以保证所有基类成员以及当前对象的所有成员对象都被初始化了。遗憾的是,这种做法并不适用于所有情况。
  通过继承和组合的方法建立新类时,通常不必担心对象的清理问题,永远都交给垃圾回收器。如果确实遇到清理的问题,销毁的顺序要与初始化顺序相反。对于基类,先对导出类进行清理,然后才是基类。对于字段,则意味着与声明的顺序相反。
  由于多态性的原因,如果在构造器内调用某个正在构造的对象的某个动态绑定方法,则可能会造成难以发现的隐藏错误。因此,在编写构造器的时候,应该“尽量简单的使对象进入正常状态,避免调用其他方法”。
  由此可知初始化的实际过程:
  1.在其他任何事物发生前,将分配给对象的存储空间初始化成二进制的零。
  2.如前所属那样调用基类构造器。
  3.按照声明的顺序调用成员的初始化方法。
  4.调用导出类的构造主体。

  协变返回类型,它表示在导出类中的覆盖方法可以返回基类被覆盖方法的返回类型的导出类型。

你可能感兴趣的:(读书笔记,java,读书笔记)