java成员变量可见性由访问修饰符界定:private限本类、protected供同包及子类继承访问、default为包级私有、public全局开放;核心是按协作意图与风险控制权限,而非机械套用规则。

Java 成员变量的可见性控制,本质是用访问修饰符划定“谁能看、谁能改”的边界。核心不是堆砌规则,而是理解每种权限背后的协作意图和风险场景——private 是守门人,protected 是家族通道,default 是包内默契,public 是开放接口。
private:守住数据底线,强制走方法入口
声明为 private 的成员变量只能在本类内部被直接读写,连子类和同包其他类都不可见。这不是为了“藏”,而是防止外部绕过逻辑校验随意赋值,破坏对象状态一致性。
- 所有字段默认不加修饰符时是 default(包内可见),容易引发意外耦合,建议显式写 private
- 哪怕只是简单设值,也应通过 public setter 方法——它预留了未来加校验、日志、事件通知的扩展点
- boolean 类型的 getter 习惯命名为 isXxx(),符合 Java Bean 规范,避免 getXxx() 引发语义混淆
- 构造器也可设为 private,配合静态工厂方法实现单例或受限实例化
protected:跨包继承的协作通道
protected 不是“半公开”,而是“家族协作权限”:同包任意类可直接访问;不同包时,仅子类可通过继承访问,且必须通过 this 或 super 调用,不能写 new Parent().field。
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
- 适合框架基类设计,比如定义 protected void init(),由子类按需重写
- 子类中不能访问父类实例的 protected 成员,只能访问自身继承来的那份
- 不适用于需要被任意外部类调用的通用工具方法,那种场景更适合 public + 工具类
default(无修饰符):包级封装的天然防线
没写任何修饰符,就是包私有(package-private)。它比 private 宽松,比 protected 更收敛,是模块化开发中最常被低估的协作层。
- 同一包内的类可自由访问,适合组件间内部协作、工具类、内部实现类
- 不同包的子类无法访问 default 成员,哪怕继承了也看不到——这点常被误认为“子类能继承但不能用”
- 可用于隐藏不应暴露给外部但又需包内共享的中间状态或辅助逻辑
public:明确开放,慎用直连字段
public 成员可在任何地方被访问,包括跨包、跨模块。它适合定义稳定契约,但绝不该用于暴露可变字段。
- public 字段会破坏封装,让外部代码直接修改内部状态,失去控制权
- 若真需全局可读,优先提供 public static final 常量,或 public getter 方法
- public 类必须与文件同名,且一个 .java 文件最多一个 public 类
- 接口中的字段默认是 public static final,无需显式声明
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










