Inner Class

96 阅读2分钟

其实了解这部分的目的主要是为了重温 Lambda 表达式,而在进行 Lambda 表达式之前,了解 Anonymous Classes 又是必要的,Anonymous Classes 又是一种特殊的 Inner Class,所以 Inner Class 这篇就来了。

先上点干货

总的来讲,内部类仍然是一个独立的类,在编译后内部类会被编译成独立的 .class 文件,但是起那面会冠以外部类的类名和 $符号,同时内部类不能以普通的方式访问。如果内部类声明成类静态的,那就不能访问外部类的成员变量,只能访问外部类的静态成员变量。外部类不能直接访问内部类的成员,可以通过内部类对象来访问。

  • 成员内部类

即直接在一个类中定义的内部类,与普通类没有什么区别,可以与普通类一样进行修饰和限制,成员内部类不能含有 static 的变量和方法。

有两点是需要注意的

  1. 其实例化只能在该内部类的方法内实例化,不能在此方法外对其实例化。
  2. 其不能使用该内部类所在方法的非 final 局部变量
  • 局部内部类

即在方法中定义的内部类称为局部内部类。与局部变量类似,局部内部类不能有访问符,因为其不是外部类的一份,但是他可以访问当前代码快内的常量与外围类所有的成员。

  • 匿名内部类

之前有专门的一篇讲,这里就略过。

  • 静态内部类

使用 static 关键字定义,我们不需要创建额外的外部类来访问,可以直接通过 OuterClass.InnerClass myInner = new OuterClass.InnerClass(); 来访问。

来点不干的

我们其实可以拿个动物园来做例子,整个动物园是个外部类,而动物园中的动物就是内部类。然后我们再考虑一个问题,难道一个狮子一定要有动物园才能有狮子吗?显然不是,那么加上 static 修饰的内部类也就是我们的静态内部类,就表示的是我这头狮子,不一定要先造出动物园才能诞生狮子。到这里我们可以总结出,内部类是属于外部类实例对象的一个实例成员,必须要创建出外部类的实例对象,再通过这个实例对象创建内部类的实例对象。而静态内部类属于类,不关实例对象的事,也就不需要创建外部类的实例对象也能创建静态内部类,这样使用使用起来就比较方便。

内部类可以独立地继承一个抽象类或者实现一个接口,无论外部类是否也这样做了,对内部类都没有影响。