Java继承异常排查:HealthyBurger类方法返回结果不符合预期
分析与解决你的HealthyBurger价格计算问题
嘿,我来帮你拆解下这个问题,看起来核心问题出在继承时的构造方法执行顺序和方法重写的逻辑完整性上,咱们一步步来捋:
问题根源排查
你遇到的两种异常情况,本质上是同一个问题的不同表现:
- 0-4种配料时重写的getTotal返回基础价0:很大概率是父类的构造方法中调用了被子类重写的
getTotal(或者间接调用的方法,比如showPrice)。Java的构造执行顺序是先跑父类构造,再跑子类构造,但如果父类构造里调用了子类重写的方法,此时子类的属性还没完成初始化,只能拿到默认值(比如double的默认值0.0)。 - 5-6种配料时非重写getTotal能显示配料价但基础价不对:说明这个非重写的方法是父类的原生实现,它能正确读取父类的基础价,但子类重写的版本没有正确复用父类的基础价逻辑——要么是子类自己定义了同名的
basePrice变量覆盖了父类属性,要么是重写方法里没有调用super来获取父类的基础价。
具体解决步骤
1. 检查父类构造是否调用了重写方法
先看你的Hamburger构造方法,有没有类似这样的代码:
public Hamburger(double basePrice) { this.basePrice = basePrice; showPrice(); // 这里调用了可能被子类重写的方法! }
如果有,赶紧去掉构造里的showPrice或getTotal调用!父类构造执行时,子类的属性还没初始化,此时调用子类重写的方法必然拿不到正确的值。
2. 确保子类构造正确传递基础价并继承父类属性
子类HealthyBurger的构造必须正确通过super()把基础价传给父类,而且不要在子类里重新定义basePrice变量(否则会覆盖父类的属性,导致父类赋值的基础价被隐藏):
// 错误示例:子类重新定义basePrice,覆盖父类属性 public class HealthyBurger extends Hamburger { private double basePrice; // 这会导致父类的basePrice被隐藏! public HealthyBurger(double basePrice) { super(basePrice); this.basePrice = 0; // 错误赋值 } } // 正确示例:复用父类的basePrice属性 public class HealthyBurger extends Hamburger { public HealthyBurger(double basePrice) { super(basePrice); // 把基础价传给父类,让父类完成赋值 } }
3. 重写getTotal时正确复用父类逻辑
重写的getTotal方法必须通过super来获取父类的基础价或父类的计算逻辑,不要从头实现:
@Override public double getTotal() { // 先拿到父类的基础价(包含已加的配料价) double parentTotal = super.getTotal(); // 针对0-4种配料的逻辑处理,比如折扣 if (toppings.size() <= 4) { return parentTotal * 0.9; // 示例:9折优惠 } else { return parentTotal; // 5-6种配料直接用父类的计算结果 } }
4. 验证showPrice的调用时机
确保你是在子类构造完成后再调用showPrice,而不是在父类构造里调用:
// 正确的调用方式 public static void main(String[] args) { HealthyBurger burger = new HealthyBurger(10.0); burger.addTopping("Lettuce", 1.5); burger.showPrice(); // 此时子类和父类的属性都已初始化完成 }
总结
你的问题核心是继承过程中构造方法的执行顺序导致重写方法被提前调用,或者子类错误覆盖了父类的核心属性。按照上面的步骤排查调整后,应该就能解决基础价为0的问题啦。
内容的提问来源于stack exchange,提问作者CowOO
相关产品推荐
相关产品推荐

