3 内部类

Wu Jun 2019-12-30 23:22:19
05 Java > 00 Java 基础 > 03 接口、lambda、内部类、代理

内部类( inner class)是定义在另一个类中的类。
为什么需要使用内部类:

  1. 内部类方法可以访问该类定义所在的作用域中的数据,包括私有数据
  2. 内部类可以对同一个包中的其他类隐藏起来
  3. 当想要定义一个回调函数而不想写大量代码时,使用匿名内部类比较便捷

1 访问状态

内部类的构造器具有外部类的隐式引用 outer。
只有内部类可以是私有类。

2 使用方法

引用外围类

OuterClass.this

编写内部类构造器

outerObject.new InnerClass(contruction parameters)

在外围类的作用域之外引用内部类

OuterClass.InnerClass

3 局部内部类

可以在一个方法中定义局部类,作用域被限定在声明这个局部类的块中。
对外部世界完全隐藏,除了定义它的方法外,没有任何方法知道它的存在。
可以访问包含它们的外部类,和 final 局部变量

4 匿名内部类

假如只创建一个这个类的对象,就不必命名了,这种类被称为匿名内部类
匿名类不能有构造器,需要将参数传递给超类构造器;内部类实现接口时不能有任何构造参数。
SuperType 可以是接口,内部类就要实现这个接口;也可以是一个类,内部类就要扩展它。

new SuperType(construction parameters){
    inner class methods and data
}

主要用在回调,如今推荐用 lambda

5 静态内部类

有时候使用内部类仅为了把一个类隐藏在另一个类的内部,并不需要内部类引用外围类对象。为此可以将内部类声明为static,以便取消产生的引用。
只有内部类可以声明为static。静态内部类的对象除了没有对生成它的外围类对象的引用特权外,与其他所有内部类完全一样。
静态内部类的对象可以直接生成:

Outer.Inner in=new Outer.Inner();