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

Java 如何摆脱压倒一切的限制?,java,Java,我对这两门课有一个问题: 生物: public abstract class Creature extends Texturable { public Creature(String ID) { this.ID = ID; } // end Creature() protected void setMaximumHealthPoints(int maximumHealthPoints) { this.maximumHeal

我对这两门课有一个问题:

生物:

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
public class Human extends Creature
{
    protected int maximumHealthPoints = 100;
    protected int maximumSpeed = 4;
} // end Human
我想做的是,正如上面的代码所说,将最大生命值设置为100,最大速度设置为4,但仅适用于人类生物。:)

当我试图编译它时,我得到以下错误:构造函数类中的生物不能应用于给定的类型。人类和生物构造函数中的参数是相同的。那么,有什么问题

我也试过:

人:

public class Human extends Creature
{
    public Human(String ID)
    {
        this.ID = ID;
        setMaximumHealthPoints(100);
        setMaximumSpeed(4);
    } // end Human()
} // end Human
public class Human extends Creature
{
    protected int maximumHealthPoints = 100;
    protected int maximumSpeed = 4;
} // end Human
但是没有成功

现在我得到这个错误:“字段隐藏另一个字段”

我能做些什么使它正常工作吗

提前感谢,


Lucas

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

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

您当前的代码隐式地尝试调用不存在的
生物的无参数构造函数。

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

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

您当前的代码隐式地尝试调用
生物的无参数构造函数,该构造函数不存在。

问题与最大速度或生命点位无关-它是构造函数。你的
生物
类只有一个构造函数,它采用
字符串
。您没有指定如何从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)
}
我还强烈建议您将字段设置为私有,并且只能从
中声明的getter/setter方法访问它们


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

问题与最大速度或健康点位无关-它是构造函数。你的
生物
类只有一个构造函数,它采用
字符串
。您没有指定如何从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)
}
我还强烈建议您将字段设置为私有,并且只能从
中声明的getter/setter方法访问它们


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

当您定义默认的非参数构造函数时,必须隐式调用父类的参数构造函数;当您使用参数定义自定义构造函数时,必须显式调用父类的参数构造函数,正如建议的解决方案所示。

当您定义默认的非参数构造函数时,必须隐式调用父类的参数构造函数;当您使用参数定义自定义构造函数时,必须显式调用父类的参数构造函数,如建议的解决方案所示。

请尝试在human中调用
super(ID)
,你没有默认构造函数来表示只接受一个参数的生物,或者你可以添加一个默认构造函数,
public bioture(){}
你需要遵循Java命名约定,并将ID设置为小写ID。试着在人类中调用
super(ID)
,你没有默认构造函数来表示只接受一个参数的生物,或者您可以只添加一个默认构造函数,
public bioture(){}
您将希望遵循Java命名约定,并使ID小写为ID.yep,只要超级构造函数在末尾被调用,超级构造函数就在末尾被调用