Java内部类:名字隐藏+代码组织
当生成一个内部类的对象时,此对象与制造它的外围对象(enclosing object)之间就有了一种联系:它能访问其外围对象的所有成员,而不需要任何条件.此外,内部类还拥有其外围类的所有元素的访问权.
为什么内部类会自动拥有对其外围类所有成员的访问权:当外围类的对象创建了一个内部类对象时(内部类的对象只能在与其外围类的对象相关联的情况下才能被创建.构建内部类对象时,需要一个指向其外围类对象的引用,如果编译器访问不到这个引用就会报错),此内部类对象必定会保存一个指向外围类对象的引用.然后,在你访问此外围类的成员时,就是用那个"隐藏的"引用来选择外围类的成员.
当生成一个内部类的对象时,此对象与制造它的外围对象(enclosing object)之间就有了一种联系:它能访问其外围对象的所有成员,而不需要任何条件.此外,内部类还拥有其外围类的所有元素的访问权.
为什么内部类会自动拥有对其外围类所有成员的访问权:当外围类的对象创建了一个内部类对象时(内部类的对象只能在与其外围类的对象相关联的情况下才能被创建.构建内部类对象时,需要一个指向其外围类对象的引用,如果编译器访问不到这个引用就会报错),此内部类对象必定会保存一个指向外围类对象的引用.然后,在你访问此外围类的成员时,就是用那个"隐藏的"引用来选择外围类的成员.
interface
Selector
...
{
boolean isEnd();
Object current();
void next();
}
/**/ /*Sequence类只产生了一个Object数组,Selector接口:检查序列是否到末尾;查看当前对象;移到序列中下一个对象(这是一个完整的操作,所以设置为独立模块).*/
class Sequence ... {
private int next = 0;
private Object obj[];
Sequence(int size)...{
obj = new Object[size];
}
public void addToSequence(Object element)...{
if(next<obj.length)
obj[next++] = element;
/**//*因为数组是Object的,所以要把int型的element转换成一个对象,String是一种对象,而Object是所以对象的基类,所以上面代码属于向上转型.*/
}
private class SSelector implements Selector...{
private int i = 0;
public boolean isEnd()...{return i == obj.length;}
public Object current()...{return obj[i];}
public void next()...{if(i<obj.length)i++;}
/**//*三个方法都引用了外围类中的obj字段*/
}
public Selector getSelector()...{
return new SSelector();
}
}
class TestSequence ... {
public static void main(String[] args) ...{
Sequence sequence = new Sequence(10);
Selector selector = sequence.getSelector();
for(int i=0;i<10;i++)
sequence.addToSequence(Integer.toString(i));
while(!selector.isEnd())...{
System.out.println(selector.current());
selector.next();
}
}
}
boolean isEnd();
Object current();
void next();
}
/**/ /*Sequence类只产生了一个Object数组,Selector接口:检查序列是否到末尾;查看当前对象;移到序列中下一个对象(这是一个完整的操作,所以设置为独立模块).*/
class Sequence ... {
private int next = 0;
private Object obj[];
Sequence(int size)...{
obj = new Object[size];
}
public void addToSequence(Object element)...{
if(next<obj.length)
obj[next++] = element;
/**//*因为数组是Object的,所以要把int型的element转换成一个对象,String是一种对象,而Object是所以对象的基类,所以上面代码属于向上转型.*/
}
private class SSelector implements Selector...{
private int i = 0;
public boolean isEnd()...{return i == obj.length;}
public Object current()...{return obj[i];}
public void next()...{if(i<obj.length)i++;}
/**//*三个方法都引用了外围类中的obj字段*/
}
public Selector getSelector()...{
return new SSelector();
}
}
class TestSequence ... {
public static void main(String[] args) ...{
Sequence sequence = new Sequence(10);
Selector selector = sequence.getSelector();
for(int i=0;i<10;i++)
sequence.addToSequence(Integer.toString(i));
while(!selector.isEnd())...{
System.out.println(selector.current());
selector.next();
}
}
}