8.1再论向上转型
1、多态通过分离做什么和怎么做,从另一角度将接口和实现分离开来。
2、“封装”通过合并特征和行为来创建新的的数据类型。“实现隐藏”则通过细节“私有化”把接口和实现分离开来。
3、继承允许将对象视为它自己本身的类型或其他类型来加以处理。
8.2转机
8.2.1方法调用绑定
1、将一个方法调用同一个方法主体关联起来被称作绑定,若在程序执行前进行绑定(如果有的话,由编译器和连接程序实现),叫做前期绑定。
2、后期绑定也叫做动态绑定或运行时绑定。编译器一直不知道对象的类型,但是方法调用机制能找到正确的方法,并加以调用。 3、java中除了static方法和final方法(private方法属于finla方法)之外,其他所有的方法都是后期绑定。
4、为什么要将某个方法声明为final呢?
(1)防止其他人覆盖该方法。
(2)这样做可以有效的“关闭”动态绑定,或者说,告诉编译器不需要对其进行动态绑定。
8.2.2产生正确的行为
8.2.3可扩展性
8.2.4缺陷:“覆盖”私有方法
1、private方法被自动认为是final方法,而且对导出类是屏蔽的。
2、只有非private才能可以被覆盖。
8.2.5缺陷:域与静态方法
1、只有普通的方法调用可以是多态的。例如:如果你要直接访问某个域,这个访问将在编译期进行解析。
2、如果某个方法是静态的,它的行为就是不具有多态性。
8.3构造器和多态
1、构造器并不具有多态性(它们实际上是static方法,只不过该static声明是隐式的)
8.3.1构造器的调用顺序
1、基类的构造器总是在导出类的构造过程中被调用,而且按照继承层次主键向上链接,以使每个基类的构造器都能得到调用。这是因为:构造器具有一项特殊任务,检查对象是否被正确地构造。
2、只有基类的构造器才具有恰当的知识和权限来对自己的元素进行初始化,因此必须令所有构造器得到调用,否则就不可能构造完整对象。
3、复杂对象调用构造器要遵照下面的顺序
(1)调用基类构造器
(2)按顺序调用成员的初始化方法
(3)调用导出类构造器的主体
若遵循这一规则,那么就能保证所有基类成员以及当前对象的成员对象都被初始化了。
8.3.2继承与清理
1、销毁的顺序应该和初始化顺序相反。
8.3.3构造器内部的多态方法的行为
1、如果在一个构造器的内部调用正在构造的对象的某个动态绑定方法,会发生什么情况呢?
如书上的例子:调用Glyph构造器的时候,Glyph。draw()方法被子类的方法覆盖,所以实际调用的是子类的方法,单radius还没被初始化,所以radius=0
2、编写构造器时有一天有效的准则:用尽可能的方法是对象进入正常状态,如果可以的话,避免调用其他方法
8.4协变返回类型
1、她表示在导出类的被覆盖方法可以返回基类方法的返回类型的某种导出类型。
8.5用继承进行设计
1、用继承表达行为间的差异,并用字段表达状态上的变化。