多态性是继数据抽象和继承之后,面向对象编程的第三个基本特征.
"可扩展"是指程序不仅在项目最初的开发阶段能"成长",面且还可以在需要添加新特性的时候"成长".
"封装"是指通过数据的特征与行为结合在一起,创建一种新的数据类型.
"隐藏实现"通过将细节设成private,完成接口与实现的分离.
将方法的调用连到方法本身被称为"绑定(binding)".当绑定发生在程序运行之前时(如果有的话由编译器
或连接器负责被称为前绑定(early binding).
后绑定的意思是要在程序运行的时候,根据对象的类型来决定该绑定哪个方法.后绑定也称为动态绑定
(dynamic binding)或运行时绑定(run-time binding)
除了static和final方法Java的所有的方法都采用后绑定.也就是说通常情况下你不必考虑是不是应该采用
后绑定--它是自动的.
只有private方法才能被覆写,因为private隐含有final.
抽象类(abstract class)为所有它派生出来的类提供公共接口.当你要想通过一个公共的接口来操控一组
类的时候就可以使用抽象类了.
抽象方法是一种尚未完成的方法,这种方法只有声明,没有正文.包含抽象方法的类被称为"抽象类",如果类
包含了一个或多个抽象的方法,那么这个类就必须被定义成abstract的.(否则编译会报错.)
编译器没法安全地创建这个新类的对象,你必须继承抽象类,而且创建这个对象,实现基类所定义的全部抽
象方法.如果你不这么做那么继承的类也就成了抽象类了,编译器会强制你用abstract关键字来声明这个类
构造函数不是多态的(实际上它们都是static方法,只是声明的时候没有直接说).
在创建派生类的过程中,基类的构造函数总是先调用的,(因为它要知道对象是不是被正确地创建了,派生类
只能访问它自己的成员,它是看不到基类的成员的.只有基类的构造函数才知道正确地初始化它的成员(因
为它们经常是private的,因此把所有的"构造函数"都调用一遍就显得非常重要).
复杂对象的构造函数的调用顺序是这样的:
1.在进行其它工作之前,分配给这个对象的内存会先被初始化为两进制的零.
2.先调用基类的构造函数.
3.数据成员按照它们声明的顺序进行初始化.
4.调用派生类的构造函数的正文.
继承的前提是你能看到基类,还能访问它的public和protected成员.
继承与清理
新类既有合成又有继承,绝大多数情况下你无须担心清理的问题:子对象都可以交由垃圾回收器去处理.如
果要自己写(如dispose())的话,要记住的第一件事就是要调用基类的dispose()方法.
一个好的构造函数应该用最少的工作量把对象的状态设置好,而且尽量地避免去调用方法.构造函数唯一能
安全调用的方法就是基类的final方法(这也适合private方法,因为它自动就是final的),它们不会被覆写,
因此不会有这种意外.
继承和合成
最好是先考虑合成,特别是当你不知道该继承哪个类的时候是.使用继承的话可能会加重设计的负担.
研究继承最好的方式,是用"纯继承"的方式创建一个类系.也就是说,派生类仅覆写基类或interface里有的
方法.可以想象成完全替代(pure substitution).完全可以用派生类的对象来替换基类的对象.
下传(downcast)必须使用一对括号作普通的类型转换.运行的时候系统会对这些转换作检查,经确保它确实
是你想要转换的类型.如不是,你会得到一个ClassCastException.这种运行时的类型检查被称为"运行时的
类型鉴别(run-time type identification 缩写为RTTI).