这段代码的结果背后的原因是什么?

时间:2014-11-24 07:53:25

标签: java inheritance

class Abc 
{
    public Abc() 
    {
        System.out.println("constructor A");
    }
}

class Bb extends Abc 
{   
    public Bb() 
    {
        super(); // Calls Abc()
        System.out.println("constructor B");
    }
}

public class X 
{
    public static void main(String args[]) 
    {
        Bb b = new Bb();
    }
}

答案是:

Constructor A
Constructor B

有人能说出这背后的原因吗?

3 个答案:

答案 0 :(得分:3)

子类的构造函数(在您的情况下为Bb)必须在执行自己的构造函数之前调用超类(Abc的构造函数)。

此代码:

    public Bb() {
        System.out.println("constructor B");
    }

相当于:

    public Bb() {
        super (); // calls the super-class constructor
        System.out.println("constructor B");
    }

答案 1 :(得分:1)

当调用派生类的构造函数时,它必须首先构造其超类。如果没有明确地完成(通过指定super,有或没有任何参数),则使用无参数构造函数隐式完成。换句话说,您的代码相当于:

class Abc {
    public Abc() {
        System.out.println("constructor A");
    }
}

class Bb extends Abc {   
    public Bb() {
        super(); // Calls Abc()
        System.out.println("constructor B");
    }
}

public class X {
    public static void main(String args[]) {
        Bb b = new Bb();
    }
}

以这种方式表达后,很容易看出打印"constructor A"的原因,然后"constructor B"

答案 2 :(得分:0)

使用super(),调用超类无参数构造函数。使用super(参数列表),将调用具有匹配参数列表的超类构造函数。

现在,如果您查看代码,您将得到答案。

Refer this link for more explanation