Java父类数组存储子类对象,调用子类专属方法报错求助
解决Java父类数组调用子类专属方法的报错问题
你的判断完全正确,问题出在类型转换上。虽然你用instanceof判断出当前对象是CarMotors类型,但数组里的元素被声明为car父类类型,编译器只会把它当作car对象处理,而car类并没有getMotorsCapacity()方法,因此报错。
解决方案:向下强制类型转换
在确认对象属于子类类型后,需要把父类引用强制转换为子类类型,这样就能调用子类的专属方法了。修改主类中报错的代码行即可:
public class Test { public static void main(String[] args) { car [] cars = new car[2] ; cars[0] = new car("M3" , 78000); cars[1] = new CarMotors("M4" , 98000 , 3.0f); for(int i=0 ;i<2;i++){ if(cars[i] instanceof CarMotors) { // 强制转换为CarMotors类型后调用专属方法 System.out.println(((CarMotors) cars[i]).getMotorsCapacity()); }else { System.out.println(cars[i].toString()); } } } }
简化写法(Java 16+)
如果你使用Java 16或更高版本,可以用模式匹配直接在instanceof判断中完成类型转换,代码更简洁:
public class Test { public static void main(String[] args) { car [] cars = new car[2] ; cars[0] = new car("M3" , 78000); cars[1] = new CarMotors("M4" , 98000 , 3.0f); for(car c : cars){ if(c instanceof CarMotors motors) { System.out.println(motors.getMotorsCapacity()); }else { System.out.println(c.toString()); } } } }
另外补充一个Java编码规范建议:类名首字母需要大写,比如把car改成Car,这是行业通用的命名习惯。
内容的提问来源于stack exchange,提问作者Ibrahim Yahyaoui
相关产品推荐
相关产品推荐

