为什么 eclipse 在使用编辑器代码生成器时会自动在构造函数中添加 java super() 方法?

2022-09-04 19:34:39

当我在java类中编写构造函数时,我通常不会在其中调用super()。当我从 eclipse 源代码编辑器生成构造函数时,为什么它总是在那里添加 super()?

我是否错误地默认没有在我编写的构造函数中添加此内容?如果我决定使用 eclipse 代码生成器,在构造函数中保留 super() 调用有什么问题吗?


答案 1

正如@Kon正确指出的那样,无论如何都存在对默认超级构造函数的隐式调用(这可以通过检查字节码来轻松验证)。如果您不希望 Eclipse 将其显式化,只需选中构造函数创建 GUI 底部的“省略对默认构造函数 super()的调用”复选框即可。javap -c

enter image description here


我是否错误地默认没有在我编写的构造函数中添加此内容?

不,只要您指的是默认的超级构造函数调用。例如,如果超级构造函数采用参数,则需要使调用显式化。super()

如果我决定使用 eclipse 代码生成器,在构造函数中保留 super() 调用有什么问题吗?

不,一点也不。


答案 2

正如@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);
    }
}