【问题标题】:super() in constructor构造函数中的 super()
【发布时间】:2013-02-18 20:32:27
【问题描述】:

我正在阅读一些代码。在构造函数中它有 super() 但该类实现了当然没有构造函数的接口。那么它指的是哪个 super() 呢?

public class BoundingBox implements IBoundingVolume {

public BoundingBox() {
        super();
        mTransformedMin = new Number3D();
        mTransformedMax = new Number3D();
        mTmpMin = new Number3D();
        mTmpMax = new Number3D();
        mPoints = new Number3D[8];
        mTmp = new Number3D[8];
        mMin = new Number3D();
        mMax = new Number3D();
        for(int i=0; i<8; ++i) {
            mPoints[i] = new Number3D();
            mTmp[i] = new Number3D();
        }
}


public interface IBoundingVolume {
    public void calculateBounds(Geometry3D geometry);
    public void drawBoundingVolume(Camera camera, float[] projMatrix, float[] vMatrix, float[] mMatrix);
    public void transform(float[] matrix);
    public boolean intersectsWith(IBoundingVolume boundingVolume);
    public BaseObject3D getVisual();
}

【问题讨论】:

  • 它正在调用超类的构造函数。在这种情况下 - 对象。
  • 它指的是Object类。
  • 我想它调用 java.lang.Object 构造函数。

标签: java constructor super


【解决方案1】:

现在让我告诉你我们在这里使用 super() 的真正原因是如果我们想直接调用超类构造函数。当我们调用构造函数时,可能会在层次结构中调用许多构造函数,因此我们可以使用 super() 来消除这种情况。 在测试用例期间,您可能会处理 “除了问题陈述中要求的以外,不要提供任何额外的构造函数” 所以,解决方案是在你的构造函数中使用 Super()。

【讨论】:

  • OP 似乎知道super() 做了什么。您的回答没有针对interface 方面。
【解决方案2】:

super 调用扩展类的构造函数。 Java 中的所有类都派生自Object。此外,如果类的作者没有为该类创建构造函数,则会创建一个不执行任何操作的默认构造函数。

在您的情况下,super 正在调用Object 的默认构造函数。

如果您想进一步了解Object,可以阅读Object.javahere的源代码。

【讨论】:

    【解决方案3】:

    Super 引用扩展类。默认情况下,它是 Object 类。 Object 中的构造函数什么都不做。换句话说,您可以删除此行,因为它没有必要。

    还请注意甲骨文对此主题的看法:

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

    来源:http://docs.oracle.com/javase/tutorial/java/IandI/super.html

    【讨论】:

      【解决方案4】:

      super() 指的是扩展的class(不是实现的接口)。在这种情况下是Object

      所以它会调用Object中的构造函数(什么都不做)

      【讨论】:

      • 在 Java 中,所有类都派生自 Object,除非它们派生自另一个类。所以super()指的是Object类的构造函数。
      • 其实ALL Java类都是从Object派生的。如果它们扩展了另一个类,则仅意味着它们具有更大的层次结构。
      • hmmm,为什么会有人提到 Object() 的构造函数?如果我用 super() 删除这一行,它不会有任何影响吗?
      • 这是一条多余的行,因为无论如何都暗示了它。如果您删除该行,它仍将调用超类构造函数。这确保了层次结构中的所有构造函数都被调用
      猜你喜欢
      • 2018-05-06
      • 1970-01-01
      • 1970-01-01
      • 2017-09-04
      • 1970-01-01
      • 1970-01-01
      • 2012-05-17
      • 2013-05-23
      • 1970-01-01
      相关资源
      最近更新 更多