我继承的错误是什么?

时间:2014-12-01 12:48:30

标签: java inheritance subclass

我试图编写简单的游戏来测试Java中的一些新功能。我有Class Monsters并且有int hp:

public class Monsters {
    int hp;

    public Monsters() {
    }
    public Monsters(int hp) {
        this.hp = hp;
    }
    }

然后我有两个子类 - 主要英雄HERO和他的对手Devil。他们也有int hp,因为他们的生活水平不同:

public class Devil extends Monsters {

    int hp = 200;
}

和HERO:

    public class HERO extends Monsters{
    public HERO(int hp) {
        this.hp = hp;
    }
    }

我试图写作斗争();方法:

public void fight(Monsters hero) {
        int heroLife = hero.hp;
        int opLife = hp;
        System.out.println(opLife + " - Devil's life\n"
                + heroLife + " - Hero's life");
}

好的,现在在main()类Game中测试他们的hp:

public class Gra {
   public static void main(String[] args) {
   HERO hero = new HERO(5);
   Devil devil = new Devil();
   devil.fight(hero);
   }
}

这是我的输出:

0 - Devil's life
5 - Hero's life

为什么是0,而不是200?

3 个答案:

答案 0 :(得分:4)

hp班级和Monsters班级都有Devil个变量。当您从hp类(您的Monsters方法)的方法访问filght时,您将获得hp的变量,默认为0。

您只应在基类中使用hp,并使用Monster的构造函数对其进行正确初始化:

例如:

public class Devil extends Monsters 
{   
    public Devil () 
    {
        super(200);
    }
}

答案 1 :(得分:3)

问题

您正在创建新的hp字段并隐藏继承的hp

解决方案

替换

public class Devil extends Monsters {

    int hp = 200;
}

public class Devil extends Monsters {
    public Devil() {
        this.hp = 200;
    }
}
祝你好运。

答案 2 :(得分:0)

您没有在魔鬼类中定义默认构造函数。首先在默认构造函数中使用默认构造函数使用super关键字。

public class Devil extends Monsters 
{
  public Devil() {
   super();
    this.hp = 200;
  }
}