11.8 为什么需要内部类

通常情况下,内部类继承自某个类或实现某个接口,内部类中的代码会操作用以创建该内部类对象的外部类对象。内部类提供了进入其外部类的某种窗口

内部类的核心问题是,如果只需要一个指向某个接口的引用,那为什么不直接让外部类实现这个接口呢?答案是“如果你只需要这个,那么就这么做”

那么到底是让内部类来实现接口,还是让外部类来实现同样的接口,区别在哪里呢?答案是,我们并不是总能享受到接口的便捷性,有时还要处理多个实现

因此,之所以要引入内部类,最令人信服的理由如下:

每个内部类都可以独立地继承自一个实现。因此,外部类是否已经继承了某个实现,对内部类并没有限制

如果没有内部类提供的这种事实上能继承多个具体类或抽象类的能力,有些设计或编程问题会非常棘手。

为了更详细地了解这一点,考虑这样一种情况:在一个类内必须以某种形式实现两个接口。

由于接口的灵活性,你有两种选择:一个单独的类或一个内部类

但是如果使用的是抽象类或具体类,而不是接口,而且你的类必须以某种方式实现这两者,那就只能使用内部类了

如果不需要解决“多重实现继承”问题,你可以用其他任何能想象到的方式来编码,不需要内部类

但是有了内部类,我们就可以获得如下这些额外的功能:

  1. 内部类可以有多个实例,每个实例都有自己的状态信息,独立于外围类对象的信息
  2. 一个外围类中可以有多个内部类,它们可以以不同方式实现同一个接口,或者继承同一个类
  3. 内部类对象的创建时机不与外围类对象的创建捆绑到一起
  4. 内部类不存在可能引起混淆的 “is-a” 关系;它是独立的实体