内部类是一种非常有用的特性,因为它允许你把一些逻辑相关的类组织在一起,并控制位于内部的类的可视性。
10.2 链接到外部类
内部类对象可以访问其外部类对象所有成员。
当一个内部类对象生成时,其包含了一个隐含的外部类对象,以调用外部类成员。
class Out {
int out_i = 1;
class In {
int int_i = 1;
void f() {
out_i = 2;
}
}
}
public class InnerDemo {
public static void main(String[] args) {
Out o = new Out();
Out.In i = o.new In();
i.f();
System.out.println(o.out_i);
}
}
//Output:
//2
内部类对象和外部类对象的绑定
10.3 使用.this和.new
.this 用于返回隐含的外部类对象。
.new 用于创建内部类对象。
e.g.
Out.In i = o.new In();
10.4 内部类与向上转型
将内部类置为private,可以在不影响类的逻辑组成的同时,隐藏接口的实现,类的继承,直接返回实现功能后的(对象)引用。这样可以避免客户端程序员对内部类的修改,误用。(如果使用一般的类可能会出现这种情况)。
10.6 匿名内部类
如果定义一个匿名内部类,并且希望使用一个在其外部定义的对象,那么编译器会要求其参数是final的。
class Out {
int out_i = 1;
void f() {
int var = 1;
class In {
void f() {
//Cannot refer to the non-final local variable var defined in an enclosing scope
System.out.println(var);
}
}
}
}
不仅是匿名内部类,局部内部类(在方法中定义的内部类)也同理。
方法中定义的变量的生命周期结束于方法调用的结束,而内部类生成的对象的生命周期知道没有引用指向它才结束,如果不定义final的话,调用内部类对象调用方法中的局部变量时,访问的是一个被销毁的变量。
具体参考:http://feiyeguohai.iteye.com/blog/1500108
10.7 嵌套类
即静态内部类。
嵌套类和外部类对象没有太多的联系,除了可以访问外部类中的静态对象。
接口中使用嵌套类进行代码测试。因为接口中所有成员默认public和static和嵌套类的定义不冲突。
10.8 为什么需要内部类
- 隐藏实现。
- 变相实现多继承。
- 具有外部类所有成员的访问权限。
- 对于同名方法,可以在类中实现该方法,同时在内部类中实现接口中的同名方法,并得以区分。