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

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);

试试这个。它会起作用。