import java.io.*;
import java.util.*;
Class Why {
public static void main(String[] args) {
Vector v=new Vector(3,2);
v.addElement("a");
v.addElement("b");
v.addElement("c");
Enumeration e=v.elements();
while(e.hasMoreElements()) {
...
}
}
眾所周知 Enumeration是一個介面,它定義了兩個方法 hasMoreElements(),nextElement()。既然是介面,那麼就必定沒有“實現細目”的(介面技術的引入大概也和這有莫大的關係),然而,上面的程式中,Vector.elements()方法返回的是一個Enumeration類型的對象,到這裡,我開始困惑,當上面程式產生了該介面的對象e後,隨即調用e.hasMoreElements()方法,既然e是“沒有實現細目”的Enumeration介面的一個對象,那麼,究竟是那個“類”實現了該介面,提供了“實現細目”呢?即使確實存在這樣一個或者若干個“類”,那麼,上述程式之中,JVM又如何得知,究竟這裡的e,它“葫蘆裡賣什麼藥”,究竟是運行著那個“實作類別”的“細目”呢?
我想,如果我理解了這個問題,那麼,“介面實現Java‘隱藏實現細目’”的謎底就解開了。
解答:
查看過java.util.vector的src,裡面的elements()方法原始碼如下:
public Enumeration elements() {
return new Enumeration() {
int count = 0;
public boolean hasMoreElements() {
return count < elementCount;
}
public Object nextElement() {
synchronized (Vector.this) {
if (count < elementCount) {
return elementData[count++];
}
}
throw new NoSuchElementException("Vector Enumeration");
}
};
}
這是否一個內隱內(inner class)?
—————————————————————————————————
public Enumeration elements() { 這個方法中有個匿名內部類,
在匿名內部類中已經實現了Enumeration 介面中的方法,
e.hasMoreElements() 調用的是匿名內部類實現了的方法,所以使用者不用
去理解在 elements()中的實現細目,只要知道Enumeration 介面中的方法就可以了。
所以Enumeration 介面 實現了隱藏實現細目的目的。