方法不是抽象的,不会覆盖方法

时间:2015-12-03 04:28:43

标签: java

我刚刚发布了关于抽象方法的内容,我认为这就是它无法编译的原因。

超级

public abstract class Monster extends GameCharacter {

   public abstract int getxP();      
   protected int monsterXP;

     public Monster(String name, int health, int attack, int xp) {
         super(name, health, attack);
         this.monsterXP = xp;
     } 

我的子类

public class Goblin extends Monster {

    public Goblin(String name, int health, int attack, int xp){
        super(name, health, attack, xp);
    }

    public Goblin(){
        this("Goblin", 70, 15, 2);
    }
} 
  

错误:Goblin不是抽象的,不会覆盖抽象方法   getterP中的getxP()

所以我不确定这里发生了什么,超类GameCharacter的代码与构造函数相同。我不明白为什么xp与名称,健康和攻击不同。

为了清楚我如何安排我的超级课程

public abstract class GameCharacter {

    public abstract String getName();
    public abstract int getHealth();
    public abstract int getAttackPower();

    protected String gameCharacterName;
    protected int gameCharacterHealth;
    protected int gameCharacterAttack;

    public GameCharacter(String name, int health, int attack){
        this.gameCharacterName = name;
        this.gameCharacterHealth = health;
        this.gameCharacterAttack = attack;
    }
}

2 个答案:

答案 0 :(得分:2)

所以GameCharacterabstract class并且有abstract种方法。

Monsterabstract class并且有abstract种方法。

Goblin是一个具体的class,应该实现任何尚未由超类实现的abstract方法。我怀疑getxP()碰巧是编译器遇到的第一个缺失并且在此之后失败。如果你实现getxP(),其他缺少的方法也应该导致编译错误,假设它们没有在我们在这里看不到的某些代码中实现。

要以代码形式回答,Goblin需要如下所示:

public class Goblin extends Monster {

    public Goblin(String name, int health, int attack, int xp){
        super(name, health, attack, xp);
    }

    public Goblin(){
        this("Goblin", 70, 15, 2);
    }

    @Override
    public int getxP() {
        return monsterXP;
    }

    @Override
    public String getName() {
        return gameCharacterName;
    }

    @Override
    public int getHealth() {
        return gameCharacterHealth;
    }

    @Override
    public int getAttackPower() {
        return gameCharacterAttack;
    }
}

然而,正如@ Dromlius的回答所暗示的那样,你应该在他们各自的课程中实现这些。

答案 1 :(得分:1)

使方法抽象意味着您将在子类中实现它。在您的情况下,您将get-methods声明为abstract,这在您的场景中没有多大意义。

而不是写作:

public int getXX() {
   return XX;
} 

写:

Shay, Linn. 2015 .....

它不会抱怨你的Monster级别中的攻击,健康等,因为你也宣布了怪物级抽象,基本上说:“我知道这个类中有抽象方法(部分继承自GameCharacter),但是我将在下一个非抽象子类中实现它们(在你的情况下是Goblin)。

如果你想保持你的方法抽象,你必须在你的非抽象子类(Goblin)中实现所有抽象超类(GameChar& Monster)的所有抽象方法