(这一系列的文章代码均摘自thingking in java,之后就不再另外声明了,感谢 thinking in java)
之前在别人的代码里面见过内部类,但是一直疑惑,为什么会有内部类这个东西,在我看来在Class里面定义几个属性和函数也没什么区别呀。
今日开始翻thinking in java,就直奔此章节去了。
//: innerclasses/Parcel1.java
// Creating inner classes.
public class Parcel1 {
class Contents {
private int i = 11;
public int value() { return i; }
}
class Destination {
private String label;
Destination(String whereTo) {
label = whereTo;
}
String readLabel() { return label; }
}
// Using inner classes looks just like
// using any other class, within Parcel1:
public void ship(String dest) {
Contents c = new Contents();
Destination d = new Destination(dest);
System.out.println(d.readLabel());
}
public static void main(String[] args) {
Parcel1 p = new Parcel1();
p.ship("Tasmania");
}
} /* Output:
Tasmania
*///:~
这算做内部类最基本的用法了,看到这里还是觉得,内部类真是不知道有什么用。
但是,当看到下一个用法-“链接到外部类”,突然有点明白了
//: innerclasses/Sequence.java
// Holds a sequence of Objects.
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) {
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.print(selector.current() + " ");
selector.next();
}
}
} /* Output:
0 1 2 3 4 5 6 7 8 9
*///:~
看完这段,突然就想起了迭代器。这样一写,将数组的存储写入和读取良好的分隔了开来,同时两者之间又有一定的关系关联着。对于Selector,别的类也可以按照自己的方式来实现它,代码的通用性瞬间加强了。到此,才觉得,内部类用好了,绝对精妙呀,绝对不是之前所理解的代码的组合。
他人blog参考:http://blog.csdn.net/historyasamirror/article/details/6049073