java中成员变量不写修饰符时默认为包级私有,仅同一包内类可直接访问,跨包(含子类)不可访问,推荐通过public getter/setter实现安全跨包访问。

Java中成员变量不写修饰符时,默认是包级私有(package-private),也就是说,它只能被同一个包内的其他类访问。
包级私有的访问范围
包级私有不是“完全私有”,也不是“公开”,而是一种中间权限:只要类在同一个包下,无论是否继承、是否为内部类,都能直接访问该成员变量。
- 同包下的其他类可直接通过对象名访问(如 obj.fieldName)
- 子类即使在不同包中,也不能访问父类的包级私有字段(除非子类也在同一包)
- 反射可以绕过访问限制,但属于特殊手段,不推荐日常使用
如何验证是否能访问
写两个类放在同一包路径下(比如都放在 com.example 包中):
class A {
int x = 10; // 包级私有
}
class B {
void test() {
A a = new A();
System.out.println(a.x); // ✅ 编译通过,正常访问
}
}
跨包访问不了怎么办
如果需要跨包访问,有几种合理方式:
- 把字段改为 public(简单但破坏封装性,慎用)
- 提供 public getter/setter 方法(推荐,符合面向对象原则)
- 将相关类移到同一包下(适合模块内高内聚场景)
- 使用 protected(允许同包 + 子类访问,但子类必须在同包或继承链中)
常见误区提醒
不要误以为“没写修饰符就等于 private”——private 是明确限定仅本类可访问;而默认修饰符是“包可见”,范围更大。IDE(如 IntelliJ 或 Eclipse)通常会用不同颜色或提示来区分它们,留意编辑器的语义高亮。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











