多态
9.2转机
9.2.1方法调用绑定
Java中除了
static
和final
方法(private
方法也是隐式的final
)外,其他所有方法都是后期绑定。
9.2.5陷阱:属性与静态方法
只有普通的方法调用可以是多态的。例如,如果直接访问一个属性,该访问会在编译时解析。如果一个方法是静态的,它的行为就不具有多态性。
9.3构造器和多态
9.3.1构造器调用顺序
在派生类的构造过程中总会调用基类的构造器。初始化会自动按继承层次结构上移,因此每个基类的构造器都会被调用。这么做是有意义的,因为构造器有着特殊的任务:检查对象是否被正确地构造。由于属性通常声明为
private
,必须假定派生类只能访问自己的成员而不能访问基类的成员。只有基类的构造器拥有恰当的知识和权限来初始化自身的元素。因此,必须得调用所有构造器;否则,就不能构造完整的对象。
在构造器中必须确保所有的成员都已经构建完。唯一能保证这点的方法就是首先调用基类的构造器。接着,在派生类的构造器中,所有可以访问的基类成员都已经初始化。
9.3.2继承和清理
销毁的顺序应该与初始化的顺序相反,以防一个对象依赖另一个对象。对于属性来说,就意味着与声明的顺序相反(因为属性是按照声明的顺序初始化的)。对于基类,首先进行派生类的清理工作,然后才是基类的清理。这是因为派生类的清理可能调用基类的一些方法,所以基类组件这时得存活,不能过早地被销毁。
一旦某个成员对象被其它一个或多个对象共享时,问题就变得复杂了,可以使用引用计数来跟踪仍然访问着共享对象的对象数量。
9.4协变返回类型
派生类的被重写方法可以返回基类方法返回类型的派生类型。