当子类对象存储在超类数组中时如何调用子类方法?

时间:2015-03-09 05:44:45

标签: java arrays inheritance subclass superclass

{
    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是仅出现在子类中的方法。出于某种原因,我无法访问它们。我无法弄清楚如何制作它以便我也可以访问子类方法。

4 个答案:

答案 0 :(得分:2)

您无法致电setCargoCapacity ShipShip[],因为该船可能不是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);

试试这个。它会起作用。