不涉及内部类的语法细节。

类访问修饰

java 中对 class 定义了以下几种访问修饰符:

  • public:可以在任何其他类中被访问
  • (default):只能被同一个包中的类访问

没有 private 是因为一个不能被任何类访问的类没有意义,没有 protected 是因为 java 中的包没有继承这个概念(即没有子包这个概念)。

除了这两个之外(public 和 default)之外,类的访问限制与内部类有关。

内部类

成员内部类

成员内部类属于外部类的一个对象。希望创建一个成员内部类,那么需要先创建一个外部类的对象。成员内部类拥有一个特殊的引用 OuterClass.this 这个引用指向用于创建这个内部类的外部类的对象。

成员内部类可以访问外部类的静态字段 / 方法,以及外部类对象的字段和方法(包括 private 修饰的)。

静态内部类

静态内部类属于外部类这个类。创建静态内部类不需要一个对象,只需要外部类存在即可。由于静态内部类不属于一个对象,那么静态内部类也不能访问外部类的成员(字段 / 方法),但可以访问静态的成员(字段/方法)(包括 private)。

静态内部类同样可以定义自己的成员(字段/方法)。静态内部类可以看作具有外部类静态成员访问权限的一个单独的类。

局部内部类

局部内部类定义在一个块(一对大括号)中,这个块之外的地方都没有办法访问这个类(即使在同一个方法中),使用上与正常的类并无不同。

匿名内部类

匿名内部类的作用是继承一个类或者接口并立刻创建这个类的对象,java 已经支持 lambda 函数,二者的作用相似不必要使用匿名内部类。