繁体   English   中英

在Java的Collection Framework中实现接口方法的地方?

[英]Where the implementation of interface methods in Java's Collection Framework take place?

虽然我对Java不是很陌生,但以下问题让我很困惑,以至于我无法克服这个问题。 我在网上搜索了很多,也找到了一些答案,但是并不完全令人满意。有人可以清楚我的疑惑

我的困惑是:

 1) Vector v = new Vector();  
    v.addElement("A");  
    ........  
    ........  
    Iterator iter = v.iterator();  

Q1: Iterator是一个接口,我们无法实例化或创建一个接口的对象。那么我们应该在这里称之为“ iter ”,它是什么?

Q1.1:迭代器的所有方法( 例如next() )都由“ iter ”调用。 这些方法在哪里定义? 如果这些方法是在Vector类的特定内部类中定义的(正如我在web上找到的那样),iterator()方法返回什么?我们不能直接通过对象'v'调用这些方法吗?

Q1.2:根据Javadoc:Vector实现{Cloneable,Collection,List,RandomAccess,Serializable}
这些都没有实现Iterator.So如何实现Iterator?

 2) In the declaration:  
    List list = new ArrayList();  

Q1:List是一个接口,ArrayList是一个类。 所以新的ArrayList()创建了一个ArrayList实例。
如何将此实例应用于“列表”并再次应用于什么?

谢谢.....

Re 1) Iterator确实通常被实现为相应集合类的私有内部类。 这就是为什么你看不到实际的实现类,只看到接口。 这很好,因为它的实现细节不是客户关注的问题。 您可以在例如调试器中检查其实际类型,或者在与JDK安装捆绑在一起的Vector源代码中查找。

Vector没有实现Iterator本身 - 它只从iterator方法返回上面提到的内部类的一个实例。 这个内部类实例有一个对创建它的Vector实例的引用,并且看到它的内部结构,这就是它可以遍历其元素的原因。 这就是Iterator模式有用的原因:它允许您遍历许多不同的集合(或实际上是Iterable ),而无需处理它们的实现细节。

Re 2)你的list正是它看起来的样子: ArrayList类的一个实例。 后者实现List接口,因此每个ArrayList都是List

List list = new ArrayList();

是一个成语“接口程序,而不是实现”的例子。 由于上面声明的list类型是List ,因此您可以像使用任何其他List一样使用它,并且您的后续代码不依赖于其实际实现。 因此,如果后来证明不使用ArrayList ,最好使用例如LinkedListCopyOnWriteArrayList ,您只需要更改上面的一行代码,其余的代码仍然可以正常工作。 而如果您将list声明为

ArrayList list = new ArrayList();

后来意识到它的类型应该改变,你至少需要使用list来完成所有代码,并相应地改变它的类型。 此外,一些代码甚至可能使用特定于ArrayList方法,这些方法在其他实现类中不可用或工作方式不同,使得更改更加昂贵。

Q1)您可以创建实现接口的实例。 iter是对必须实现Iterator的对象的引用

Q1.1)它们是作为嵌套类实现的。 您应该能够在源代码中看到它。

iterator()返回对迭代器的引用。

对象v不实现Iterator。

Q1.2)

这些都没有实现Iterator。

这就是为什么你不能调用Iterator的任何方法。

那么Vector如何实现Iterator

它没有。 AbstractList有一个实现Iterator的nest类

Q1)又一次?

list是对一个对象的引用,该对象必须实现Array所做的List(或null)

顺便说一句:我不会使用Vector,除非你必须和我在例子中使用泛型(它们已经存在了8年了;)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM