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

如何在一个数组中使用不同类的对象?(Java),java,arrays,object,Java,Arrays,Object,我的一个朋友提出了一个赛车游戏的想法,我正试图用java创建它。现在,我已经为汽车创建了3个类,1个用于玩家汽车,1个用于计算机(ai)汽车,还有一个主要类包含一些变量,比如位置(屏幕上的x,y)和名称等等。前两个继承自最后一个。我希望这能让我创建一个包含玩家和电脑玩家的阵列。但是这不起作用,现在我的问题是: 有没有办法让一个数组包含不同种类的对象,如果有可能,我该怎么做,或者有关于它的教程 我已经看过接口,但我不认为这会做的把戏,但请纠正我,如果我错了 这就是我的想法: MainCar[] c

我的一个朋友提出了一个赛车游戏的想法,我正试图用java创建它。现在,我已经为汽车创建了3个类,1个用于玩家汽车,1个用于计算机(ai)汽车,还有一个主要类包含一些变量,比如位置(屏幕上的x,y)和名称等等。前两个继承自最后一个。我希望这能让我创建一个包含玩家和电脑玩家的阵列。但是这不起作用,现在我的问题是:

有没有办法让一个数组包含不同种类的对象,如果有可能,我该怎么做,或者有关于它的教程

我已经看过接口,但我不认为这会做的把戏,但请纠正我,如果我错了

这就是我的想法:

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();
}
MainCar[]carsArray=新的MainCar[totalPlayers];
对于(int i=0;i
它的想法是,我可以循环通过所有玩家(人类和计算机)在他们的位置画出他们,并决定谁是下一个回合

非常感谢,,
请原谅我的英语,我不知道它是否正确,不是我的母语:)

好的,在第二个循环中,您正在覆盖以前设置的值,因为您从相同的偏移量i=0开始

我的建议是:

for(int i = totalHumanPlayers; i < (totalHumanPlayers + totalComputerPlayers); i++)
for(inti=totalHumanPlayers;i<(totalHumanPlayers+totalComputerPlayers);i++)
您可以在阵列中保留这两种类型的汽车,正如您所做的那样(声明阵列为MainCar类型),请记住MainCar可以是ComputerCar或PlayerCar,您需要使用其中一种(如果您需要访问PlayerCar或ComputerCar的特定成员),如下所示:

PlayerCar-player=(PlayerCar)carsArray[x]

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

carsArray[i].位置.x

carsarray[i].x

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

编辑:

要确定一辆车是一种类型还是另一种类型,请使用instanceof运算符,下面是一个示例:

if(播放卡的carVar实例){
PlayerCar player=(PlayerCar)carVar;
}

公共类玩家car:MainCar{}
公共级计算机车:MainCar{}
MainCar[]carsArray=新的MainCar[totalPlayers];
对于(int i=0;i
制作一个所有汽车都实现的汽车接口,然后制作接口类型的数组


注意。您只能从接口调用方法,除非您将它们转换回相应的类中

对于玩家车和计算机车使用相同的数组可能不是一个好主意,除非它们都继承相同的类。例如,如果:

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中数组的协变性质造成的

如果
PlayerCar
ComputerCar
未继承
MainCar
,则上述操作不可能实现(绝对不推荐)。但由于协方差,您可以:

Object[] cars = new Object[totalPlayers];    
cars[0] = new PlayerCar();
cars[1] = new ComputerCar();
如果您访问上面的
cars[0]
,则不建议使用此选项。您不知道它将是什么类型:

Object a = cars[0];
a
可以是
字符串
动物
列表
或任何相关内容。如果你把它当作汽车使用,你需要把它铸造成这样,这是非常不安全的:

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

PS:从
javaNoobsForever
更改您的用户名,您不会那么坏:)。我们都是noobs:)

只要
PlayerCar
ComputerCar
都扩展
MainCar
,你的代码就应该工作。你有什么具体的问题吗?它给出了错误类型的错误,我没有重述exact错误,但是awnsers应该修复它,我想,但是谢谢:)为什么我的评论被删除了?谢谢你的快速回复,是的,我也看到了第二个循环,这不是问题,而是演员,我能知道它是一辆PlayerCar还是一辆电脑车吗?是的,使用instanceof operator,比如:if(carVar instanceof PlayerCar)哈哈,这似乎是恰当的,因为这将是我问题的主要来源:P,谢谢你的快速提醒谢谢你的快速提醒,我现在可以想出来了:)
if(a instanceof PlayerCar){
 //then do something
}else if(a instanceof ComputerCar){
 //then do something
}