2015-09-10 63 views
1

有一段代码。迭代器,ListIterartor和枚举的实例

Vector v = new Vector<>(); 
Iterator it = v.iterator(); 
ListIterator lit = v.listIterator(); 
Enumeration enu=v.elements(); 
System.out.println(it.getClass().getName()); 
System.out.println(lit.getClass().getName()); 
System.out.println(enu.getClass().getName()); 

Iterator这里,ListIteratorEnumeration是接口类型 和有保持(分别it,​​3210和enu)它们的引用变量。

当我编译这个代码我匿名类Vector即的,

java.util.Vector$Itr 
java.util.Vector$ListItr 
java.util.Vector$1 

我想知道它是怎么发生的。

+0

我建议您仔细阅读[The Java Tutorial,Nested classes chapter](https://docs.oracle.com/javase/tutorial/java/javaOO/nested.html)。这会让你了解发生了什么。 –

回答

3

在前两种情况下(java.util.Vector$Itrjava.util.Vector$ListItr)您没有获得Vector的匿名类。 java.util.Vector$something指示something是嵌套在java.util.Vector类中的类。匿名类没有名字。 ItrListItr是类名,所以它们绝对不是匿名的。

中,你没有得到一个匿名类的实例是v.elements()唯一的情况下,由于Vectorelements()方法返回实现Enumeration接口的匿名类实例:

public Enumeration<E> elements() { 
    return new Enumeration<E>() { 
    int count = 0; 

    public boolean hasMoreElements() { 
     return count < elementCount; 
    } 

    public E nextElement() { 
     synchronized (Vector.this) { 
     if (count < elementCount) { 
      return (E)elementData[count++]; 
     } 
    } 
     throw new NoSuchElementException("Vector Enumeration"); 
    } 
    }; 
} 
+0

仍然没有得到你的观点 – Roushan45

+0

好吧谢谢你的好解释@Eran。你可以告诉我关于java.util.Vector $的东西。 – Roushan45

+0

@ Roushan45我仅以Vector $ something为例。实际的嵌套类被命名为Vector $ Itr和Vector $ ListItr – Eran

0

getClass()返回实际运行时间输入对象的,而不是通过其访问对象的变量的声明类型。这意味着你会从不看到interface类型由getClass()返回。

由于未指定Vector.iterator()Vector.listIterator()将返回的实际类型,结果将是任意的。在你尝试过的实现中,你收到了似乎是内部类Vector的类,这是合理的,但是,如果你在java.util内收到顶级类,或者甚至是完全不同的包的类,那么没有什么问题,因为只要这些类执行Iterator的合同, ListIterator接口正确。

这只是实现特定的。