调用超类的构造函数不起作用

时间:2014-01-30 21:11:59

标签: java inheritance constructor

在我正在制作的游戏代码中,我有一个名为Entity的类。这是游戏中所有图形对象的超类(太空飞船,导弹等)。

Entity有一个属性int typeEntity在其构造函数(type)中收到public Entity (int type)的值。

班级Ship延伸Entity。它需要具有type中的值。该值也在它的构造函数(public Ship (int type))中给出。 在Ship的构造函数中,Eclipse告诉我调用超类的构造函数(又名super() - 不知道为什么我必须这样做)。所以我从super(type)的构造函数中调用Ship

又名:

public class Ship extends Entity{

    public Ship(int type){
        super(type);
    }

}

public class Entity{

    public Entity(int type){
        this.type = type;
    }

}

稍后,当我在type中检查Ship的实例中的值时,无论在构建实例时构造函数中放置了什么值,我总是得到0。

我想我应该在this.type = type的构造函数中做Ship。但那么,继承的重点是什么?这不应该照顾它吗?

由于

3 个答案:

答案 0 :(得分:2)

调用super(type)是一种显式调用带参数的超类构造函数的方法。这对您的Ship类有效,使用参数调用Entity构造函数。

但是Entity的超类是Object(隐式),而Object有一个无参数的构造函数,因此不需要super()显式。在构造函数中,如果super()不存在,Java会自动插入对no-arg超类构造函数的调用。

此外,Entity是您实际需要处理参数的地方。无论如何,无需将type传递给Object

尝试

private int type;
public Entity(int type){
    this.type = type;
}

Entity中处理参数,并且不需要显式调用超类构造函数。

此外,您可能希望在public中添加Entity getter方法,以便子类和其他类可以访问type值。

答案 1 :(得分:2)

在与OP讨论后(见下文),我们已确定实际问题是type中有一个名为Ship的字段,该字段阻止了同名字段的可见性在Entity。显而易见的解决方案是从Ship中删除此字段,允许超类的字段按预期继承。

答案 2 :(得分:0)

我在实体类中的朋友,默认情况下你没有任何默认构造函数,编译器会看到像

这样的代码
public class Ship extends Entity{

    public Ship(int type){
        super();   ------> added by compiler by default
    }

}

如果你没有添加对super的调用,它会向super添加默认调用,这就是错误的原因,所以你必须添加super(type);在派生类构造函数的第一行,因为你只有参数构造函数。