为什么在 super class 没有明确定义的 super class 中使用 super 调用

Why use super call in a super class when it has no explicitly defined super class

package Geometry;

public abstract class GeometryFigures{

protected double surfaces;
protected double perimeter;

public GeometryFigures(double surfaces, double perimeter) {

    super(); //**<---Why use super call here?**

    this.surfaces= surfaces;
    this.perimeter= perimeter;
}

public double getSurfaces() {
    return surfaces;
}

public double getPerimetre() {
    return perimeter;
}


}

所以基本上一切都在标题中。我想知道为什么我需要在 super class.

中使用 super()

感谢您的帮助。

If a constructor does not explicitly invoke a superclass constructor, the Java compiler automatically inserts a call to the no-argument constructor of the superclass. If the super class does not have a no-argument constructor, you will get a compile-time error. Object does have such a constructor, so if Object is the only superclass, there is no problem.

according to docs.oracle

这里super()指的是Object的构造函数,也就是每class个Superclass。

虽然你实际上不需要调用它,因为默认情况下,如果没有其他 superclass 构造函数被调用,构造函数总是尝试调用 super()。

我看到一些代码生成器会自动添加它,我的猜测是它被认为是一种最佳实践,因为它可以明确提醒 super() 将被调用。

假设您有这个 class:

public class A {
   public A() {
       // N lines of code
   }
}

然后你有两个 child classes:

public class B extends A {
   public B() {
       // N lines of code
       // M lines of specific code for class B
   }
}

public class C extends A {
   public C() {
       // N lines of code
       // P lines of specific code for class C
   }
}

正如您所注意到的,由于 BC class 继承自 A,因此您也必须继承构造函数的代码。因此,如果您不能使用 super(),则必须 copy-paste 每个 child class 中的所有代码。等等...

当您扩展一些 class 时,它也意味着一定程度的抽象,因为 superclass 可能在其构造函数中包含某些代码,例如初始化。

在您的示例中,没有理由使用 super()。 Java 会自动为您调用,即使您没有明确编写。

那么什么时候需要调用super()?这是一个示例,使用 subclassGeometryFigures class.

public class MyFigure extends GeometryFigures {

    public MyFigure() {
        super( 5.0, 42.0 );
    }

    // ...
}

需要调用super(),因为你的class中没有默认(无参数)构造函数。 Java 不会提供对 super() 有参数的调用(怎么可能?它会使用什么参数?)。所以在这种情况下,您必须提供一个调用,并指定要使用的构造函数和参数。

您不必这样做,因为它会由编译器隐式地为您添加。

我认为 IDE 会自动为您添加它,因为它们会根据模板生成代码。如果 super 构造函数需要一些可以在本地提取的参数,这可能会有所帮助。