我有三个班级:
public class A {
public A(){
System.out.println("in A");
}
}
public class B extends A{
public B(){
System.out.println("in b");
}
}
public class C extends B{
public C(){
System.out.println("in C");
}
}
现在我真的不确定构造函数调用是如何工作的。
如果我实例化C c= new C();
,则以什么顺序(以及为什么该顺序)调用构造函数。
如果我实例化C类,那么它不应该只检查C类是否有任何构造函数,如果有,它应该使用它吗?
为什么输出 - >在A In B in C?
只有当它在自己的类中找不到构造函数时才会在层次结构中出现?或者每次都会隐式调用超类的构造函数?
答案 0 :(得分:3)
默认情况下,从基类构造函数调用超级构造函数。
你应该用super调用超类构造函数的唯一情况是你需要显式地将参数传递给超类构造函数本身。
所以答案是肯定的,他们都被称为。顺序是从层次结构中最上层的类到基类,所以:A,B,C。
答案 1 :(得分:2)
始终调用默认构造函数,并从上到下调用 - 从最顶层的超类到最低的基类。
请注意,super(...)
调用仅对参数化构造函数是必需的。在你的情况下你没有任何东西,所以默认会自动调用。
答案 2 :(得分:1)
当调用构造函数时,它首先调用super()
,因此尽管堆栈跟踪将显示:C-> B-> A,实际上A将首先被调用,C将被最后调用,因此打印将显示:
in A
in B
in C
答案 3 :(得分:0)
super()
是隐式的,如果没有声明构造函数,则为默认构造函数。
构造函数向上运行:
C calls B, B calls A, A calls to Object that does nothing and return to A, then outputs and return the flow to B, that outputs and return to C that outputs.
答案 4 :(得分:0)
默认情况下会调用超级构造函数。它在派生类的构造函数中的任何代码行之前执行。因此,如果你调用新的C(),则运行A的构造函数,然后运行B,然后运行C中的任何内容。
答案 5 :(得分:0)
是的,当你没有定义任何构造函数时,它将隐式创建默认构造并调用它。现在,当你扩展任何类,然后像C类一样,它使用它的构造函数,但它没有发现显式调用超类,因此编译器隐式调用超类构造函数。这就是为什么当我们调用超类构造函数时,该语句总是首先像这样
public C(){
super();
}
如果在调用超类构造函数之前编写任何语句,则会出现错误
答案 6 :(得分:0)
查看Java语言规范
“如果构造函数体不是以显式构造函数调用开始,并且声明的构造函数不是原始类Object的一部分,那么编译器会隐式假设构造函数体以超类构造函数调用”super();“开头。 ,调用其直接超类的构造函数,不带参数。“
http://java.sun.com/docs/books/jls/second_edition/html/classes.doc.html#41652
答案 7 :(得分:0)
A类是B的超类,B类是C的超类。这意味着A位于其中的顶部位置,其中B在C的顶部,在A旁边,C在B的底部。所以A类首先执行,然后执行B然后执行C.这就像Java中超类的优先级一样。