getter/setter 封装不改变成员变量的类级作用域,仅通过访问权限控制限制外部直接访问,强制使用受控的间接读写方式。

Getter/Setter 封装本身不改变成员变量的作用域,但会显著影响其**可访问范围**和**访问方式**。成员变量的作用域始终是“整个类内”(即类级作用域),无论是否封装;真正被改变的是外部代码能否直接读写它——这属于**访问权限控制**,而非作用域变更。
作用域没变,访问路径变了
成员变量声明在类中、方法外,它的作用域天然就是该类的所有实例方法和静态方法内部。即使加上 private 修饰符,它依然在整个类范围内可见、可被直接使用。变化在于:外部类(包括子类)不能再用 对象.变量名 的方式访问它,必须走 public 的 getter/setter 方法。
private + Getter/Setter 实际上扩展了可控访问边界
原本 private 成员变量对外完全不可见;加上合法的 getter/setter 后,外部可通过方法间接读写——这不是放宽作用域,而是通过接口提供受控通道。例如:
- 年龄字段 private int age 在类内任何地方都能直接用;
- 外部调用 person.getAge() 或 person.setAge(25) 才能读写;
- setAge() 方法内部还能加校验逻辑(如 if (age ),这是直接赋值做不到的。
对继承关系的影响很关键
子类无法继承父类的 private 成员变量,也不能直接访问它。但若父类提供了 public/protected 的 getter/setter,子类就能调用这些方法完成访问——这相当于把“访问权”从字段层转移到方法层,让继承体系更安全、更灵活。
package 默认或 protected 修饰时,Getter/Setter 还能调节包/子类可见性
如果成员变量是 default(包级)或 protected,它本就允许同包类或子类直接访问。此时封装不是为了“阻止访问”,而是统一入口、集中校验。比如:
- 把一个 protected 字段改为 private,再把 getter 设为 public,就让所有类都能读,但只有子类能绕过 setter 直接改(不推荐);
- 把 setter 设为 protected,就允许子类修改、但禁止外部包调用——比直接暴露 protected 字段更精细。











