这个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"); };
}
答案 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和测试。这是正确的。