2015-09-04 53 views
-5

为什么输出只是"AB8",为什么"5"不能打印?!!Java中的继承..为什么它不在此代码中打印“5”?

有两个类。其中一个从另一个延伸。 当我从子类创建一个对象时,它给了我这个输出"AB8", ,我首先想到它将是"A5B8"。所以我会理解为什么?!

public class A { 
    public A(){ 
     System.out.println("A"); 
    } 
    public A(int i){ 
     this(); 
     System.out.println(i); 
    } 
} 



public class B extends A{ 
    public B(){ 
     System.out.println("B"); 
    } 
    public B(int i){ 
     this(); 
     System.out.println(i+3); 
    } 
} 



public class Test { 

    public static void main(String[] args) { 
     new B(5); 
    } 
} 
+0

为什么呢?你只会在带有1个参数的A构造函数中打印5,这个参数永远不会被调用。 – MattPutnam

+0

如果你使用任何类似eclipse的IDE,那么在'new B(5);'放一个调试点并进行调试。这将清除你的混淆。 – Bikku

回答

1

-Parent构造函数的调用

在这种情况下,A()被调用,它打印出 “A”。

- 儿童构造函数被调用

在这种情况下,B(INT)被调用,它打印出“B”从呼叫到这个() 然后5 + 3被印刷,这是8

它确实有助于通过代码走,由线OP线...

0

当你调用new B(5);,流量:new A()(因为A是B的超类),new B()(因为你叫this()),最后System.out.println(i+3);

1

在B的构造函数B(int i)中,可以调用this(),它是B的无参数构造函数。这将隐式调用A的无参数构造函数,但它永远不会调用A(int i)

使用super关键字显式调用A的构造函数是一种很好的做法。控制流程变得更清晰。

public class A { 
    public A(){ 
     System.out.println("A"); 
    } 
    public A(int i){ 
     this(); // call the parameterless constructor of A 
     System.out.println(i); 
    } 
} 

public class B extends A{ 
    public B(){ 
     super(); // call the parameterless constructor of A 
     System.out.println("B"); 
    } 
    public B(int i){ 
     this(); // call the parameterless constructor of B 
     System.out.println(i+3); 
    } 
} 
相关问题