黑马程序员技术交流社区

标题: 关于接口的一个问题!!!! [打印本页]

作者: zippo    时间: 2014-7-30 16:12
标题: 关于接口的一个问题!!!!
本帖最后由 zippo 于 2014-8-2 22:44 编辑

ArrayList al = new ArrayList();
Iterator it = al.iterator();
第二行的代码:Iterator是一个接口,为什么可以创建一个对象呢?

作者: 付士长    时间: 2014-7-30 17:19
Iterator iterator() 是 Collection中的方法,返回一个迭代器接口的实现类对象     Iterator it = iterator()接口指向自己的实现类对象
作者: rolling-stone    时间: 2014-7-30 17:33
其实接口是一种特殊的类,所以接口属于类,类的范围更大一点
类描述了一个实体,包括实体的状态,也包括实体可能发出的动作。
接口定义了一个实体可能发出的动作。但是只是定义了这些动作的原型,没有实现,也没有任何状态信息。

类可以继承,但是接口没有可以实现,
类可以有自己的属性,接口没有。
作者: LFW    时间: 2014-7-30 19:21
我怎么没看出来Iterator有创建对象。创建对象的关键字new都没出现。。接口是特殊的抽象类,定义的方法都是必须是抽象方法,,是位于继承树顶端的类,只能被其他类所实现。接口是一种规范,按一本书的话说,接口是“总纲”,抽象类则是“模板”。
作者: zippo    时间: 2014-7-30 22:19
rolling-stone 发表于 2014-7-30 17:33
其实接口是一种特殊的类,所以接口属于类,类的范围更大一点
类描述了一个实体,包括实体的状态,也包括实 ...

说了这么多都没说重点。
作者: zippo    时间: 2014-7-30 22:20
LFW 发表于 2014-7-30 19:21
我怎么没看出来Iterator有创建对象。创建对象的关键字new都没出现。。接口是特殊的抽象类,定义的方法都是 ...

右边的不就是创建了一个左边的对象吗?不然左边的it怎么来的?
作者: rolling-stone    时间: 2014-7-30 22:31
zippo 发表于 2014-7-30 22:19
说了这么多都没说重点。

重点就是第一句话,接口也可以算一种类,所以可以创建对象。
作者: LFW    时间: 2014-7-31 15:55
rolling-stone 发表于 2014-7-30 22:31
重点就是第一句话,接口也可以算一种类,所以可以创建对象。

接口是特殊的抽象类,接口不能实例化。接口只能通过其实现类来创建对象。接口不能创建对象。
作者: 江苏孙浩    时间: 2014-7-31 17:08
iterator()是一个函数,这个函数返回一个对象并向上转型赋值给it。iterator()函数是在接口Iterable中定义的,各个容器都实现了这个接口。
作者: rolling-stone    时间: 2014-7-31 17:47
LFW 发表于 2014-7-31 15:55
接口是特殊的抽象类,接口不能实例化。接口只能通过其实现类来创建对象。接口不能创建对象。 ...

通过现类来创建对象难道就不叫创建对象吗?
作者: GoodBoy123    时间: 2014-7-31 18:31
这不是直接创建对象,而是用ArrayList里的一个iterator的方法返回一个Iterator的子类对象。这个子类是在ArrayList里的一个内部类。他实现了Iterator这个接口,那么返回来的对象当然可以用父类(接口或是类)来接收。

作者: 朱道研    时间: 2014-7-31 18:32
假设A 是个接口。实例化指的是A a = new A(); 对于接口来说这是不允许的。
假设B 类实现了A的接口   则这个实例化指的是B的实例化   A a = new B();  
总结来说。接口可以声明一个引用。但这个引用指向的是它的实现类的实例。
区别开实例化(new一个对象)和声明引用的区别
作者: LFW    时间: 2014-7-31 18:47
GoodBoy123 发表于 2014-7-31 18:31
这不是直接创建对象,而是用ArrayList里的一个iterator的方法返回一个Iterator的子类对象。这个子类是在Arr ...

我也是这么觉得,有些人就是说它创建了对象。。。。无语
作者: LFW    时间: 2014-7-31 18:48
rolling-stone 发表于 2014-7-31 17:47
通过现类来创建对象难道就不叫创建对象吗?

那你可以去问问,接口可不可以实例化。我的观点:接口的实现类可以实例化,可以创建对象;接口不能实例化,不可以创建对象、
作者: 怀念黑海岸    时间: 2014-7-31 20:33
al.iterator()返回的是一个Iterator类型的对象,语句2并不是表示你直接使用Iterator接口产生一个对象,而是将一个Iterator实现类的对象的引用赋给了it。
作者: zippo    时间: 2014-7-31 20:38
GoodBoy123 发表于 2014-7-31 18:31
这不是直接创建对象,而是用ArrayList里的一个iterator的方法返回一个Iterator的子类对象。这个子类是在Arr ...

去查了一下源代码,确实如兄台所说,谢谢了。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2