4

我有这个程序:

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构造函数B来调用默认构造函数?这给了我编译时错误。

4

4 回答 4

4

this并且super必须是构造函数中的第一行。

编辑:

语言规范

8.8.7。构造函数体

构造函数主体的第一条语句可能是对同一类或直接超类的另一个构造函数的显式调用(第 8.8.7.1 节)。

于 2012-06-06T18:33:34.620 回答
1

this()调用同一类中的另一个构造函数。

super()调用超级构造函数super()。如果显式写入 no,编译器将隐式添加一个。因此,您最终会调用super()两次。

所以,两者都是不允许的。


编辑

在您的代码上下文中:记住,super()应该始终是构造函数的第一行。

于 2012-06-06T18:27:29.380 回答
1

经过进一步思考,我的回答如下所示基本上是正确的,但缺乏一些细微差别。本质上,您可以调用一次超级构造函数。这是为了确保您的超类只构造一次。这意味着给定构造函数的第一行可以是对当前类中的另一个构造函数的调用,也可以是对超类中的构造函数的调用。这也意味着您只能在任何给定的构造函数中调用另一个构造函数一次;您必须选择调用当前或超类中的一个。这确保了所有超类将在当前对象之前完全构造。

老解释:

根本原因是必须先构造所有超类,然后才能构造子类。为此,如果构造函数的第一行不存在这样的调用,Java 将隐式调用 super()。覆盖此行为的唯一方法是在您的超类中显式调用不同的构造函数。基本上,Java 必须先创建层次结构,然后才能创建。

将您的构造函数放在首位违反了此要求,因此是非法的。

于 2012-06-06T18:31:27.117 回答
0

根据 Java 的 this() 和 super() 应该是构造函数中的第一条语句。现在关键是我们不能同时写这两个作为第一行。如果你写 this() 而不是 super,不要期望 super 会是隐式调用。它就像它一样简单。你没有选择将它们一起写在一个构造函数体中

于 2013-06-27T17:17:01.897 回答