在java中调用构造函数
问题从一个访谈问题开始(在Java中创建对象时会发生什么? 答案是 调用派生最多的类的构造函数第一个 构造函数所做的事情是为其 超类。此过程将持续到 调用java.lang.Object,因为java.lang.Object是 java中的所有对象。在执行构造函数主体之前, 所有实例变量初始值设定项和初始化块都是 执行。然后执行构造函数的主体因此 基类的构造函数首先完成,而 大多数派生类最后完成。在java中调用构造函数,java,object,constructor,superclass,Java,Object,Constructor,Superclass,问题从一个访谈问题开始(在Java中创建对象时会发生什么? 答案是 调用派生最多的类的构造函数第一个 构造函数所做的事情是为其 超类。此过程将持续到 调用java.lang.Object,因为java.lang.Object是 java中的所有对象。在执行构造函数主体之前, 所有实例变量初始值设定项和初始化块都是 执行。然后执行构造函数的主体因此 基类的构造函数首先完成,而 大多数派生类最后完成。 所以,根据上面的陈述,答案应该是ABCC,但它只显示ABC。不过,当我在派生构造函数中注释supe
所以,根据上面的陈述,答案应该是ABCC,但它只显示ABC。不过,当我在派生构造函数中注释
super()
时。然后,输出为ABC。请帮我弄清楚,我是不是误解了上面这段 以下代码将打印ABC
要调用超类的构造函数,编译器将在扩展该类的每个类中隐式调用
super()
,如果您没有显式调用super
construcotr。否,答案是ABC
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();
}
}
上面的首先调用我的类
,然后超级调用它的超类,即C类,然后超级调用'B类,然后超级调用
'a类',然后超级调用
'java.lang.Object',因为所有对象都扩展了
java.lang.Object`
因此答案是ABC
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();
}
}
编辑:
你不需要在你的
我的类中显式地调用super()
,因为它将被编译器包含除非你调用该类的重载构造函数,比如“this(something)”
输出应该是ABC
(你只创建了一个实例)这正是我运行代码时看到的。它应该打印ABC
。您可能需要添加一个System.out.println()
到您的main
的末尾,以确保它不仅仅是您终端的人工制品。它也会向我打印ABC,无论是否使用super()。为什么你认为你应该有两个C?我个人希望是ABC,因为super()
在每个构造函数中被隐式调用(因此在MyClass的构造函数中对super()
的调用实际上不会再次调用构造函数)。事实上,经过测试,我得到了ABC的结果。对不起!!因此,它被打错了。是ABC。所以,我的问题是为什么不ABCC??你必须为超类构造函数的每个子类调用super()
,请参考我上面的代码。@Bhavik:不,你错了。除非默认情况下使用this()调用重载构造函数,否则请返回编译器包含的@BhavikAmbani super()。您可以忽略这些超级调用,因为它们包含在编译器中。:)@GangnamStyleOverflowerr更新了我的帖子,现在请还原downVoces更改。如果构造函数中的第一件事不是this(…)
或super(…)
,那么Java会向无参数超类构造函数插入隐式super()
调用。否,必须为扩展父类的类显式调用超级构造函数。@BhavikAmbani-nah,请阅读我的答案以获得详细解释:)否,这是Java的一个基本部分-语言规范绝对保证每个构造函数将调用同一类的另一个构造函数或超类的构造函数。如果您不进行显式调用,编译器将为您插入一个。