我对这两个类有疑问:

生物:

public abstract class Creature extends Texturable
{
    public Creature(String ID)
    {
        this.ID = ID;
    } // end Creature()

    protected void setMaximumHealthPoints(int maximumHealthPoints)
    {
        this.maximumHealthPoints = maximumHealthPoints;
    } // end setMaximumHealthPoints()

    protected void setMaximumSpeed(int maximumSpeed)
    {
        this.maximumSpeed = maximumSpeed;
    } // end setMaximumSpeed()

    ...

    protected String ID;
    protected int maximumHealthPoints;
    protected int maximumSpeed;
    ...
} // end Creature


人:

public class Human extends Creature
{
    public Human(String ID)
    {
        this.ID = ID;
        setMaximumHealthPoints(100);
        setMaximumSpeed(4);
    } // end Human()
} // end Human


正如上面的代码所说,我要做的是将最大生命值设置为100,将最大速度设置为4,但仅适用于人类。 :)

当我尝试对其进行编译时,出现以下错误:类Creature中的构造函数Creature无法应用于给定类型。 Human和Creature构造函数中的参数相同。所以有什么问题?

我也试过这个:

人:

public class Human extends Creature
{
    protected int maximumHealthPoints = 100;
    protected int maximumSpeed = 4;
} // end Human


但是没有成功。

现在,我收到此错误:“字段隐藏了另一个字段”。

我有什么办法可以使其正常工作?

提前致谢,

卢卡斯

最佳答案

问题与最大速度或运行状况点位无关—它是构造函数。您的Creature类只有一个构造函数,该构造函数采用String。您没有指定如何从Human链接超类构造函数,因此编译器正在寻找可访问的无参数构造函数。构造函数始终必须链接到超类构造函数或同一类中的另一个构造函数。如果您未指定要使用super(...)this(...)链接的任何内容,则等效于:

super();


...在这种情况下无效,因为没有可链接的构造函数。

你要:

// You should consider renaming ID to id, by the way...
public Human(String ID)
{
    super(ID);
    // Other stuff (but don't bother setting the ID field -
    // it's already been set by the Creature constructor)
}


我也强烈建议您将字段设为私有,并且只能从Creature中声明的getter / setter方法访问它们。

请注意,与您的标题相反,这里没有压倒一切。构造函数不会被覆盖-只有方法可以。每个类都有自己的一组构造函数签名。它们根本不被继承-它们只是让您从子类链接到超类。

09-28 03:55