3
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 中创建对象时会发生什么?)

答案是……

最派生类的构造函数被调用。构造函数做的第一件事就是调用它的超类的构造函数。这个过程一直持续到调用 java.lang.Object 的构造函数,因为 java.lang.Object 是 java 中所有对象的基类。在执行构造函数的主体之前,会执行所有实例变量初始化程序和初始化块。然后执行构造函数的主体。因此,基类的构造函数首先完成,最派生类的构造函数最后完成。

所以,根据上面的说法,答案应该是ABCC,但它只显示ABC。虽然,当我评论super()派生构造函数时。然后,输出为ABC。请帮我弄清楚,我是否误解了上面的段落。?

4

2 回答 2

6

不,答案是ABC

My m = new My(); 

上面首先调用My类,然后对其超类(即C类)进行超级调用,然后对B类进行超级调用,然后对类进行超级调用,然后对所有对象A进行超级调用扩展。java.lang.Objectjava.lang.Object

因此答案是ABC

您实际上不需要显式调用super()您的My类,因为它会被编译器包含,除非您调用该类的重载构造函数,例如this(something).

于 2012-12-10T16:43:55.190 回答
-3

下面的代码将打印ABC

要调用超类的构造函数super(),如果您没有显式调用构造函数,编译器将在扩展该类的每个类中隐式调用super

于 2012-12-10T16:42:54.257 回答