Java继承场景下,如何将NonTransferFlight子类对象存入Flight父类数组?
嘿,这个问题其实是Java多态里的基础场景,正常来说父类数组完全可以存放子类对象的——咱们先看正确的写法,再排查你可能踩的坑:
正确的实现示例
首先,先确认父类和子类的定义没问题:
// 父类Flight class Flight { private String flightNum; // 父类构造器 public Flight(String flightNum) { this.flightNum = flightNum; } public void showDetails() { System.out.println("Flight number: " + flightNum); } } // 子类NonTransferFlight,继承自Flight class NonTransferFlight extends Flight { private int flightDuration; // 子类构造器必须调用父类构造器 public NonTransferFlight(String flightNum, int duration) { super(flightNum); // 调用父类带参构造器 this.flightDuration = duration; } @Override public void showDetails() { super.showDetails(); System.out.println("Non-transfer flight, duration: " + flightDuration + " mins"); } }
然后是存入数组的代码,完全合法:
public class FlightDemo { public static void main(String[] args) { // 声明父类类型的数组 Flight[] flightArray = new Flight[10]; // 直接将子类对象存入数组,这是Java向上转型的特性 flightArray[0] = new NonTransferFlight("CA101", 150); flightArray[1] = new NonTransferFlight("MU202", 210); // 遍历数组调用方法,会触发多态(执行子类的showDetails) for (Flight flight : flightArray) { if (flight != null) { flight.showDetails(); } } } }
你可能踩的坑
你说“存入失败”,大概率不是数组本身的类型问题,而是代码里的其他细节出错了,常见的情况有:
- 子类构造器未正确调用父类构造器:如果父类没有无参构造器,子类构造器必须显式用
super(...)调用父类的带参构造器,否则会编译报错,导致无法创建子类对象。 - 语法错误:比如创建子类对象时写错了类名,或者赋值时把数组下标搞越界了?
- 混淆了存入和取出的操作:存入本身没问题,但后续取出对象时如果错误地强制向下转型(比如没做类型检查就强转),可能会抛出
ClassCastException,但这不是存入的问题。
如果还是有问题?
如果上面的示例能正常运行,但你的代码依旧报错,可以把具体的错误提示(比如编译错误信息、运行时异常栈)或者你的代码片段贴出来,这样能更快定位具体问题。
内容的提问来源于stack exchange,提问作者Legomert99
相关产品推荐
相关产品推荐

