考虑继承时值得注意的几点
构造方法链
在任何情况下,构造一个类的实例时,将会调用沿着继承链的所有父类的构造方法。如果父类继承自其他类,那么父类构造方法又会在完成自己的任务之前,调用它自己的父类的构造方法。这个过程持续到沿着这个继承体系结构的最后一个构造方法被调用为止。这就是构造方法链。
例如下面的代码:
public class Faculty extends Employee { public static void main(String[] args){ new Faculty(); } public Faculty() { System.out .println("(4)Performs Faculty's tasks"); } } class Employee extends Person { public Employee() { this("(2) Invoke Employee's overloaded constructor"); System.out.println("(3) {erforms Employee's tasks "); } public Employee(String s) { System.out.println(s); } } class Person { public Person() { System.out.println("(1) Performs Person's tasks"); } }
输出:
(1) Performs Person's tasks (2) Invoke Employee's overloaded constructor (3) Performs Employee's tasks (4) Performs Faculty's tasks
在第3行,new Faculty()调用Faculty的无参构造方法。由于Faculty是Employee的子类,所以,在Faculty构造方法中的所有语句执行之前,先调用Employee的无参构造方法。Employee的无参构造方法调用Employee的第二构造方法(第12行)。由于Employee是Person的子类,所以,在Employee的第二个构造方法中所有语句执行之前,先调用Person的无参构造方法。
覆盖方法
子类从父类中继承方法,有时,子类而要修改父类中定义的方法的实现,这称做方法覆盖。
GeometricObject类中的toString方法返回表示几何对象的字符串。这个方法可以被覆盖,返回表示圆的字符串。为了覆盖它,如下代码:
public class Circle extends GeometricObject { public String toString() { return super.toString() + "\n radius is " + radius; } }
toString()方法在GeometricObject类中定义,在Circle类中修改。在这两个类中定义的该方法都可以在Circle类中使用。要在Circle类中调用定义在GeometricObject中的toString方法,使用super.toString()(第3行)。
Circle的子类不能用语法super.super.toString()访问定义在GeometricObject中的toString方法。这是一个语法错误。
以下几点值得注意: