关于java:构造函数调用必须是构造函数中的第一个语句

Constructor call must be the first statement in a constructor

本问题已经有最佳答案,请猛点这里访问。

如果我将this(1);移到构造函数的最后一行,我不理解下面的代码为什么显示错误Constructor call must be the first statement in a constructor

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
package learn.basic.corejava;

public class A {
    int x,y;

    A()
    {    
        // this(1);// ->> works fine if written here
        System.out.println("1");
        this(1);  //Error: Constructor call must be the first statement in a constructor
    }

    A(int a)
    {
        System.out.println("2");
    }

    public static void main(String[] args) {
        A obj1=new A(2);  
    }  
}

我在stackoverflow上查阅了很多关于这个主题的答案,但是我仍然不明白为什么会这样。请帮助我用一些简单的例子和解释来澄清这个错误。


如你所知,这是可行的:

1
2
3
4
A() {
      this(1);
      System.out.println("1");
}

为什么?因为它是Java语言规范中的语言规则:对同一个类中的另一个构造函数(EDCOX1,0个部分)或超类中的构造函数(使用EDCOX1(1))必须调用第一行。这是一种确保在初始化当前对象之前初始化父对象状态的方法。

有关更多信息,请看这篇文章,它详细解释了这种情况。


这个错误告诉你问题所在

1
2
3
4
5
A()
{    
      System.out.println("1");
      this(1);  //Error: Constructor call must be the first statement in a constructor
}

即必须先调用构造函数

1
2
3
4
5
A()
{
      this(1);
      System.out.println("1");
}

这也适用于对super的调用

1
2
3
4
5
6
7
8
class B extends A
{
    B()
    {
        super();
        System.out.println("1");
    }
}

原因在这里回答