在我正在制作的游戏代码中,我有一个名为Entity
的类。这是游戏中所有图形对象的超类(太空飞船,导弹等)。
Entity
有一个属性int type
。 Entity
在其构造函数(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
。但那么,继承的重点是什么?这不应该照顾它吗?
由于
答案 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);在派生类构造函数的第一行,因为你只有参数构造函数。