class A {
A() {
System.out.print("A");
}
}
class B extends A {
B() {
System.out.print("B");
}
}
class C extends B {
C() {
System.out.print("C");
}
}
public class My extends C {
My(){
super();
}
public static void main(String[] args) {
My m = new My();
}
}
问题从一个面试问题开始(当用Java创建对象时会发生什么?)
并且回答是......
调用派生程度最大的类的构造函数。 第一个 构造函数所做的事就是调用consctructor 超即可。这个过程一直持续到构造者为止 调用java.lang.Object,因为java.lang.Object是其基类 java中的所有对象。在执行构造函数的主体之前, 所有实例变量初始化器和初始化块都是 执行。然后执行构造函数的主体。 因此, 基类的构造函数首先完成,构造函数完成 大多数派生类最后完成。
所以,根据上面的陈述,答案应该是 ABCC ,但它只显示 ABC 。虽然,当我在派生构造函数中评论super()
时。然后,输出 ABC 。请帮我弄清楚,我是否误解了上一段。 ?
答案 0 :(得分:5)
不,答案是 ABC
My m = new My();
上面的第一个调用My class
,然后超级调用它的超类即C Class',然后超级调用'B Class is made, then a super call to
'A Class' , then a Super call to
'java.lang.Object中'as all Objects extend
java.lang.Object`。
因此答案是 ABC
你真的不需要明确地调用super()
中的My Class
,因为它包含在编译器中,除非您调用{ {1}}
答案 1 :(得分:-3)
以下代码将打印ABC
要调用超类的构造函数,如果没有显式调用super()
构造函数,编译器将在每个扩展类的类中隐式调用super
。