java中为什么需要内部类
一般来说,内部类继承自某个类或者实现某个接口,内部类的代码操作创建它的外部类的对象。所以可以认为内部类提供了某种进入其外围类的窗口。
内部类必须要回答的一个问题是: 如果只是需要一个对某个接口的引用,那么为什么不直接通过外围类实现这个接口呢?答案是:如果这样能满足需求,就应该这样做。那么内部类实现一个接口与外围类实现这样一个接口有什么区别呢?答案是:后者不能总是享用到使用接口带来的方便,有时需要用到接口的实现。所以,使用内部类最吸引人的原因是:
每个内部类都能独立的继承自一个(接口的)实现,所以无论外围类是否已经继承了某个(接口的)实现,对内部类都没有影响。
从这个角度看,内部类使得多重继承的方案变得完整
。接口解决了部分问题,而内部类有效的实现了“多重继承”。也就是说,内部类允许继承多个非接口类型(类或者抽象类)。
使用内部类还可以获得其他一些特性
1. 内部类可以有多个实例,每个实例都有自己的状态信息,并且与外围类对象的信息相互独立。
2. 在单个外围类中,可以让多个内部类以不同的方式实现同一个接口,或继承同一个类。
(e.g. 如果Sequence.java 不使用内部类,就必须声明 “Sequence.java是一个Selector”,对于某个特定的Sequence只能有一个Selector。而使用内部类可以给这个Sequence提供不同的Selector)
3. 创建内部类对象的时刻并不依赖于外围类对象的创建。
4. 内部类并没有令人迷惑的 “is-a”关系;它就是一个独立的实体。
闭包与回调
闭包是一个可调用的对象,它记录了一些信息,这些信息来自于创建它的作用域。通过这个定义可以看出内部类是面向对象的闭包,因为它不仅包含外部类对象(创建内部类的作用域)的信息, 还自动拥有一个指向此外围类对象的引用,在此作用域内,内部类有权操作所有的成员,包括private成员。