在层次结构中,超类和子类可以有自己的构造函数.这就产生了一个重要问题:什么样的构造函数负责构建子类的对象呢?是超类构造函数,子类构造函数,还是两者都负责创建子类的对象?答案是:超类的构造函数构造对象的超类部分,而子类的构造函数则构造对象的子类部分.因为超类并不知晓或无权访问子类的任何元素.因此,他们的构造必须分开.前面的示例依赖于Java自动创建的默认的构造函数,因此这并不是问题.然而,在实际应用中,多数类都有显式的构造函数,下面将看到如何处理这种情况.
当只有子类定义了构造函数时,过程很简单:只需构造子类对象即可.对象的超类部分使用默认构造函数来自动创建.
public class test2 { // @param args public static void main(String args[]) { childClass $obj = new childClass(); System.out.println($obj.publicReturnInt()); } } class childClass extends parentClass { childClass() { System.out.println("childClass init"); } } class parentClass { int publicReturnInt() { return returnInt(); } private int returnInt() { return 1; } }
输出:
childClass init 1
当超类和子类都定义了构造函数时,这个过程就有些复杂了.因为超类和子类的构造函数都要执行.在这种情况下,就必须使用另一个Java关键字super.这个关键字有两种基本形式:第一种形式调用超类构造函数,第二种形式用于访问被子类成员隐藏的超类成员.