内部类(inner class)是定义在另一个类中的类。为什么需要使用内部类呢?其主要原因有以下三点:
·内部类方法可以访问该类定义所在的作用域中的数据,包括私有的数据。
·内部类可以对同一个包中的其他类隐藏起来。
·当想要定义一个回调函数且不想编写大量代码时,使用匿名(anonymous)内部类比较便捷。
我们将这个比较复杂的内容分几部分介绍。
·在6.4.1节中,给出一个简单的内部类,它将访问外围类的实例域。
·在6.4.2节中,给出内部类的特殊语法规则。
·在6.4.3节中,领略一下内部类的内部,探讨一下如何将其转换成常规类。过于拘谨的读者可以跳过这一节。
·在6.4.4节中,讨论局部内部类,它可以访问外围作用域中的局部变量。
·在6.4.5节中,介绍匿名内部类,说明在Java有lambda表达式之前用于实现回调的基本方法。
·最后在6.4.6节中,介绍如何将静态内部类嵌套在辅助类中。C++注释:C++有嵌套类。一个被嵌套的类包含在外围类的作用域内。下面是一个典型的例子,一个链表类定义了一个存储结点的类和一个定义迭代器位置的类。

嵌套是一种类之间的关系,而不是对象之间的关系。一个LinkedList对象并不包含Iterator类型或Link类型的子对象。
嵌套类有两个好处:命名控制和访问控制。由于名字Iterator嵌套在LinkedList类的内部,所以在外部被命名为LinkedList::Iterator,这样就不会与其他名为Iterator的类发生冲突。在Java中这个并不重要,因为Java包已经提供了相同的命名控制。需要注意的是,Link类位于LinkedList类的私有部分,因此,Link对其他的代码均不可见。鉴于此情况,可以将Link的数据域设计为公有的,它仍然是安全的。这些数据域只能被LinkedList类(具有访问这些数据域的合理需要)中的方法访问,而不会暴露给其他的代码。在Java中,只有内部类能够实现这样的控制。
然而,Java内部类还有另外一个功能,这使得它比C++的嵌套类更加丰富,用途更加广泛。内部类的对象有一个隐式引用,它引用了实例化该内部对象的外围类对象。通过这个指针,可以访问外围类对象的全部状态。在本章后续内容中,我们将会看到有关这个Java机制的详细介绍。
在Java中,static内部类没有这种附加指针,这样的内部类与C++中的嵌套类很相似。 |