为什么this()和super()方法必须在构造方法中首先调用?
【摘要】 目录问题解决 问题问题:为什么this()和super()方法必须在构造方法中首先调用?Stackoverflow地址:https://stackoverflow.com/questions/1168345/why-do-this-and-super-have-to-be-the-first-statement-in-a-constructor如果你在构造函数中调用this()方法和supe...
目录
- 问题
- 解决
问题
问题:为什么this()和super()方法必须在构造方法中首先调用?
Stackoverflow地址:https://stackoverflow.com/questions/1168345/why-do-this-and-super-have-to-be-the-first-statement-in-a-constructor
如果你在构造函数中调用this()方法和super()方法,Java要求你必须在一开始就调用他,为什么?
举一个例子:
public class MyClass {
public MyClass(int x) {}
}
public class MySubClass extends MyClass {
public MySubClass(int a, int b) {
int c = a + b;
super(c); // 编译器会提示错误
}
}
Sun编译器提示的错误信息是:
call to super must be first statement in constructor
Eclipse编译器提示的错误信息是:
Constructor call must be the first statement in a constructor
针对上述报错,你可以稍微修改一下代码就能编译通过,修改后的代码如下:
public class MySubClass extends MyClass {
public MySubClass(int a, int b) {
super(a + b); // 编译通过
}
}
再举一个例子:
public class MyClass {
public MyClass(List list) {}
}
public class MySubClassA extends MyClass {
public MySubClassA(Object item) {
// Create a list that contains the item, and pass the list to super
List list = new ArrayList();
list.add(item);
super(list); // COMPILE ERROR
}
}
public class MySubClassB extends MyClass {
public MySubClassB(Object item) {
// Create a list that contains the item, and pass the list to super
super(Arrays.asList(new Object[] { item })); // OK
}
}
通过上边的例子,我们可以看出,在调用super()方法之前,编译器并没有阻止你去执行一些逻辑处理。
另外,类似的方法还有this(),也存在对应的使用限制。
编译器这样做,有什么原因呢?
解决
高分回答!
父类的构造函数必须在子类的构造函数之前被调用,这样是为了保证,之后在子类中调用父类的方法时,它们都已经被正确设置了。
尽管这个回答已经赢得了大多数人的支持,但也有不少反对声音。
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)