2015-03-09 2 views
0
{ 
    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]); 
    } 
} 

Таким образом, класс корабля является суперклассом, а CargoShip и CruiseShip расширяют класс корабля. Я сохранил 3 объекта в массиве Ship. setCargoCapacity и setMaxPassengers - это методы, которые появляются только в подклассах. По какой-то причине я не могу получить к ним доступ. Я не могу понять, как это сделать, чтобы я мог также получить доступ к методам подкласса.Как вызвать методы подкласса, когда объекты подкласса хранятся в массиве суперкласса?

ответ

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

Вы не можете позвонить в setCargoCapacity из Ship, который вы выбрали из Ship[], поскольку это судно может быть не CargoShip. Вы должны либо предоставить какой-либо метод в классе Ship (и, следовательно, для всех кораблей), который делает то, что вам нужно, либо проверить, ship instanceof CargoShip, и если вы его можете направить (CargoShip cargoShip = (CargoShip)ship) и назовите setCargoCapacity.

0

Вы не можете это сделать. В ссылочных переменных java имеются два типа: ссылочный тип и тип фактического объекта. Итак, когда вы пишете что-то вроде Object o = "12345", o имеет тип Object (не String), и вы не можете работать с o как с строкой без приведения типов: o = ((String)o).substring(1);.

В вашем случае все ссылки в вашем массиве allShips имеют тип Ship. Если вы знаете, что фактический тип какого-либо элемента массива является подклассом Ship, вы можете использовать фактический тип, как указано выше. Но это плохая практика, и ее нельзя использовать в реальном мире.

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

попробовать это. Это будет работать.