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

Java中如何重写父类方法?子类代码报错‘+ is not a statement’求助

嘿,我来帮你搞定这个问题~

首先,你遇到的‘+ is not a statement’错误,原因很直接:你在setShip方法里写的super.computePrice() + ship;只是一个数学表达式,Java要求单独的表达式必须有明确的用途(比如赋值给变量、作为返回值),编译器不知道你要拿这个计算结果干嘛,所以就报错了。

而且你的代码里还有几个逻辑上的小问题,我一起帮你梳理下:

  • 你定义了private final int ship = 15;,final修饰的变量一旦初始化就不能再修改,但你又写了setShip方法想修改它,这本身就矛盾,final字段根本没法被set方法改变。
  • 构造函数里的int ship参数完全没用到,还和类的成员变量重名,很容易混淆。
  • 看起来你想实现的是「带运费的订单总价」,那正确的姿势应该是重写父类的computePrice方法,而不是写一个没用的setShip。

给你两种修正方案,看你的需求选:

方案1:固定运费15元

如果运费是固定不变的,那代码可以改成这样:

public class ShippedOrder extends Order {
    // 固定运费,用final确保不会被修改
    private final int ship = 15;

    // 构造函数不需要接收运费参数
    public ShippedOrder(String cusName, int cusNo, int qty, double unitPrice) {
        super(cusName, cusNo, qty, unitPrice);
    }

    // 重写父类的computePrice,计算包含运费的总价
    @Override
    public double computePrice() {
        // 先调用父类的方法拿到基础订单价,再加上运费
        return super.computePrice() + ship;
    }
}

方案2:创建订单时自定义运费

如果运费需要根据订单情况调整,那可以把ship的初始化放到构造函数里:

public class ShippedOrder extends Order {
    private final int ship; // 这里先不赋值,留到构造函数里初始化

    // 构造函数接收运费参数,初始化final字段
    public ShippedOrder(String cusName, int cusNo, int qty, double unitPrice, int ship) {
        super(cusName, cusNo, qty, unitPrice);
        this.ship = ship; // 用this区分成员变量和参数,避免混淆
    }

    @Override
    public double computePrice() {
        return super.computePrice() + ship;
    }
}

最后再提醒你几个小细节:

  • 重写父类方法时一定要加@Override注解,编译器会帮你检查方法名、参数列表是不是和父类完全匹配,避免写错。
  • 父类的computePrice方法得是public或者protected的,不然子类没法调用哦。
  • 当参数名和成员变量名一样时,用this.变量名来指代类的成员变量,就不会搞混啦。

内容的提问来源于stack exchange,提问作者Charles

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:45:00