2

我目前正在学习 Java,但我真的在为某些事情苦苦挣扎。所以我有一个“磁盘”类,子类“CD”、“游戏”和“DVD”。我有一个“数据库”类,它在数组列表中创建磁盘、游戏和 cd 的新实例。数组列表的初始化如下:

private ArrayList<Disk> disks = new ArrayList(); 

然后我将 Game 的一个实例添加到数组中:

disks.add(new Game(1999,"SuperGame!",900,"xbox","ea"));

我正在尝试使用以下代码访问 Game 子类中的方法“getConsole”:

Disk currentDisk = disks.get(3);
currentDisk.getConsole();

它说 getConsole 方法不存在。我可以看到问题在于它只访问 Disk 类的方法和字段,但是我怎样才能使它可以访问它定义为的子类的方法。谢谢你的时间 :)

4

4 回答 4

4

由于getConsole()仅在Game子类上可用,因此您需要告诉 Java 您知道您正在查看 a Game,并显式转换:

Disk currentDisk = disks.get(3);
if (currentDisk instanceof Game) {
    ((Game)currentDisk).getConsole();
}

这不是在 Java 中做事的好方法,因为您正在显式测试子类的类型。

于 2012-05-20T12:44:45.160 回答
0

您需要将其转换回Game

  Game myGame = (Game)disks.get(3);
于 2012-05-20T12:43:24.730 回答
0

Disk 不知道 Game 中的方法,为了使用它,您需要将其转换为 Game。在大多数情况下,您还应该检查以确保它实际上是一个游戏而不是另一个子类类型。

Disk disk = new Game();

(Game)disk.getConsole(); // notice the cast

编辑:忘记添加,检查它是否属于使用 instanceof

if (disk instanceof Game)
{
    // do things
}
于 2012-05-20T12:44:44.523 回答
0

您必须使用 instanceof 运算符检查对象是否实际上是“游戏”对象。然后您可以将其转换为 Game 并使用它来访问所有游戏公共成员和方法。

Disk currentDisk = disks.get(3);
if (currentDisk instanceof Game) {
 Game game = (Game) currentDisk;
 game.getConsole();
}
于 2012-05-20T12:45:44.640 回答