You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 03:45:32