构造函数中的super()

30

我正在阅读一些代码。在构造函数中,它有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();
}

1
它正在调用超类的构造函数。在这种情况下,是Object类。 - user
3
它指的是对象类。 - Pradeep Simha
我想它调用了java.lang.Object构造函数。 - Paweł Wyrwiński
4个回答

46

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

因此,它将调用Object中的构造函数(什么也不做)


1
在Java中,除非它们派生自另一个类,否则所有类都是从Object派生的。因此,super()指的是Object类的构造函数。 - Dohn Joe
3
实际上,所有的Java类都是从Object类派生而来。如果它们扩展另一个类,那只意味着它们有更大的继承层次结构。 - cowls
5
这是一个冗余的代码行,因为实际上已经隐含了它的意思。如果你删除这一行,它仍然会调用父类的构造函数,以确保在继承层级中的所有构造函数都被调用。 - cowls
2
请查看此页面底部的注释:http://docs.oracle.com/javase/tutorial/java/IandI/super.html - cowls
1
如果没有继承,为什么Eclipse在生成构造函数时会自动生成super()?我认为在构造函数中使用super()没有任何意义。 - Yubaraj
显示剩余3条评论

19

Super指向扩展类,缺省情况下是Object类。Object中的构造函数什么也不做,因此您可以删除该行代码,因为它不是必需的。

请注意Oracle关于此主题的说明:

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

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


4
super调用了扩展类的构造函数。在Java中,所有的类都是从Object派生的。此外,如果一个类的作者没有为该类创建构造函数,则会创建一个默认的构造函数,什么也不做。
在你的情况下,super调用了Object的默认构造函数。
如果您想了解更多关于Object的信息,可以在这里阅读Object.java的源代码。

-1

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


1
OP 似乎知道 super() 的作用。你的回答没有涉及到 interface 方面。 - Greenonline

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接