[英]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
,最好使用例如LinkedList
或CopyOnWriteArrayList
,您只需要更改上面的一行代码,其余的代码仍然可以正常工作。 而如果您将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.