java 3中的奇怪输出

时间:2016-01-26 18:17:35

标签: java

这个java程序打印出12和"测试"。但是,我无法弄清楚为什么打印12个。

 // Filename: MyClass.java
public class MyClass {
    public static void main(String[] args) {
        B b = new B("Test");
    }
}
class A {
    A() { this("1", "2"); }
    A(String s, String t) { this(s + t); }
    A(String s) { System.out.println(s); }
}
class B extends A {
    B(String s) { System.out.println(s); }
    B(String s, String t) { this(t + s + "3"); }
    B() { super("4"); };
}

2 个答案:

答案 0 :(得分:4)

每当调用扩展类的构造函数时,如果您不自己调用super()(或super()带参数),编译器会在执行任何其他操作之前自动调用super(someParameter)

所以

class B extends A {
    B(String s) { System.out.println(s); }
}

成为

class B extends A {
    B(String s) { 
        super();
        System.out.println(s);
    }
}

这总是发生。在您的情况下,调用构造函数A() { this("1", "2"); },现在调用A(String s, String t) { this(s + t); },最后调用A(String s) { System.out.println(s); }

记住这一点,应该清楚A() { this("1", "2"); }负责打印12

答案 1 :(得分:0)

嘿,没有什么不对,有超级构造函数的隐式调用。 因为类B在创建类B实例时扩展了类A,所以它也会调用类A的构造函数 - 在本例中它是类A的默认构造函数,它再次调用类构造函数“A(String s,String t)”并再次调用“ A(String s)“。所以,它输出为12和测试。这是正确的。