【问题标题】:How to call subclass methods when subclass objects are stored in superclass array?子类对象存储在超类数组中时如何调用子类方法?
【发布时间】:2015-03-09 05:44:44
【问题描述】:
{
    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 是只出现在子类中的方法。由于某种原因,我无法访问它们。我不知道如何制作它,以便我也可以访问子类方法。

【问题讨论】:

    标签: java arrays inheritance subclass superclass


    【解决方案1】:

    您不能从Ship[] 中选择的Ship 中调用setCargoCapacity,因为该船可能不是CargoShip。您必须在 Ship 类(因此适用于所有 Ships)中提供一些方法来完成您需要它做的事情,或者检查是否有 ship instanceof CargoShip,如果是,您可以转换它(CargoShip cargoShip = (CargoShip)ship)并调用setCargoCapacity 的那个。

    【讨论】:

      【解决方案2】:

      您可以在将对象存储到数组之前初始化它们:

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

      【讨论】:

        【解决方案3】:

        你做不到。在java中引用变量有两种类型:引用类型和实际对象类型。因此,当您编写类似Object o = "12345" 的内容时,o 的类型为Object(不是String),并且您不能使用o,就像使用没有类型转换的字符串:o = ((String)o).substring(1);

        在您的情况下,数组allShips 中的所有引用都具有Ship 类型。如果您知道某个数组元素的实际类型是 Ship 子类,则可以像上面那样转换实际类型。但这是一种不好的做法,不应该在现实世界中使用。

        【讨论】:

          【解决方案4】:
          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);
          

          试试这个。它会起作用的。

          【讨论】:

            猜你喜欢
            • 2017-05-13
            • 2020-05-03
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-08-30
            • 2016-01-22
            • 1970-01-01
            • 2018-08-22
            相关资源
            最近更新 更多