如何摆脱压倒一切的限制?

时间:2011-10-19 16:44:41

标签: java

我对这两个类有疑问:

怪物:

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不能应用于给定的类型。人类和生物构造函数中的参数是相同的。那么,问题是什么?

我也试过这个:

人:

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

但没有成功。

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

我能做些什么才能让它正常工作吗?

提前致谢,

卢卡斯

3 个答案:

答案 0 :(得分:5)

更改Human构造函数以调用正确的基类构造函数,如下所示:

public Human(String ID)
{
    super(ID);
    setMaximumHealthPoints(100);
    setMaximumSpeed(4);
}

您的代码隐含地尝试调用Creature的无参数构造函数,该构造函数不存在。

答案 1 :(得分:3)

问题与最大速度或健康点位无关 - 它是构造函数。您的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方法访问它们。

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

答案 2 :(得分:0)

在定义默认的非参数构造函数时,必须隐式调用父类的参数构造函数,或者在使用参数定义自定义构造函数时明确调用,如建议的解决方案所示。