为什么在 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.
这里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
}
}
正如您所注意到的,由于 B
和 C
class 继承自 A
,因此您也必须继承构造函数的代码。因此,如果您不能使用 super()
,则必须 copy-paste 每个 child class 中的所有代码。等等...
当您扩展一些 class 时,它也意味着一定程度的抽象,因为 superclass 可能在其构造函数中包含某些代码,例如初始化。
在您的示例中,没有理由使用 super()
。 Java 会自动为您调用,即使您没有明确编写。
那么什么时候需要调用super()
?这是一个示例,使用 subclass 的 GeometryFigures
class.
public class MyFigure extends GeometryFigures {
public MyFigure() {
super( 5.0, 42.0 );
}
// ...
}
你需要调用super()
,因为你的class中没有默认(无参数)构造函数。 Java 不会提供对 super()
有参数的调用(怎么可能?它会使用什么参数?)。所以在这种情况下,您必须提供一个调用,并指定要使用的构造函数和参数。
您不必这样做,因为它会由编译器隐式地为您添加。
我认为 IDE 会自动为您添加它,因为它们会根据模板生成代码。如果 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 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.
这里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
}
}
正如您所注意到的,由于 B
和 C
class 继承自 A
,因此您也必须继承构造函数的代码。因此,如果您不能使用 super()
,则必须 copy-paste 每个 child class 中的所有代码。等等...
当您扩展一些 class 时,它也意味着一定程度的抽象,因为 superclass 可能在其构造函数中包含某些代码,例如初始化。
在您的示例中,没有理由使用 super()
。 Java 会自动为您调用,即使您没有明确编写。
那么什么时候需要调用super()
?这是一个示例,使用 subclass 的 GeometryFigures
class.
public class MyFigure extends GeometryFigures {
public MyFigure() {
super( 5.0, 42.0 );
}
// ...
}
你需要调用super()
,因为你的class中没有默认(无参数)构造函数。 Java 不会提供对 super()
有参数的调用(怎么可能?它会使用什么参数?)。所以在这种情况下,您必须提供一个调用,并指定要使用的构造函数和参数。
您不必这样做,因为它会由编译器隐式地为您添加。
我认为 IDE 会自动为您添加它,因为它们会根据模板生成代码。如果 super
构造函数需要一些可以在本地提取的参数,这可能会有所帮助。