本文以ArrayList中迭代器的实现为例说明嵌套类与内部类。
引言:
以下是MyArrayList类的迭代器实现。
出现的问题:
但实际上这种情况是不存在的,以上程序是可行的,这里只是讨论为什么,详见结论。
1.嵌套类
必须使用static来表示嵌套,如果没有static则将得到一个内部类。嵌套类被设计成private,仅能被外部类看到而无法被其他看到。
嵌套类被认为是外部类的一部分。
示例:
应该也是可以声明好几个iterator的吧?static只是表明它是一个嵌套类,不是只有一个的意思吧?
2.内部类
当声明一个内部类时,编译器则添加对外部类对象的一个隐式引用,该对象引起内部类的构造。如果外部类的名字是Outer,则隐式引用就是Outer.this。
在每一个内部类的对象都恰好与外部类对象的一个实例相关联的的情况下,内部类是有用的。在这种情况下,内部类的对象在没有外部类对象与其关联时,是拥有不可能存在的。
下图表明了外部类MyArrayList和内部类迭代器的关系。
theList.theItems的使用可以由MyArrayList.this.theItems代替。进一步的简化,正如this.data可以简化data一样,MyArrayList.this.theItems可以简写为theItems。这样程序又恢复到了最初的模样。
内部类为Java程序猿带来句法上的便利,不需编写任何Java代码,而编译器则编写使内部类对象和外部类对象相关联的的代码。