当子类对象存储在超类数组中时,如何调用子类方法?
How to call subclass methods when subclass objects are stored in superclass array?
{
Ship ships = new Ship();
CargoShip cargoShips = new CargoShip();
CruiseShip cruiseShips = new CruiseShip();
Ship[] allShips = {ships, cargoShips, cruiseShips};
allShips[0].setShipName("Boom");
allShips[0].setYearBuilt("1900");
allShips[1].setShipName("Bang");
allShips[1].setCargoCapaicty(200);
allShips[2].setShipName("Bam");
allShips[2].setMaxPassengers(500);
for (int i = 0; i < allShips.length; i++)
{
System.out.println(allShips[i]);
}
}
所以 Ship class 是超级 class 而 CargoShip 和 CruiseShip 都扩展了 Ship class。我已将 3 个对象存储到 Ship 数组中。 setCargoCapacity 和 setMaxPassengers 是只出现在 subclasses 中的方法。由于某种原因,我无法访问它们。我不知道如何制作它以便我也可以访问 subclass 方法。
您不能调用从 Ship[]
中挑选的 Ship
中的 setCargoCapacity
,因为那艘船可能不是 CargoShip
。您必须在 Ship
class(因此对所有 Ships)中提供一些方法来完成您需要它做的事情,或者检查是否 ship instanceof CargoShip
,如果是,您可以施放它(CargoShip cargoShip = (CargoShip)ship
) 并调用它的 setCargoCapacity
。
你做不到。在java中,引用变量有两种类型:引用类型和实际对象类型。因此,当您编写类似 Object o = "12345"
的内容时,o
的类型为 Object
(而非 String
),并且您无法像使用字符串一样使用 o
而不进行类型转换: o = ((String)o).substring(1);
.
在您的情况下,数组 allShips
中的所有引用都具有类型 Ship
。如果你知道某个数组元素的实际类型是 Ship
子类,你可以像上面那样转换实际类型。但这是一种不好的做法,不应在现实世界中使用。
您可以先初始化您的对象然后将它们存储在数组中:
Ship ships = new Ship();
ships.setShipName("Boom");
ships.setYearBuilt("1900");
CargoShip cargoShips = new CargoShip();
cargoShips.setShipName("Bang");
cargoShips.setCargoCapaicty(200);
CruiseShip cruiseShips = new CruiseShip();
cruiseShips.setShipName("Bam");
cruiseShips.setMaxPassengers(500);
Ship[] allShips = {ships, cargoShips, cruiseShips};
allShips[0].setShipName("Boom");
allShips[0].setYearBuilt("1900");
allShips[1].setShipName("Bang");
((CargoShip)allShips[1]).setCargoCapaicty(200);
allShips[2].setShipName("Bam");
((CruiseShip)allShips[2]).setMaxPassengers(500);
试试这个。它会起作用。
{
Ship ships = new Ship();
CargoShip cargoShips = new CargoShip();
CruiseShip cruiseShips = new CruiseShip();
Ship[] allShips = {ships, cargoShips, cruiseShips};
allShips[0].setShipName("Boom");
allShips[0].setYearBuilt("1900");
allShips[1].setShipName("Bang");
allShips[1].setCargoCapaicty(200);
allShips[2].setShipName("Bam");
allShips[2].setMaxPassengers(500);
for (int i = 0; i < allShips.length; i++)
{
System.out.println(allShips[i]);
}
}
所以 Ship class 是超级 class 而 CargoShip 和 CruiseShip 都扩展了 Ship class。我已将 3 个对象存储到 Ship 数组中。 setCargoCapacity 和 setMaxPassengers 是只出现在 subclasses 中的方法。由于某种原因,我无法访问它们。我不知道如何制作它以便我也可以访问 subclass 方法。
您不能调用从 Ship[]
中挑选的 Ship
中的 setCargoCapacity
,因为那艘船可能不是 CargoShip
。您必须在 Ship
class(因此对所有 Ships)中提供一些方法来完成您需要它做的事情,或者检查是否 ship instanceof CargoShip
,如果是,您可以施放它(CargoShip cargoShip = (CargoShip)ship
) 并调用它的 setCargoCapacity
。
你做不到。在java中,引用变量有两种类型:引用类型和实际对象类型。因此,当您编写类似 Object o = "12345"
的内容时,o
的类型为 Object
(而非 String
),并且您无法像使用字符串一样使用 o
而不进行类型转换: o = ((String)o).substring(1);
.
在您的情况下,数组 allShips
中的所有引用都具有类型 Ship
。如果你知道某个数组元素的实际类型是 Ship
子类,你可以像上面那样转换实际类型。但这是一种不好的做法,不应在现实世界中使用。
您可以先初始化您的对象然后将它们存储在数组中:
Ship ships = new Ship();
ships.setShipName("Boom");
ships.setYearBuilt("1900");
CargoShip cargoShips = new CargoShip();
cargoShips.setShipName("Bang");
cargoShips.setCargoCapaicty(200);
CruiseShip cruiseShips = new CruiseShip();
cruiseShips.setShipName("Bam");
cruiseShips.setMaxPassengers(500);
Ship[] allShips = {ships, cargoShips, cruiseShips};
allShips[0].setShipName("Boom");
allShips[0].setYearBuilt("1900");
allShips[1].setShipName("Bang");
((CargoShip)allShips[1]).setCargoCapaicty(200);
allShips[2].setShipName("Bam");
((CruiseShip)allShips[2]).setMaxPassengers(500);
试试这个。它会起作用。