对外部类的链接
内部类的一个重要用途就是:当生成一个内部类的对象时,此对象与制造它的外围对象(enclosing object)之间就有了某种联系,所以它能够访问其外围对象的所有成员,而不需要任何特殊条件。除此之外,内部类还拥有其外围类的所有元素的访问权。
interface Selector{
boolean end();
Object current();
void next();
}
public class Sequence {
private Object[] items;
private int next = 0;
public Sequence(int size) {
items = new Object[size];
}
public void add(Object x) {
if(next < items.length)
items[next++] = x;
}
private class SequenceSelector implements Selector{ //内部类并且实现接口
private int i=0;
public boolean end() {
return i == items.length;
}
public Object current() {
return items[i];
}
public void next() {
if (i<items.length)
i++;
}
}
public Selector selector() { //定义的外部类的一个方法返回指向内部类的引用
return new SequenceSelector();
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Sequence sequence = new Sequence(10);
for(int i = 0;i<10; i++)
sequence.add(Integer.toString(i));
Selector selector=sequence.selector();
while(!selector.end()) {
System.out.println(selector.current()+" ");
selector.next();
}
}
}
运行结果:
代码分析:在这呢,Sequence类只是一个固定大小的Object的数组,以类的形式包装了起来。我们可以调用add()在序列末增加新的Object。要获取Sequence中的每一个对象,可以使用Selector接口,这是**“迭代器”设计模式的例子。**
我们可以看到end()、current()和next()都用到了objects,也就说内部类可以访问外围类的方法和字段,如同自己拥有的。
那么好奇的读者不禁会想如何实现的呢?我们说当某个外围类的对象创建了一个内部类对象时,此内部类对象必定会秘密获取一个指向外围类对象的引用,在你访问外围类的成员时,就是用那个引用来选择外围类的成员。