关于Constructor call must be the first statement in a constructor的问题

今天面试碰到一道题,是关于Constructor call must be the first statement in a constructor的问题的。

题目是这样的

public class TestA {
public TestA(){
System.out.println("A");
}
}
public class TestB extends TestA {

protected TestB(Object a){
System.out.println("B");
}
public TestB(){
super();
this.TestB(new Object());
}
}
public class Test {
public static void main(String[] ars)
{
new TestB();
}
}

super()和this.TestB(new Object());不能共存,否则编译时会报异常,换句话说就是super()和this.TestB(new Object());都必须在方法(构造方法)的第一行。

因此要成功编译上面的代码,必须要把TestB(Object a)这个方法修改成非构造方法,比如在前面加上void。

要了解更多请参考http://java.syntaxerrors.info/index.php?title=Constructor_call_must_be_the_first_statement_in_a_constructor
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 这是Java编程语言中的一个错误提示,意思是在构造函数体中调用'super()'必须是第一条语句。这是因为在Java中,每个类都有一个父类,如果你在子类的构造函数中调用'super()',就是在调用父类的构造函数,而且必须在子类构造函数中的第一条语句中调用。这是因为父类的构造函数必须在子类构造函数之前被调用,以确保父类的初始化完成。如果你在构造函数体中的其他地方调用'super()',就会导致编译错误。 ### 回答2: Java中的“super()”是一个使用在类初始化时的特殊关键字,表示调用父类的构造函数。在Java的构造函数中,如果需要使用super()来调用父类的构造函数时,必须将其放在构造函数的第一行,否则编译器将会报错,提示“call to 'super()' must be first statement in constructor body”。 这个错误的原因是,如果在调用父类的构造函数之前,进行了其他的初始化操作或者赋值操作,这些操作可能会影响到父类的构造函数的执行,从而导致程序出现意想不到的错误。 因此,如果需要在子类的构造函数中调用父类的构造函数,就必须将其放在构造函数的第一行。如果在子类的构造函数中不调用父类的构造函数,编译器会默认调用父类的无参构造函数。 需要注意的是,在Java中,如果父类没有定义无参构造函数,子类需要手动调用父类的有参构造函数。此时,需要使用super()来调用父类的有参构造函数,并且需要按照父类的构造函数参数列表,传递参数给父类的构造函数。 总的来说,“call to 'super()' must be first statement in constructor body”这个错误提示是为了让开发者注意Java中的构造函数调用规则,保证程序的安全性和正确性。 ### 回答3: 在Java中,当我们想要在子类的构造函数中调用父类的构造函数时,需要使用关键字"super"。使用"super"的语法是在构造函数的第一行调用,这意味着调用"super()"必须是构造函数中的第一个语句。 这是为什么呢?因为在创建子类对象时,首先要初始化父类中的所有成员变量和方法。如果子类中的某些内容需要依赖于父类中的状态或操作,必须确保父类的构造函数被正确地调用并完成初始化。如果在子类中的构造函数不是首先调用"super",则会导致父类中的成员变量没有机会被初始化,这将会导致不可预知的问题。 例如,如果我们有一个父类"Animal"和一个子类"Cat",如果我们在"Cat"的构造函数中使用"super()"不作为第一条语句,如果"Animal"中有一些成员变量需要初始化,那些成员变量可能是不好的初始化,因为在构造函数调用之前,"Animal"的成员变量都是默认的值。这样就可能会导致错误或不可预测的行为。 因此,我们必须在每个子类构造函数中的第一条语句中调用父类的构造函数,以确保父类中的所有必要初始化都已完成。这就是call to 'super()'必须在构造函数主体中第一条语句的原因。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值