Java继承层级处理异常输出问题求助
问题原因与解决方案
1. 核心逻辑顺序错误
你现在的代码是先调用setPrice,后设置condition和trailer,这直接导致了错误结果:
- Vehicle构造函数里
this.condition = condition;是无效赋值,成员变量condition默认是null - Truck构造函数里
this.trailer = trailer;也是无效赋值,trailer默认是false
执行setPrice(200)时,this.getCondition() == NEW的判断结果为false(null和任何枚举值都不相等),直接进入else分支计算200 * 0.85 = 170。后续你再设置condition和trailer,但没有重新触发价格计算,所以所有实例的价格都停留在170。
2. 构造函数的初始化bug
两个类的构造函数都存在无效赋值问题,必须修正:
- Vehicle构造函数需给
condition和price设置明确默认值:
public Vehicle() { this.id = idcouter++; this.condition = Condition.USED; // 按需设置默认状态 this.price = 0; }
- Truck构造函数需给
trailer设置明确默认值:
public Truck() { super(); this.trailer = false; // 明确默认无拖车 }
3. 正确的执行顺序
调整代码顺序,先设置condition和trailer,再调用setPrice:
Truck t1 = new Truck(); t1.setCondition(enums.Enums.Condition.NEW); t1.setTrailer(true); t1.setPrice(200); // 此时条件正确,执行95折计算 Truck t2 = new Truck(); t2.setCondition(enums.Enums.Condition.NEW); t2.setTrailer(false); t2.setPrice(200); // 执行原价计算 Truck t3 = new Truck(); t3.setCondition(enums.Enums.Condition.USED); t3.setTrailer(true); t3.setPrice(200); // 执行85折计算
4. 可选优化:属性变更自动更新价格
如果希望修改condition或trailer后自动更新价格,可以在对应的setter中重新触发价格计算,需要先保存原始价格:
public class Truck extends Vehicle { private boolean trailer; private int originalPrice; // 保存用户输入的原始价格 // ... 修正后的构造函数 ... @Override public void setPrice(int price) { this.originalPrice = price; // 原价格计算逻辑 if (this.getCondition() == enums.Enums.Condition.NEW) { int tempPrice = this.trailer ? (int)(price * 0.95f) : price; super.setPrice(tempPrice); } else { super.setPrice((int)(price * 0.85f)); } } public void setTrailer(boolean trailer) { this.trailer = trailer; setPrice(this.originalPrice); // 变更后重新计算价格 } @Override public void setCondition(Condition condition) { super.setCondition(condition); setPrice(this.originalPrice); // 变更后重新计算价格 } }
内容的提问来源于stack exchange,提问作者Antonio Silva
相关产品推荐
相关产品推荐

