【问题标题】:Why use super call in a super class when it has no explicitly defined super class [duplicate]为什么在没有明确定义的超类时在超类中使用超调用[重复]
【发布时间】:2016-01-25 22:22:05
【问题描述】:
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()。

感谢您的帮助。

【问题讨论】:

  • 这里不是同一个问题。实际上我知道什么时候需要使用超级调用,但我不确定为什么这段代码在超级类中调用超级构造函数。
  • 你的意思是:“当它没有明确定义的超类时”?如果是,那么您的问题并不清楚。
  • 是的,我就是这个意思。谢谢

标签: java class super


【解决方案1】:

这里 super() 指的是 Object 的构造函数,它是每个类的超类。

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

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

【讨论】:

    【解决方案2】:

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

    according to docs.oracle

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

        想象一下你有这个类:

        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(),您将不得不复制粘贴每个子类中的所有代码。等等……

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

        【讨论】:

          【解决方案5】:

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

          那么你什么时候需要打电话给super()?这是一个示例,使用您的GeometryFigures 类的子类

          public class MyFigure extends GeometryFigures {
          
              public MyFigure() {
                  super( 5.0, 42.0 );
              }
          
              // ...
          }
          

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

          【讨论】:

            猜你喜欢
            • 2023-03-24
            • 1970-01-01
            • 1970-01-01
            • 2012-12-30
            • 2019-10-05
            • 1970-01-01
            • 2021-11-10
            • 1970-01-01
            • 2015-01-14
            相关资源
            最近更新 更多