如何避免在每个Java子类中重复编写父类变量与构造方法?
解决方案:子类复用父类属性与构造逻辑
核心思路是在子类构造方法中通过super()调用父类的构造方法,直接复用父类的通用属性初始化逻辑,无需在子类重复定义父类变量和构造代码。
1. 父类Advertisement的正确实现
先确保父类定义好通用属性和对应的构造方法,封装通用逻辑:
public class Advertisement { private String id; private String description; // 初始化通用属性的构造方法 public Advertisement(String id, String description) { this.id = id; this.description = description; } // 按需提供getter方法,用于访问通用属性 public String getId() { return id; } public String getDescription() { return description; } }
2. 子类PrintedAd的实现
子类继承父类后,只需定义自身特有属性,在构造方法第一行通过super(参数)调用父类构造器,完成通用属性初始化,再处理自身属性:
public class PrintedAd extends Advertisement { // 子类特有计费/属性字段 private String printSize; private double unitPrice; // 子类构造方法:先调用父类构造器初始化通用属性,再初始化自身属性 public PrintedAd(String id, String description, String printSize, double unitPrice) { super(id, description); // 必须放在构造方法第一行 this.printSize = printSize; this.unitPrice = unitPrice; } // 子类特有业务方法,比如计算印刷广告费用 public double calculateTotalCost(int printQuantity) { return unitPrice * printQuantity; } }
3. 测试示例(Main.java)
public class Main { public static void main(String[] args) { PrintedAd springAd = new PrintedAd("PRINT_AD_001", "春季新品促销海报", "A3", 6.2); System.out.println("广告ID:" + springAd.getId()); System.out.println("广告描述:" + springAd.getDescription()); System.out.println("150份印刷费用:" + springAd.calculateTotalCost(150)); } }
关键说明
- 若父类没有无参构造方法,子类必须显式调用带参数的
super(),且必须放在子类构造方法的第一行。 - 后续新增其他广告类型(如网页广告
WebAd)时,只需重复上述逻辑:继承Advertisement,调用super()初始化通用属性,再定义自身特有属性和方法即可,完全复用父类代码。
内容的提问来源于stack exchange,提问作者Spiros Skouras
相关产品推荐
相关产品推荐

