本文共 1875 字,大约阅读时间需要 6 分钟。
a:迭代器为什么定义了一个接口而不是实现类?
假如把迭代器定义为一个类,这样我们就可以创建该类的对象,调用该类的方法来实现集合的遍历了。 但是,java中提供了很多的集合类,而这些集合类的数据结构是不同,所以它们的存储方法也是不同的, 进而它们的遍历方法也是不一样的,最终就没有把迭代器定义为一个类了。 (因为定义成一个迭代器类就是一个具体的实现了,既然是具体实现那么它们的遍历方式就是一样的了) 而无论是那种集合,都应该具备获取元素的功能,并且最好辅助以判断的功能,这样在获取前,先判断,就不容易出错。 也就是说,判断和获取功能应该是一个集合遍历所具备的,而每种集合的遍历方式又不太一样, 所以把这两个功能给提取出来,并不提供具体的实现,而这种方式叫做接口。 那么,真正的具体的实现类在哪里呢? 在真正的具体的子类中,是以内部类的方式体现的。 (因为在子类中要包含两个方法) 如下图所示:-----------------------------------------------------------------------------public interface Inteator { public abstract boolean hasNext(); // 注意:默认方法前有public abstract修饰,是接口中方法的默认修饰符 public abstract Object next(); // 注意:默认方法前有public abstract修饰,是接口中方法的默认修饰符}public interface Iterable { Iterator iterator(); // 没有具体实现,注意:默认方法前有public abstract修饰,是接口中方法的默认修饰符}-----------------------------------------------------------------------------public interface Collection extends Iterable { Iterator iterator(); // 没有具体实现,注意:默认方法前有public abstract修饰,是接口中方法的默认修饰符}public interface List extends Collection { Iterator iterator(); // 没有具体实现,注意:默认方法前有public abstract修饰,是接口中方法的默认修饰符}-----------------------------------------------------------------------------public class ArrayList implements List { public Iterator iterator() { // 具体实现 return new Itr(); } private class Itr implements Iterator { // Itr是Iterator接口的实现类 public boolean hasNext() {} public Object next(){} }}-----------------------------------------------------------------------------Collection c = new ArrayList();c.add("hello");c.add("world");c.add("java");Iterator it = c.iterator(); // new Itr();while(it.hasNext()) { String s = (String)it.next(); System.out.println(s);}-----------------------------------------------------------------------------
我的GitHub地址: 我的博客园地址: 我的蚂蚁笔记博客地址: Copyright ©2018 黑泽明军 【转载文章务必保留出处和署名,谢谢!】