构造函数和继承

在层次结构中,超类和子类可以有自己的构造函数.这就产生了一个重要问题:什么样的构造函数负责构建子类的对象呢?是超类构造函数,子类构造函数,还是两者都负责创建子类的对象?答案是:超类的构造函数构造对象的超类部分,而子类的构造函数则构造对象的子类部分.因为超类并不知晓或无权访问子类的任何元素.因此,他们的构造必须分开.前面的示例依赖于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.这个关键字有两种基本形式:第一种形式调用超类构造函数,第二种形式用于访问被子类成员隐藏的超类成员.