成员内部类可使用public、protected、default、private四种访问修饰符;其可见性由自身修饰符决定,不受外层类限制;public跨包可见,protected限同包及子类,default仅同包可见,private仅外层类可用。

成员内部类不是顶层类,因此不受“顶层类只能是 public 或 default”的限制,它可以自由选择修饰符来精细控制访问范围。
public 成员内部类:跨包可见
声明为 public 的成员内部类,只要外层类可被访问,且调用方能通过 OuterClass.InnerClass 形式引用,就可在任何包中使用(需 import 或全限定名)。它不因“同包”而特殊——它的可见性是全局的,前提是外层类本身可访问。
protected 成员内部类:仅限同包 + 子类继承链
protected 对成员内部类的作用与对普通成员一致:
- 同包内的其他类可通过外层类实例或反射访问它(但不能直接 new,除非有 public 构造)
- 不同包的子类(继承了外层类)可在自身代码中访问该内部类(如声明
OuterClass.InnerClass obj),但不能通过外层类实例调用其构造器(除非构造器也是 protected/public) - 注意:protected 不阻止同包非子类看到这个类名,但能否实例化还取决于构造器权限
default(无修饰符)成员内部类:严格包内可见
这是实现“仅同一包可见”的最直接方式:
立即学习“Java免费学习笔记(深入)”;
- 同包内任意类都可访问该内部类,只要外层类是 public 或 default 且可访问
- 跨包类即使继承了外层类,也无法引用该内部类名(编译报错 “cannot find symbol”)
- 它本质上是“包级公开”,和 default 字段/方法的可见性规则完全一致
private 成员内部类:仅外层类可用
private 成员内部类对外封闭:
- 只有定义它的外层类内部可访问(包括静态/非静态上下文)
- 同包其他类不可见,子类不可见,哪怕在同一文件也不行
- 常用于封装辅助逻辑,比如迭代器实现、事件处理器等,完全隐藏实现细节
实际应用中,若目标是“只让同一个包里的类用这个内部类”,就用 default(不写修饰符);若要彻底隔离,只供外层类自己用,就选 private;protected 和 public 则分别面向继承扩展和开放 API 场景。


















