在java中调用构造函数

时间:2012-12-10 16:39:41

标签: java object constructor superclass

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 。请帮我弄清楚,我是否误解了上一段。 ?

2 个答案:

答案 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}}

答案 1 :(得分:-3)

以下代码将打印ABC

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