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()。
请求帮助。
答案 0 :(得分:5)
在这种情况下,super()引用Object的构造函数,它是每个类的超类。
你实际上并不需要调用它,因为默认情况下,如果没有调用其他超类构造函数,构造函数总是尝试调用super()。
我已经看到一些代码生成器自动添加它,我的猜测是它被认为是一种最佳实践,作为一个明确的提示,将调用super()。
答案 1 :(得分:2)
如果构造函数没有显式调用超类构造函数,Java编译器会自动插入对超类的无参数构造函数的调用。如果超类没有无参数构造函数,则会出现编译时错误。对象确实有这样的构造函数,因此如果Object是唯一的超类,则没有问题。
答案 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
}
}
您可以注意到,由于B
和C
类继承自A
,因此您还必须继承构造函数的代码。因此,如果您无法使用super()
,则必须复制粘贴每个子类中的所有代码。等等...
当你扩展某个类时,它还暗示了一定程度的抽象,因为超类可能在其构造函数中有某些代码,例如初始化。
答案 4 :(得分:0)
在您的示例中,没有理由使用super()
。即使你没有明确地写它,Java也会自动为你打电话。
那么你何时需要致电super()
?这是一个示例,使用GeometryFigures
类的子类。
public class MyFigure extends GeometryFigures {
public MyFigure() {
super( 5.0, 42.0 );
}
// ...
}
这里你需要对super()
的调用,因为你的类中没有默认(无参数)构造函数。 Java不会提供对具有参数的super()
的调用(怎么可能?它会使用哪些参数?)。因此,在这种情况下,您必须提供一个调用,并指定使用哪个构造函数和哪些参数。