我有这个程序:
public class A
{
public A(){
System.out.println("I am in A");
}
public static void main(String args[]){
B a = new B("Test");
}
}
class B extends A
{
public B(){
System.out.println("I am in B");
}
public B(String s){
this();
super();
System.out.println("I am in B as " + s);
}
}
现在为什么我不能调用this
的{{1}}构造函数来调用默认构造函数?这给了我编译时错误。
答案 0 :(得分:4)
this
和super
必须是构造函数中的第一个行。
编辑:
语言规范
8.8.7。构造函数主体
构造函数体的第一个语句可能是显式的 调用同一个类或直接的另一个构造函数 超类(§8.8.7.1)。
答案 1 :(得分:1)
this()
调用同一个类中的另一个构造函数。
super()
调用超级构造函数。如果没有显式编写super()
,编译器将隐式添加一个。{1}}。因此,您最终会两次调用super()
。
所以,两者都是不允许的。
编辑
在您的代码的上下文中:记住,super()
应始终是构造函数中的第一行。
答案 2 :(得分:1)
经过进一步反思,我的答案基本上是正确的,但缺乏一些细微差别。从本质上讲,您可以调用一次超级构造函数。这是为了确保您的超级类只构造一次。这意味着给定构造函数的第一行可以是对当前类中另一个构造函数的调用,也可以是对超类中构造函数的调用。这也意味着你只能在任何给定的构造函数中调用一次构造函数;你必须选择在当前或超级类中调用一个。这确保了在当前对象之前完全构造所有超类。
旧解释:
根本原因是必须在子类之前构造所有超类。为此,如果构造函数的第一行上没有这样的调用,Java将隐式调用super()。覆盖此行为的唯一方法是在超类中显式调用不同的构造函数。基本上,Java必须先创建层次结构才能创建。
首先放置构造函数会违反此要求,因此是非法的。
答案 3 :(得分:0)
根据Java,this()和super()应该是构造函数中的第一个语句。现在重点是我们不能同时写两个作为第一行。如果你写这个()而不是超级,不要指望super将被隐式调用。 它很简单.U没有选择在单个构造函数体中一起编写它们