我无法在数组列表中获取该对象

时间:2017-10-07 20:06:50

标签: java

在我的代码中,我有一个名为Game的超类及其子类TowerTower还有一个名为Catapult的子类。 Catapult子类看起来像这样:

public class Catapult extends Tower {
    public Catapult(){
        super(5,3);
    }
}

它使用常量整数值5和3调用Tower构造函数。然后,它的超类Tower如下所示:

public class Tower extends Game {
    private int damage;
    private int timeStep;
    private int position;
    private boolean willFire;

   public Tower(int damage, int timeStep){
       super.addTower(damage,timeStep);
   }
   public Tower(int damage, int timeStep, int position,boolean willFire){
       this.damage = damage;
       this.timeStep = timeStep;
       this.position = position;
       this.willFire = willFire;
   }
   public void getDamage(){
       super.printDamage();
   }

}

现在,拥有损坏和timeStep(5和3)的值,Tower调用其超级构造函数(Game):

import java.util.ArrayList;
public class Game {
    private ArrayList<Enemy> enemies = new ArrayList<Enemy>();
    private ArrayList<Tower> towers = new ArrayList<Tower>();
    private int corridorLength;
    private int currentPosition = 0;

    public Game(){}

    public Game(int corridorLength){
        this.corridorLength = corridorLength;
    }

    public void addTower(int damage,int timeStep){
       this.towers.add(new Tower(damage,timeStep,this.currentPosition,true));
    // Add tower with current position corrdor length
        System.out.println("Tower added in addTower!");}

    public void printDamage(){
        System.out.println(this.towers.get(this.currentPosition)); // How to get the damage item?
    }
 }

所以具有其值的对象Tower存储在数组塔中(至少我假设如此)。因此,如果有一个非空数组,称为塔,其大小至少为1,那么我在这里面临一些问题。 第一:当我调用Tower.getDamage()方法时,它最终调用Game类中的方法,它只在索引0处打印对象Tower。但是当我尝试以其他方式执行时,比如在Game类中打印对象(直接从Game类调用,而不是通过其Tower子类调用):

public void getDamage(){
    System.out.println(this.towers.get(this.currentPosition));
}

它抛出一个超出范围的数组异常,我不知道,因为数组塔应该有一个存储在索引0的对象。

第二:如何在索引0处获取对象(塔)内的实际整数?所以,我不能这样做:

this.towers.get(0).damage

3 个答案:

答案 0 :(得分:1)

您的主要问题似乎是您要使用Tower课程中的Game个对象。一个问题是你错误地使用了继承,我将在稍后讨论。另一个更重要的问题是创建对象。您使用

正确创建了ArrayList对象
private ArrayList<Tower> towers = new ArrayList<Tower>();

但是,您永远不会创建任何Tower个对象。确保您拥有一些Tower个对象的一种方法是在构造函数中创建它们并将它们添加到列表中:

public Game(int corridorLength){
    this.corridorLength = corridorLength;

    this.towers.add(new Tower());
}

如果您想添加多个塔,您可能应该使用for循环。我将细节作为练习留给读者。

现在您的列表中有一个塔式对象(或多个),但damage字段是私有的。要访问它,你应该添加一个&#34; getter&#34; Tower课程的方法:

public int getDamage() {
    return damage;
}

现在你可以从列表中找到一座塔:

Tower t = towers.get(0);

并获得其伤害值:

int damage = t.getDamage();

关于继承的说明

在我看来,您对如何使用继承感到困惑。继承通常被称为&#34;是&#34;关系。问自己一个简单的问题:塔是游戏吗?如果答案是&#34;是&#34;那么继承可能是合适的。如果答案是&#34; no&#34;,那么继承肯定是不合适的。

在这种情况下,在我看来,塔是游戏。另一方面,游戏有一个塔。这表明Game类应包含Tower成员变量(或字段):

public class Game {
    private Tower tower;
}

同样,Tower 有一个 Catapult,因此Tower类应包含Catapult成员字段。由于TowerCatapult都不是Game,因此这些类应扩展Game。从两个类中删除extends Game子句。

答案 1 :(得分:0)

如果你想打印塔的损坏,你必须在最后打电话给.damage,否则程序会打印塔而不是损坏。

System.out.println(this.towers.get(this.currentPosition).damage);

答案 2 :(得分:0)

您无法直接访问这些字段,因为它们是私有的。您应该为您想要访问的每个字段提供getter。