getter/setter 是可继承的方法而非字段,其可访问性取决于修饰符:public/protected 可被子类调用或重写,private 则完全不可见;重写常用于校验、适配或封装副作用,但需注意字段结构变化与副作用控制。

类定义中的 getter/setter 不是字段,而是方法;它们不被子类“自动继承为属性”,但可通过继承关系被调用或重写——关键看访问修饰符、是否被声明为 private,以及语言的具体规则。
getter/setter 本质是可继承的方法
Java 和 JavaScript 中,get name() 或 public String getName() 都是普通方法:前者是语法糖,后者是显式声明。只要父类中这些方法是 public 或 protected,子类就能直接调用,无需重复定义。
- 父类有
public int getAge() { return age; },子类实例调用stu.getAge()会正常执行 - 父类用
private声明字段age,但提供protected void setAge(int a),子类可调用该 setter,但不能直接访问age字段 - 若父类 getter 是
private String getId(),子类既不能调用,也不能重写
子类可安全重写以定制行为
重写 getter/setter 是常见且推荐的做法,尤其用于扩展校验、适配新逻辑或封装副作用。
- 父类
setPrice(double p)只做赋值;子类可覆盖为if (p > 0) super.setPrice(p * TAX_RATE); - 父类
getFullName()拼接firstName + " " + lastName;子类字段改为givenName/familyName,就必须重写该 getter - 建议把计算逻辑抽成
protected辅助方法(如buildFullName()),方便子类复用
private 访问器完全不可见
private 声明的 getter/setter 在子类中不可访问,也不参与多态分派。它只对当前类有效。
- 父类中
private String token;+private String getToken() { return token; }→ 子类无法调用getToken() - 若需子类参与,应改用
protected方法,或通过public接口间接暴露 - 字段本身是
private并不影响 getter/setter 的可见性——决定权在方法自身的修饰符
计算型访问器要警惕字段结构变化
没有对应字段的 getter(比如 getDiscountedPrice())依赖父类字段布局。一旦子类改变字段名、类型或拆分逻辑,就容易出错。
- 父类用
basePrice和discountRate;子类若引入couponCode,应在重写的 getter 中整合新逻辑 - 避免在 setter 中修改多个字段或触发 I/O、网络等副作用——这类行为难以被继承者预期和控制
- 更清晰的做法是:setter 只负责赋值,把复杂更新封装为独立方法(如
applyPromotion())











