{
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类是超类,而CargoShip和CruiseShip都扩展了Ship类。我已将3个对象存储到Ship数组中。 setCargoCapacity和setMaxPassengers是仅出现在子类中的方法。出于某种原因,我无法访问它们。我无法弄清楚如何制作它以便我也可以访问子类方法。
答案 0 :(得分:2)
您无法致电setCargoCapacity
Ship
中Ship[]
,因为该船可能不是CargoShip
。您必须在Ship
类中提供一些方法(因此对于所有Ships)提供您需要它执行的操作,或检查是否ship instanceof CargoShip
,如果是,您可以投射它({{1 }}并调用它的CargoShip cargoShip = (CargoShip)ship
。
答案 1 :(得分:1)
您可以在将对象存储到数组中之前初始化它们:
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};
答案 2 :(得分:0)
你不能这样做。在java中,引用变量有两种类型:引用类型和实际对象类型。因此,当您编写Object o = "12345"
之类的内容时,o
的类型为Object
(而不是String
),并且您无法使用字符串o
,而无需进行类型转换: o = ((String)o).substring(1);
。
在您的情况下,数组allShips
中的所有引用都有Ship
类型。如果您知道某个数组元素的实际类型是Ship
子类,则可以像上面一样转换实际类型。但这是一种不好的做法,不应该在现实世界中使用。
答案 3 :(得分:0)
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);
试试这个。它会起作用。