2017-05-17 34 views
0

我使用Arraylist作为'英雄' - 基类,而战士,法师是派生类。我想通过使用'get'方法返回每个派生类的lifePoints和attackPoints,而我得到这样的东西(我相信它是类的hashCode)。 (i)通过调试,它显示正确的值,但我不知道如何返回它们,所以我想到了没有参数的构造函数 - 失败了。Arraylist.get返回哈希代码,而不是班级的字段

输出:

Hero 0 is a [email protected] 
Hero 1 is a [email protected] 
Hero 2 is a [email protected] 
Hero 3 is a [email protected] 

预期输出:

Hero 0 is a Warrier with -1 lifePoints and 5 attackPoints 
Hero 1 is a Warrier with 5 lifePoints and 2 attackPoints 
Hero 2 is a Magician with 12 lifePoints and 2 spellPoints 
Hero 3 is a Magician with 13 lifePoints and 2 spellPoints 

我的主类的半码

for (int i=0; i<heroes.size(); ++i) { 
System.out.println("Hero "+i+ " is a "+heroes.get(i)); 
} 

我的解决思路:使用构造函数 - 失败。

public Magician() 
    { 
     System.out.println("Magician with " + this.lifePoints +"life points and " +this.attackPoints +" spell points."); 
    } 

这里是所有代码:

Hero-

abstract class Hero { 

    protected int lifePoints; 
    protected int attackPoints; 

    public abstract Hero attack(Hero other); 
    public abstract int lifePoints(); 

} 

法师:

public class Magician extends Hero{ 

    static int count; 

    Magician(int lifePoints, int attackPoints) 
    { 
     this.lifePoints = lifePoints; 
     this.attackPoints = attackPoints; 
     count++; 
    } 

    public Magician() 
    { 
     System.out.println("Magician with " + this.lifePoints +"life points and " +this.attackPoints +" spell points."); 
    } 
    @Override 
    public Hero attack(Hero other) { 
     if(other != null) 
     { 
      if(other instanceof Hero) 
      { 
       other.lifePoints /= this.attackPoints; 
       if(other.lifePoints <= 0) 
       { 
        return new Magician(this.lifePoints,this.attackPoints); 
       } 
      } 
      //Attacking ourselves - Error 
      if(this.equals(other)) 
      { 
       System.out.println("Hero can't attack itself"); 
      } 
     } 
     return null; 
    } 

    @Override 
    public int lifePoints() { 
     return this.lifePoints; 
    } 

    public static int getNoMagician() 
    { 
     return count; 
    } 

} 

战士:

public class Warrior extends Hero 
{ 
    static int count; 

    Warrior(int lifePoints, int attackPoints) 
    { 
     this.lifePoints = lifePoints; 
     this.attackPoints = attackPoints; 
     count++; 
    } 
    public Warrior() 
    { 
     System.out.println("Warrior with " + this.lifePoints +"life points and " +this.attackPoints +" spell points."); 
    } 

    @Override 
    public Hero attack(Hero other) { 
     if(other != null) 
     { 
      //We're attacking a warrior 
      if(other instanceof Warrior){ 
       ((Warrior)other).lifePoints -= this.attackPoints; 

      } 
      //We're attacking a magician 
      if(other instanceof Magician){ 
       ((Magician)other).lifePoints -= (this.attackPoints/2); 
       if(((Magician)other).lifePoints <= (this.lifePoints/2)) 
       { 
        return new Warrior(this.lifePoints,this.attackPoints); 
       } 

      } 
      //Attacking ourselves - Error 
      if(this.equals(other)) 
      { 
       System.out.println("Hero can't attack itself"); 
      } 
     } 
     //False 
     return null; 
    } 

    @Override 
    public int lifePoints() { 
     return this.lifePoints; 
    } 

    public static int getNoWarrior() 
    { 
     return count; 
    } 

} 
+1

这是没有toString的类的默认字符串转换。创建一个toString或者明确地打印出来。每个人都有优点和缺点。 –

+1

考虑重写'toString' – bradimus

+0

@DaveNewton Works。我真笨。谢谢! –

回答

0

对象的默认toString()就是您要调用其哈希码的内容。为了获得您想要的输出,您需要在Hero的每个子类中创建您自己的方法,例如,类魔术师: - 如下

public String getDescription() { 
    return "Magician with " + this.lifePoints +" life points and " +this.attackPoints +" spell points."); 
} 

然后调用这个方法: -

for (int i=0; i<heroes.size(); ++i) { 
    System.out.println("Hero " + i + " is a "+heroes.get(i).getDescription()); 
} 

注意,我不会为了这个目的覆盖toString(),因为这种方法通常用于调试。如果其他人编辑你的代码,他们可能会改变toString()输出,而不是意识到这对于程序的功能至关重要。

更新:我不是说toString()不应该被覆盖,只是不是在这种特殊情况下,具体文本是必要的游戏。

+0

我不允许更改主代码。我只需重写toString就可以返回刚刚在getDesc func中写的内容。谢谢史蒂夫 –

+0

“我不会重写'toString()'那么你面对已确立的最佳实践飞行。应该总是为值类型重写'toString',并且它应该嵌入'equals'中涉及的所有字段的表示。避免这种情况的建议是错误的。 –

+0

为了澄清,我的意思是我不会为了这个特殊用途而重写它(这大概是针对游戏的一个特定功能,并不包括所有字段)。是的,'toString()'应该被覆盖,但是出于调试的目的,正如你所描述的。 –