7.1 再论向上转型
7.2 转机
Java中除了static方法和final方法(private方法属于final方法)之外,其他所有方法都是后期绑定。
class A{
public static void f(){System.out.println("A");}
}
class B extends A{
//@Override //添加Override注解会报错,说明不能override,也就没有多态性
public static void f(){System.out.println("B");}
public static void main(String[] args) {
A a = new B();
a.f(); //打印:A 说明静态方法没有多态性
}
}
7.3 抽象类和抽象方法
包含抽象方法的类叫做抽象类
如果从一个抽象类继承,并想创建该新类的对象,那么就必须为基类中的所有抽象方法提供方法定义。如果不这么做,那么导出类便也是抽象类,且编译器会强制我们用abstract关键字来限定这个类。
7.4 构造器和多态
构造器并不具有多态性(它们实际上是static方法,只不过该static声明是隐式的)。
通过组合和集成方法来创建新类时,永远不必担心对象的清理问题,自对象通常都会留给垃圾回收器进行处理。如果确实遇到清理的问题,那么必须用心为新类创建dispose()方法(这里选用此名称;读者可以提出更好的)。并且由于继承的缘故,如果我们有其他作为垃圾回收一部分的特殊清理动作,就必须在导出类中覆盖dispose()方法。当覆盖被继承类的dispose()方法时,务必记住调用基类版本的dispose()方法;否则,基类的清理动作就不会方法。
初始化的实际过程是
1)在其他任何事物发生之前,将分配给对象的存储控件初始化为二进制的零
2)调用基类构造器。
3)按照声明的顺序调用成员的初始化方法。
4)调用导出类的构造器主体
因此,在构造器内唯一能够安全调用的那些方法是基类中的final方法。
7.5 用继承进行设计
RTTI (“运行时类型识别”)