《Java编程思想》 第八章 多态 记录

  • 多态通过分离做什么和怎么做,从另一个角度将接口和实现分离开来。多态不但能够改善代码的组织结构和可读性,还能够创建可扩展的程序,即无论在项目最初创建时还是在需要添加新功能时都可以“生长”的程序。
  • “封装”通过合并特征和行为来创建新的数据类型。“实现隐藏”则通过将细节“私有化”把接口和实现分离开来。
  • 多态的作用则是消除类型之间的耦合关系。
  • 继承允许将对象视为它自己本身的类型或其基类型来加以处理。这种能力极为重要,因为他允许将多种类型(从同一基类导出的)视为同一类型来处理,而同一份代码也就可以毫无差别地运行在这些不同类型之上。多态方法调用允许一种类型表现出与其他相似类型之间的区别,只要他们都是从同一基类导出而来的。这种区别时根据方法行为的不同而表现出来的,虽然这些方法都可以通过同一个基类来调用。

1. 再论向上转型

  • 对象既可以作为它自己本身的类型使用,也可以作为它的基类型使用。而这种把对某个对象的引用视为对其基类型的引用的做法被称作向上转型。

2. 转机

  • 将一个方法调用同一个方法主体关联起来被称作绑定。若在程序执行前进行绑定(如果有的话,有编译期和连接程序实现),叫做前期绑定。
  • 后期绑定(也叫做动态绑定和运行时绑定)为在运行时根据对象的类型进行绑定。
  • Java中除了static方法和final方法(private方法属于final方法)之外,其他所有的方法都是后期绑定。通常情况下,它会自动发生。
  • 某个方法声明为final,可以防止其他人覆盖该方法。这样做可以有效地“关闭”动态绑定,或者说,告诉编译器不需对其进行动态绑定。
  • 在编译时,编译器不需要获得任何特殊信息就能进行正确的调用。
  • 多态是一项让程序员“将改变的事物与未变的事物分离开来”的重要技术。
  • 只有普通的方法调用可以是多态的。
  • 如果某个方法是静态的,他的行为就不具有多态性。静态方法是与类,而并非与单个的对象相关联的。

3. 构造器和多态

  • 基类的构造器总是在导出类的构造过程中被调用,而且按照继承层次逐渐向上链接,以使每个基类的构造器都能得到调用。这样做是有意义的,因为构造器具有一项特殊任务:检查对象是否被正确的构造。导出类只能访问他自己的成员,不能访问基类中的成员(基类成员通常是private类型)。只有基类的构造器才具有恰当的知识和权限来对自己的元素进行初始化。因此必须所有的构造器都得到调用,否则就不可能正确的构造完整对象。这正是编译器为什么要强制每个导出类部分都必须调用构造器的原因。在导出类的构造器主体中,如果没有明确指明调用某个基类构造器,它就会“默默”地调用默认构造器。如果不存在默认构造器,编译期就会报错(若某个类没有构造器,编译器会自动合成出一个默认构造器)。
  • 对象调用的构造器按照下面的顺序;
  1. 调用基类构造器,这个步骤会不断的反复递归下去,首先是构造这种层次结构的根,然后是下一层导出类,等等,直到最底层的导出类
  2. 按声明顺序调用成员的初始化方法
  3. 调用导出类构造器的主体
  • 初始化的实际过程是:
  1. 在其他任何事物发生之前,将分配给对象的存储空间初始化成二进制的零
  2. 调用基类构造器
  3. 按照声明的顺序调用成员的初始化方法
  4. 调用导出类的构造主体
  • 对象销毁的顺序和初始化顺序相反,对于字段,则意味着与声明的顺序相反。

4. 协变返回类型

  • 表示在导出类中的被覆盖方法,可以返回基类方法的返回类型的某种导出类型

5. 用继承进行设计

  • 用继承表达行为间的差异,并用字段表达状态上的变化
  • 在Java中,所有转型都会得到检查!所有即使我们只能进行一次普通的加括弧形式的类型转换,在进入运行期时仍然会对其进行检查,以便保证它的确是我们希望的那种类型。如果不是,就会得到一个ClassCastException(类转型异常)。这种在运行期间对类型进行检查的行为称作“运行时类型识别”(RTTI)。
  • RTTI的内容不仅仅包括转型处理。他还提供一种方法,是你可以在试图向下转型之前,查看你所要处理的类型。
发布了57 篇原创文章 · 获赞 11 · 访问量 9889

猜你喜欢

转载自blog.csdn.net/qq_36160730/article/details/96185875