Java如何重写方法计算父类私有访问属性replacementYear的值
问题解决方案
现存代码问题梳理
- 父类
Equipment的私有属性replacementYear未提供公共set/get方法,子类无法直接操作该属性 - 父类定义的抽象方法
replacementYear()返回值为void,无法直接返回计算结果,现有子类实现仅打印结果未完成属性赋值 - 子类
BatteryPoweredEquipment的构造方法错误添加了void返回值,不符合Java构造方法语法规则 - 父类中
replacementYear定义为String类型不合理,年份为整数,建议修改为int类型
核心逻辑说明
你不需要在子类中额外创建对象完成计算:子类天然继承父类的公共方法,可直接调用getPurchaseYear()获取采购年份,结合自身属性计算后,通过父类提供的set方法给私有属性replacementYear赋值即可。
修改后代码示例
父类Equipment
//Parent abstract class Equipment { private String make; private String model; private int purchaseYear; // 类型调整为int更符合年份存储需求 private int replacementYear; //Constructor for Equipment public Equipment() { make = " "; model = " "; purchaseYear = 0; } // 抽象方法定义为返回int直接返回计算结果 abstract int calculateReplacementYear(); public String getMake() { return make; } public void setMake(String newMake) { this.make = newMake; } public String getModel() { return model; } public void setModel(String newModel) { this.model = newModel; } public int getPurchaseYear() { return this.purchaseYear; } public void setPurchaseYear(int purchaseYear) { this.purchaseYear = purchaseYear; } // 新增replacementYear的get/set方法 public int getReplacementYear() { return replacementYear; } public void setReplacementYear(int replacementYear) { this.replacementYear = replacementYear; } }
子类BatteryPoweredEquipment
class BatteryPoweredEquipment extends Equipment { private int warranty = 0; // 构造方法移除void返回值 public BatteryPoweredEquipment() { } //set & get warranty public int getWarranty() { return warranty; } public void setWarranty(int newWarranty) { this.warranty = newWarranty; } // 重写抽象方法返回计算后的更换年份 @Override int calculateReplacementYear() { int result = warranty + getPurchaseYear(); // 直接赋值给父类属性 setReplacementYear(result); return result; } }
使用示例
你在启动类中可以直接调用该方法获取结果:
public class TestMain { public static void main(String[] args) { BatteryPoweredEquipment device = new BatteryPoweredEquipment(); device.setPurchaseYear(2020); device.setWarranty(3); // 直接获取计算结果 System.out.println("更换年份:" + device.calculateReplacementYear()); // 也可以通过get方法获取已赋值的属性 System.out.println("更换年份:" + device.getReplacementYear()); } }
内容的提问来源于stack exchange,提问作者Mathew Olwyn
相关产品推荐
相关产品推荐

