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

时间:2013-11-25 16:38:02

标签: java constructor this

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

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上检查了很多关于这个主题的答案,但我仍然无法理解这个问题的原因。请帮我用一些简单的例子和​​解释来说明这个错误。

2 个答案:

答案 0 :(得分:9)

如您所知,这有效:

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

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

有关详情,请查看此post,详细说明情况。

答案 1 :(得分:1)

错误告诉您问题

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

即。你必须先调用构造函数

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

这也适用于对超级

的调用
class B extends A
{
    B()
    {
        super();
        System.out.println("1");
    }
}

正在回答here

的原因