在构造函数中,super()如何工作?

4

我有一个关于在构造函数中如何使用super()的问题。我知道它会调用超类,但最近我看了一些代码,不明白它在这个例子中是如何使用的。以下是让我困惑的部分:

public class MyClass implements MyInterface {
    String myString = null;

    public MyClass() {
        super();
    }

    public MyClass(String A) {
        super();
        myString = A;
    }

    public interfaceMethod {
        // this is the method from MyInterface
    }
}

我理解构造函数的使用方式,但是我不理解其中super()方法的意义。它与实现的接口有关吗?我认为只有当一个类继承自另一个类时才会使用super(),难道我对Java的基础知识存在一些误解吗?如果有大佬能帮助新手解惑,将不胜感激。谢谢!

4个回答

3
在这种情况下,super() 指的是 java.lang.Object 的默认构造函数,所有对象都隐式地继承自 Object

1
任何java类默认都隐式继承自java.lang.Object,因此上述代码片段将调用Object类的构造函数(当前不执行任何操作)。

谢谢您的回复。我可以这样理解,这里的super()与接口无关吗?我还可以这样理解,删除每个构造函数中的super()实际上对代码没有任何影响吗? - John Octavious
2
你是正确的。MyClass() 构造函数是一个无参构造函数。实际上,根本不需要调用 super(),因为无参构造函数自动将其作为第一件事调用 super()。构造函数体可以为空。在 http://www.javaworld.com/article/2076204/core-java/understanding-constructors.html 上有一个很好的讨论。 - mister270

0
所有Java中的类都直接或间接继承自java.lang.Object
例如,如果我们编写class A,编译器会执行类似于class A extends Object的操作。
假设...
class A extends B {}

那么这将被解释为,

class B extends Object {}
class A extends B {}

据说在对象类初始化其部分之前,无法初始化类。因此,调用Object类构造函数是编译器的责任。编译器通过在构造函数中写入super()作为第一条语句来完成此操作。因此,即使您没有创建任何默认构造函数,编译器也会创建一个并将super()写入其中。

在这种情况下,当您没有使用任何参数初始化MyClass时,它调用默认构造函数,该构造函数在其中看到了super(),因此调用了Object类构造函数。 当您使用String参数初始化MyClass时,它将调用带参数的构造函数,该构造函数在其中看到了super(),因此调用了Object类构造函数。

我希望我回答了您的问题。


0
在继承中,当子类被实例化时,无论子类构造函数中是否存在super(),都会调用基类的默认(零参数)构造函数。但是,如果您想调用父类的任何其他构造函数,则可以使用带参数的super进行调用。简而言之,Super()用于更改父类实例化的模式。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接