内部类是在类级别(逻辑相关的类)上的封装,实现类名隐藏和进一步封装代码。内部类不同于组合。内部类与外部类的通信。
1. 链接到外部类(enclosing object)
当生成一个内部类的对象时,此对象与制造它的外为对象(enclosing object)之间就有了一种关系,它能访问其外围对象的所有成员,而无需任何条件。内部类拥有其外围类的所有元素的访问权(闭包机制,这与 C++ 的嵌套类的设计十分不同,在 C++ 中只是单纯的名字隐藏机制,与外围对象没有关系,也没有隐含的访问权)。
public class ArrayList<E> {
public Iterator<E> iterator() {
return new Itr();
}
// Itr 内部类共享其外层类的全部成员
private class Itr implements Iterator<E> {
}
}
2. Java 内部类与 C++ 的友元
Java 采用内部类实现 C++ 友元的功能。事实上内部类就是一种面向对象的闭包,因为内部类有他的宿主类的一个 reference(所谓闭包是指一个对象,它记录了来自于创建它的作用域的所有信息),内部类本身可以利用这个引用访问宿主类的一切变量,包括 Private 级别。这不就是一个语法上的,一个类的所有成员变量能被另一个类完全访问吗?内部类不正是能当做宿主类的友元吗?
这一点参考 Java 实现 Memento 模式(备忘录模式)。