如何在一个数组中使用不同类的对象?(Java)

时间:2014-12-24 13:12:17

标签: java arrays object

我的一个朋友想出了一个赛车游戏的想法,我试图在java中创建它。现在,我已经为汽车制作了3个班级,1个用于玩家汽车,1个用于计算机(ai)汽车,主要用于保存一些变量,如位置(屏幕上的x,y)和名称等等。前2个继承自最后一个。我希望这可以让我创建一个包含播放器和计算机播放器的阵列。然而,这不起作用,现在我的问题是:

有没有办法可以让一个数组中包含不同类型的对象,如果可以的话,我该怎么做呢?还是有任何教程呢?

我已经查看了接口,但我不认为这样可以解决问题,但如果我错了请纠正我。

这是我的想法:

MainCar[] carsArray = new MainCar[totalPlayers];
for(int i = 0; i < totalHumanPlayers; i++)
{
  carsArray[i] = new PlayerCar();
}
for(int i = 0; i < totalComputerPlayers; i++)
{
  carsArray[i] = new ComputerCar();
}

它的想法是我可以遍历所有玩家(人类和计算机)在他们的位置绘制它们并决定转向下一轮

非常感谢, 请原谅我的英语,我不知道它是否正确,不是我的第一语言。)

4 个答案:

答案 0 :(得分:2)

好的,使用第二个循环,您将覆盖先前设置的值,因为您从相同的偏移量i = 0开始。

我建议像:

for(int i = totalHumanPlayers; i < (totalHumanPlayers + totalComputerPlayers); i++)

您可以在数组中保存这两种类型的汽车,就像您所做的那样(声明数组为MainCar类型),记住MainCar可以是ComputerCar或PlayerCar,您需要强制转换才能使用其中一种他们(如果您需要访问PlayerCar或ComputerCar的特定成员),如下所示:

PlayerCar player = (PlayerCar)carsArray[x];

但在您的情况下,如果您只需要在MainCar上使用coords,您可以直接访问它们(如果它们当然是MainCar的成员),例如:

carsArray[i].location.x

carsArrays[i].x

请记住正确初始化数组。 (不要重叠数据)

修改

要确定汽车是否属于某种类型,请使用instanceof运算符,这是一个例子:

if (carVar instanceof PlayerCar) { PlayerCar player = (PlayerCar)carVar; }

答案 1 :(得分:2)

public class PlayerCar : MainCar {}
public class ComputerCar : MainCar {}



MainCar[] carsArray = new MainCar[totalPlayers];
for (int i = 0; i < totalCarsCount; i++) {
   if (carsArray[i] instanceof PlayerCar) {
       System.out.println("Player car");
   } else {
       System.out.println("Computer Car");
   }
}

答案 2 :(得分:1)

对于玩家汽车和电脑车而言,拥有相同的阵列可能不是一个好主意,除非他们都继承了相同的类。例如,如果:

interface MainCar{
    public void horn();
}

class PlayerCar implements Car{
    public void run(){ System.out.println("Broom Broom");}
}

class ComputerCar implements Car{
    public void run(){ System.out.println("tak tak");}
}

MainCar[] cars = new MainCar[totalPlayers];
cars[0] = new PlayerCar();
cars[1] = new ComputerCar();

这是由于Java中的数组的协方差性质所致。

如果PlayerCarComputerCar没有继承MainCar,则上述情况不可能(绝对不推荐)。但由于共同变化,你可以:

Object[] cars = new Object[totalPlayers];    
cars[0] = new PlayerCar();
cars[1] = new ComputerCar();

如果您访问上面的cars[0],则不首选的原因是。你不知道它的类型是什么:

Object a = cars[0];

a可以是StringAnimalList或其他任何内容。并且你必须将它用作汽车,你需要输入它,因为它非常非常不安全:

if(a instanceof PlayerCar){
 //then do something
}else if(a instanceof ComputerCar){
 //then do something
}

PS:从javaNoobsForever更改您的用户名,你不能那么糟糕:)。好吧,我们都是新手:)

答案 3 :(得分:-1)

制作一个所有车辆都实现的汽车界面,然后制作界面类型的数组。

请注意。除非将它们转换回适当的类

,否则您只能从界面调用方法