虽然我不是Java的新手,但是下面的问题让我很困惑,以至于我无法克服这个问题。 我在网上搜索了很多,也找到了一些答案,但它们并不完全令人满意。有人可以清除我的怀疑
我的困惑是:
1) Vector v = new Vector();
v.addElement("A");
........
........
Iterator iter = v.iterator();
Q1: Iterator 是一个界面,我们无法实例化或创建对象的对象。那么我们应该将“ iter ”称为“ 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实例 如何将此实例应用于“列表”并再次应用于什么?
感谢.....
答案 0 :(得分:4)
Re 1)Iterator
确实通常被实现为相应集合类的私有内部类。这就是为什么你看不到实际的实现类,只看到接口。这很好,因为它的实现细节不是客户关注的问题。您可以查看其实际类型,例如但是调试器,或者在与JDK安装捆绑在一起的Vector
源代码中查找。
Vector本身并不实现Iterator
- 它只从其iterator
方法返回上面提到的内部类的实例。这个内部类实例引用了创建它的Vector
实例,并看到了它的内部结构,这就是它可以遍历其元素的原因。这就是Iterator模式有用的原因:它允许您遍历许多不同的集合(或实际上Iterable
),而无需处理它们的实现细节。
重新2)你的list
正是它的样子:ArrayList
类的一个实例。后者实现了List
接口,因此每个ArrayList
都是List
。
List list = new ArrayList();
是成语“接口程序,而不是实现”的示例。由于上面声明的list
类型为List
,因此您可以像使用其他任何List
一样使用它,后续代码不依赖于其实际实现。因此,如果后来证明代替ArrayList
,则最好使用例如LinkedList
。一个CopyOnWriteArrayList
或list
,您只需要更改上面的一行代码,其余代码仍然可以完美运行。而如果您将ArrayList list = new ArrayList();
声明为
list
后来意识到它的类型应该改变,你至少需要使用ArrayList
来完成所有代码,并相应地改变它的类型。此外,某些代码甚至可能使用特定于{{1}}的方法,这些方法在其他实现类中不可用或工作方式不同,这使得更改更加昂贵。
答案 1 :(得分:0)
Q1)您可以创建实现接口的实例。 iter
是对必须实现Iterator
Q1.1)它们是作为嵌套类实现的。你应该能够在源头看到它。
iterator()返回对迭代器的引用。
对象v
未实现Iterator。
Q1.2)
这些都没有实现Iterator。
这就是为什么你不能调用Iterator的任何方法。
那么Vector如何实现Iterator
它没有。 AbstractList有一个实现Iterator
的嵌套类Q1)再次?
list
是对一个对象的引用,该对象必须实现List,ArrayList才能执行(或为null)