【问题标题】:Constructor call must be the first statement in a constructor [duplicate]构造函数调用必须是构造函数中的第一条语句[重复]
【发布时间】:2013-12-10 11:40:31
【问题描述】:

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

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 上查看了很多关于此主题的答案,但我仍然无法理解其中的原因。请通过一些简单的示例和解释帮助我弄清楚这个错误。

【问题讨论】:

  • 原因是“构造函数调用必须是构造函数中的第一条语句”。所以在构造函数中,对this(...) 的调用必须是第一条指令。如果它在System.out.println("1") 之后,则不是第一条指令,而是第二条指令。
  • @OldProgrammer 我已经看到了那些答案,但仍然无法理解这就是我再次在这里问它的原因。再次询问是否违法?
  • 因为这就是语言开发人员设计它的方式。这也是有道理的。这可以确保在执行派生类的构造函数中的任何其他语句之前,父类的任何属性/行为都处于正确的状态。
  • 你不应该再问同样的问题,除非新问题明显不同。

标签: java constructor this


【解决方案1】:

如你所知,这是可行的:

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

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

更多信息,请看这个post,它详细解释了情况。

【讨论】:

  • 是的,我知道它的规则。但是我想知道如果我最后写它为什么这是无效的?我必须知道,因为在印度的面试中,我的面试官会问这样的问题
  • 正如我上面所说的:如果你在最后留下对this() 的调用,你会冒在上面的行中引用尚未初始化的超类中的状态的风险。显示的代码中不会出现这种情况,但一般情况下编译器无法确定,所以是不允许的
  • @rani 有什么困惑?他回答了你的问题。语言规范是这样说的,所以一定是这样。
  • 好吧,我的理解是“它是java语言的规则,而且它说“应该在初始化当前对象之前初始化父状态。”,这个理解是否足以告诉我面试官会问这样的问题吗?
  • @rani 如果你真的理解这些概念,你就能自己弄清楚。
【解决方案2】:

错误告诉你问题

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");
}

这也适用于对 super 的调用

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

正在回答的原因here

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2020-07-12
  • 2012-12-13
  • 2017-01-01
  • 2016-11-26
  • 2011-03-24
  • 2015-07-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多