2014-11-24 89 views
-1
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 

谁能告诉这背后的原因是什么?

+1

“推理”只是Java构造函数的正常行为。例如:http://java67.blogspot.com.au/2012/12/how-constructor-chaining-works-in-java.html – 2014-11-24 08:01:09

回答

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"

+0

非常感谢你解释清楚 – Abhilash 2014-11-24 09:31:26

3

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

此代码:

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

等同于:

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

如果我不想从''Abc''构造函数调用' Bb'构造函数? – Junaid 2014-11-24 07:58:50

+1

@Junaid你别无选择。超类的某些构造函数将始终被调用,如果编译器没有找到,那么您的代码将无法编译。 – Eran 2014-11-24 08:00:03

+1

@Junaid这是有道理的,因为子类包含其超类的所有成员,因此它必须初始化它们(通过调用超类构造函数)。 – Eran 2014-11-24 08:01:27

0

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

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

Refer this link for more explanation

相关问题