10 内部类
10.1 创建内部类
如果想从外部类的非静态方法之外的任意位置创建某个内部类的对象,那么必须具体的指明这个对象的类型:OuterClassName.InnerClassName
10.2 链接到外部类
当生成一个内部类的对象时,此对象与制造它的外围对象(enclosing object)之间有了一种联系,所以它能访问外围对象的所有成员,不需要任何特殊条件。
10.6 匿名内部类
如果定义一个匿名内部类,并且希望它使用一个在其外部定义的对象,那么编译器要求其参数引用是final的。
10.7 嵌套类
如果不需要内部类对象和其外围类对象之间的联系,可以将内部类声明为static。这通常称为嵌套类。
普通的内部类对象隐式的保存了一个引用,指向创建它的外围类对象。然而,当内部类是static的时候,就不是这样的了。
嵌套类意味着:
1. 要创建嵌套类的对象不需要外围类的对象。
2. 不能从嵌套类的对象中访问非静态的外围类对象。
普通内部类和嵌套楼还有一个区别,普通内部类的字段和方法只能放在类的外部层次,所有普通内部类不能有static数据和static字段,也不能包含嵌套类。但是嵌套类可以包含所有这些东西。
10.7.2 从多层嵌套类中访问外部类的成员
一个内部类被嵌套多少层并不中重要,它能透明的访问所有它嵌入的外围类的所有成员
10.8 为什么需要内部类
一般来说,内部类继承自某个类或者实现某个接口,内部类的代码操作创建它的外围类的对象。
如果只需要一个对接口的引用,那么可以在外围类中实现那个接口。
每个内部类都能独立的继承自一个接口的实现,无论外围类是否已经实现某个接口,对于内部类都没有影响。
- 内部类可以有多个实例,每个实例都有自己的状态信息,,并且与外围类对象的信息相互独立。
- 在单个外围类中,可以让对个内部类以不同的方式事项同一个接口,或者继承同一个类。
- 创建内部类对象的时刻并不依赖于外围类对象的创建。
- 内部类没有令人迷惑的“isa”关系。它就是一个独立的实体。