【问题标题】:How to use objects of different classes in one array?(Java)如何在一个数组中使用不同类的对象?(Java)
【发布时间】:2014-12-24 13:12:16
【问题描述】:

我的一个朋友想出了一个赛车游戏的想法,我正在尝试用 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();
}

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

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

【问题讨论】:

  • 只要PlayerCarComputerCar 都扩展MainCar,您的代码就应该可以工作。你有什么具体问题?
  • 它给出了错误类型的错误,我不记得确切的错误,但我认为 awnsers 应该修复它,但是谢谢 :)
  • 为什么我的评论被删除了??

标签: java arrays object


【解决方案1】:

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

我建议如下:

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

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

PlayerCar player = (PlayerCar)carsArray[x];

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

carsArray[i].location.x

carsArrays[i].x

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

编辑:

使用 instanceof 运算符来确定汽车是属于一种类型还是另一种类型,下面是一个示例:

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

【讨论】:

  • 感谢您的快速回复,是的,我也看到了第二个循环,这不是问题,但是演员,我能知道它是 PlayerCar 还是 ComputerCar?
  • 是的,使用instanceof操作符,比如:if (carVar instanceof PlayerCar)
【解决方案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");
   }
}

【讨论】:

    【解决方案3】:

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

    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,你不会那么糟糕:)。好吧,我们都是菜鸟:)

    【讨论】:

    • 哈哈,这似乎很合适,因为这将是我问题的主要来源:P,感谢您的快速遮阳篷
    【解决方案4】:

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

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

    【讨论】:

    • 感谢您的快速遮阳篷,我想我现在可以弄清楚了 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-18
    • 2015-05-31
    • 1970-01-01
    • 1970-01-01
    • 2014-06-03
    • 1970-01-01
    • 2020-03-29
    相关资源
    最近更新 更多