private是封装的第一道防线,仅限本类访问,不被子类继承,同包类不可见,反射需setaccessible(true);真正封装需private字段配合getter/setter控制读写逻辑。

Java 中的 private 权限本身不“实现”封装,而是封装的第一道防线——它把字段和方法彻底锁死在本类内部,让外部连访问的入口都没有。
private 的作用范围非常明确
它只对声明它的那个类生效,其他任何地方都不可见:
- 子类无法继承或访问父类的
private成员,哪怕写super.xxx也会编译报错 - 同包下的其他类也不能通过对象引用访问
obj.privateField - 连反射默认也绕不过去,必须显式调用
setAccessible(true)(这属于破坏封装) - 编译器在编译期就拒绝跨类访问,不会生成对应字节码,不是运行时检查
封装靠的是 private + getter/setter 组合
仅设 private 字段只是“藏起来”,真正完成封装,得靠公开的方法来控制读写逻辑:
-
getBalance()可以后续加日志、缓存、权限判断,而不暴露原始字段 -
setAge(int age)能校验输入是否合法(比如 0–150),防止非法值直接写入 - 字段本身不提供 public 访问,避免外部绕过业务规则直接修改
- 方法命名按
getXxx()/setXxx()约定,方便框架(如 Jackson、Hibernate)自动识别
private 不能用在哪些地方
语法上有限制,容易踩坑:
- 不能修饰外部类或接口:写
private class A {}在文件顶层会直接编译失败 - 想限制类的可见性,只能用 default(不写修饰符),表示包私有
- 内部类可以是
private static class Helper,此时只有外层类能实例化它 - 接口中所有方法默认
public abstract,字段默认public static final,加private会报错
封装的本质不是“不让看”,而是“只允许按规则操作”。private 切断了随意访问的路径,而 getter/setter 提供了可控的通道。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











