如何通过超类对象调用子类方法



我有两个从同一超类扩展的子类,将创建3个对象并将其存储到超类的数组中。我想知道如何通过超类对象调用子类方法,我试图将数据类型从Ship转换为CruiseShip或CargoShip,但它不起作用。如果有人能帮忙,我将不胜感激。

这是超类:

public class Ship {
private String name;
private String year;
public Ship() {}
public Ship(String n,String y) {...}
public void setName() {...}
public void setYear() {...}
public void getName() {...}
public void getYear() {...}
}

这两个子类基本上是相同的。

public class CruiseShip extends Ship {
private int passenger;
public CruiseShip() {}
public CruiseShip() {...}
public void setPassenager() {...}
public int getPassenager() {...}
public Strting showInfo() {this.getName()...etc}
}
public class CargoShip extends Ship {
private int capacity;
public CargoShip() {}
public CargoShip() {...}
public void setCapacity() {...}
public int getCapacity() {...}
public Strting showInfo() {this.getName()...etc}
}

以下是主要方法:

public class report {
public static void main(String[] args) {
Ship[] shipList new Ship[3];
for (int i=0;i<3;i++) {//using for loop to create 3 objects randomly and pass into array}
for (int i=0;i<3;i++) {
if (shipList[i] instanceof CruiseShip) {
((CruiseShip)shipList[i]).showInfo();  //This way is not work.
}
else {
((CargoShip)shipList[i]).showInfo();  //This way is not work.
}

看看多态性和晚期结合。基本上,后期绑定表示在运行时根据对象的实际类型来确定要执行的适当方法。所以

class Ship {
public String showInfo() {return "I'm a ship";}
}
class CruiseShip extends Ship {
public String showInfo() {return "I'm a cruiseShip";}
}
class CargoShip extends Ship {
public String showInfo() {return "I'm a cargoShip";}
}
class Main {
public static void main(String argv[]) {
Ship[] ships = new Ship[]{new Ship(), new CargoShip(), new CruiseShip()};
for (Ship ship: ships) {
System.out.println(ship.showInfo());
// I'm a ship
// I'm a cargoShip
// I'm a cruiseShip
}
}
}

我不确定你想问的问题,但这可能会回答你提出的问题。

public abstract class Ship
{
public final boolean hoot()
{
return implementHoot();
}

protected abstract boolean implementHoot();
}
public class BlamShip
extends Ship
{
protected boolean implementHoot()
{
return true;
}
}

子类方法(重写(会被自动调用,即使引用的类型是superclass。你什么都不用做。

最新更新