为什么 eclipse 在使用编辑器代码生成器时会自动在构造函数中添加 java super() 方法?
2022-09-04 19:34:39
当我在java类中编写构造函数时,我通常不会在其中调用super()。当我从 eclipse 源代码编辑器生成构造函数时,为什么它总是在那里添加 super()?
我是否错误地默认没有在我编写的构造函数中添加此内容?如果我决定使用 eclipse 代码生成器,在构造函数中保留 super() 调用有什么问题吗?
当我在java类中编写构造函数时,我通常不会在其中调用super()。当我从 eclipse 源代码编辑器生成构造函数时,为什么它总是在那里添加 super()?
我是否错误地默认没有在我编写的构造函数中添加此内容?如果我决定使用 eclipse 代码生成器,在构造函数中保留 super() 调用有什么问题吗?
正如@Kon正确指出的那样,无论如何都存在对默认超级构造函数的隐式调用(这可以通过检查字节码来轻松验证)。如果您不希望 Eclipse 将其显式化,只需选中构造函数创建 GUI 底部的“省略对默认构造函数 super()的调用”复选框即可。javap -c
我是否错误地默认没有在我编写的构造函数中添加此内容?
不,只要您指的是默认的超级构造函数调用。例如,如果超级构造函数采用参数,则需要使调用显式化。super()
如果我决定使用 eclipse 代码生成器,在构造函数中保留 super() 调用有什么问题吗?
不,一点也不。
正如@Kon在他的评论中提到的,Java中的空构造函数包含对超类构造函数的隐式调用。
此外,没有显式调用 的非空构造函数将在顶部有一个隐式调用。super()
唯一一次错误地将调用留在那里是,如果您打算自己调用具有不同的超类构造函数,则使用参数。super()
有关更多详细信息,请参阅此问题。
更新:考虑以下代码,它说明了离开 eclipse 生成的错误场景。super()
public class Foo{
public Foo(int a, int b) {
System.out.println("Foo constructor with-args is called");
}
public Foo() {
System.out.println("Foo with no-args is called");
}
}
class Bar extends Foo {
public Bar() {
// Implicit call to super()
super();
// Explicit call to super(a,b);
// This will not compile unless the call above has been removed.
super(1,2);
}
}