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
相关产品推荐
相关产品推荐

