当没有明确定义的超类时,为什么在超类中使用超级调用

时间:2016-01-25 22:22:06

标签: java class super

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()。

请求帮助。

5 个答案:

答案 0 :(得分:5)

在这种情况下,super()引用Object的构造函数,它是每个类的超类。

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

我已经看到一些代码生成器自动添加它,我的猜测是它被认为是一种最佳实践,作为一个明确的提示,将调用super()。

答案 1 :(得分:2)

  

如果构造函数没有显式调用超类构造函数,Java编译器会自动插入对超类的无参数构造函数的调用。如果超类没有无参数构造函数,则会出现编译时错误。对象确实有这样的构造函数,因此如果Object是唯一的超类,则没有问题。

according to docs.oracle

答案 2 :(得分:1)

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

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

答案 3 :(得分:0)

想象一下,你有这个课程:

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

然后你有两个子课程:

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类继承自A,因此您还必须继承构造函数的代码。因此,如果您无法使用super(),则必须复制粘贴每个子类中的所有代码。等等...

当你扩展某个类时,它还暗示了一定程度的抽象,因为超类可能在其构造函数中有某些代码,例如初始化。

答案 4 :(得分:0)

在您的示例中,没有理由使用super()。即使你没有明确地写它,Java也会自动为你打电话。

那么你何时需要致电super()?这是一个示例,使用GeometryFigures类的子类

public class MyFigure extends GeometryFigures {

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

    // ...
}

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