“Constructor call must be the first statement in a constructor“解决方案

在这里插入图片描述

1:
super()在第一行的原因就是: 子类有可能访问了父类对象,
比如在构造函数中使用父类对象的成员函数和变量,

在成员初始化使用了父类, 在代码块中使用了父类等,
所以为保证在子类可以访问父类对象之前要完成对父类对象的初始化

2:

this()在第一行的原因就是: 为保证父类对象初始化的唯一性. 我们假设一种情况, 类B是类A的子类,如果this()可以在构造函数的任意行使用, 那么会出现什么情况呢? 首先程序运行到构造函数B()的第一行,发现没有调用this()和super(), 就自动在第一行补齐了super() , 完成了对父类对象的初始化,然后返回子类的构造函数继续执行, 当运行到构造函数B()的"this(2) ;"时, 调用B类对象的B(int) 构造函数,在B(int)中, 还会对父类对象再次初始化! 这就造成了对资源的浪费, 当然也有可能造成某些意想不到的结果, 不管怎样,总之是不合理的, 所以this() 不能出现在除第一行以外的其他行!

3:

不能同时出现,是因为this和super都要定义在第一行,所以只能有一个;那么为什么要定义在第一行呢?先说super,因为子类继承了父类的属性和方法,所以在先初始化父类的属性和方法,这样子类才可以初始化自己特有的,因为,或者自定义了带参的super,这样就初始化了父类的成员了,所以写了this的构造函数不能再写super了,因为实例化一个对象运行两次super是不安全的。this放在第一行,也是因为要先初始化父类和this代表的构造函数先,因为当前构造函数可能用到那些成员,所以那些成员得要先初始化。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 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、付费专栏及课程。

余额充值