Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 我无法获取数组列表中的对象_Java - Fatal编程技术网

Java 我无法获取数组列表中的对象

Java 我无法获取数组列表中的对象,java,Java,在我的代码中,我有一个名为Game的超级类及其子类Tower。塔也有它的子类叫做弹射器。 弹射器子类如下所示: public class Catapult extends Tower { public Catapult(){ super(5,3); } } public class Tower extends Game { private int damage; private int timeStep; private int posi

在我的代码中,我有一个名为Game的超级类及其子类Tower。塔也有它的子类叫做弹射器。 弹射器子类如下所示:

public class Catapult extends Tower {
    public Catapult(){
        super(5,3);
    }
}
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();
   }

}
this.towers.get(0).damage
它使用常量整数值5和3调用塔构造函数。然后,它的超类塔看起来像这样:

public class Catapult extends Tower {
    public Catapult(){
        super(5,3);
    }
}
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();
   }

}
this.towers.get(0).damage
所以现在,有了伤害值和时间步5和3,塔楼称其超级建造师游戏:

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?
    }
 }
它抛出了一个超出范围的数组异常,我没有得到,因为数组塔应该在索引0处存储一个对象

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

public class Catapult extends Tower {
    public Catapult(){
        super(5,3);
    }
}
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();
   }

}
this.towers.get(0).damage

如果你想打印塔的损坏,你必须在最后调用.damage,否则程序想打印塔而不是损坏

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

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

您的主要问题似乎是希望使用Game类中的Tower对象。一个问题是您错误地使用了继承,我将在后面讨论。另一个更重要的问题是创建对象。正确地使用创建ArrayList对象

private ArrayList<Tower> towers = new ArrayList<Tower>();
如果要添加多个塔,可能应该使用for循环。我把细节留给读者作为练习

现在您的列表中有一个或多个塔对象,但伤害字段是私有的。为了访问它,您应该向Tower类添加一个getter方法:

现在,您可以从列表中获得一座塔:

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

    this.towers.add(new Tower());
}
Tower t = towers.get(0);
并获得其伤害值:

int damage = t.getDamage();
关于继承的注意事项

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

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

public class Game {
    private Tower tower;
}

类似地,塔有一个弹射器,因此塔类应该包含一个弹射器成员字段。因为塔楼和弹射器都不是游戏,所以这些职业不应该扩展游戏。从两个类中删除extends-Game子句。

快速浏览一下代码,我发现您似乎在很大程度上滥用了继承。塔为什么要延长游戏?毫无意义,因为塔楼怎么可能是游戏中更专业的子类型?塔楼是游戏中的一个对象。当我说object时,我的意思是像简单的object一样,汽车和摩托车都是车辆的对象。塔楼也不会添加到建筑的塔楼字段中。事实上,每一个新的塔都会创建一个新游戏,其中有一个空塔列表。是的,塔是游戏中的一个对象,这意味着这里有一个has-a关系,游戏中有塔,而不是is-a关系。塔楼不是游戏。这是我对这段关系如此困惑的原因吗?是的,这是我最初的想法,但我的IDE说这是一个错误是的,因为伤害是一种私人价值。在这种情况下,您可以将其公开,或者提供getter方法进行访问。是的,谢谢。第一个问题呢?这让我非常困扰。你确定在调用方法打印第一个塔之前添加了任何塔吗?是的,我已经初始化了第一个对象游戏作为游戏实例,然后我初始化了一个新的弹射器实例,我相信它会根据我的代码初始化塔。然后我试着打印游戏。getDamage;,这给了我一个错误。添加到addTower中的文本塔!游戏已经有了一个叫towers的成员。如果可以看到,ArrayList将包含多个塔对象。所以一场游戏会有几个塔。此外,对于弹射器,我认为它更像是一种“是-是”的关系,因为塔楼将有不同的类型。这个答案似乎没有解决OP问题,它试图解决其他不相关的问题。因为我们现在的游戏和塔可以是A和B。@NiVeR我编辑了我的答案,以解决OP中的核心问题。