黑马程序员技术交流社区
标题:
接口能够创建对象吗
[打印本页]
作者:
程立彬
时间:
2011-11-21 15:30
标题:
接口能够创建对象吗
本帖最后由 程立彬 于 2011-11-23 13:26 编辑
在集合类ArrayList里面,有这样的方法 Iterator() 调用这个是创建了Iterator接口对象吗,那么用这种方法创建和用new方法创建有什么区别呢???
作者:
崔浩
时间:
2011-11-21 15:51
没有什么区别的,内部的最终是通过new的,像单例,还有工厂类,必须提供一些对外的方法来返回一个对象,
你这个是,子类对象指向父类的引用。
像返回int,String 等其他的返回值类型一样
作者:
申绪胜
时间:
2011-11-21 15:54
接口不可以创建对象,因为没什么意义,
只要继承于这个接口的类实现了接口的方法就可以了
试问,你如果要创建对象,干嘛不定义一个抽象类,而非要用接口呢?
用接口就是为了方便,并且能钩降低低通的耦合度,而且还可以让互相合作的两家公司在不知道对方代码的前提下用接口完成对接操作
作者:
肖岑锋
时间:
2011-11-21 16:02
接口是不能实例化对象的
如果你说的是这样一段代码的话
ArrayList a=new ArrayList();
Iterator it=a.iterator();
那么应该用多态来理解。接口的引用调用接口的实现类。也就是说ArrayList这个类有实现了Iterator接口的方法Iterator(),返回值为一个Iterator实现类
作者:
柴亚飞
时间:
2011-11-21 16:07
Iterator() 方法生成的对象是一个具体实现Iterator接口的对象,在你调用这个方法之前,你肯定创建了一个Arraylist对象,这个生成的Iterator对象是针对于这个ArrayList的对象。
接口是不能new接口的。接口引用可以指向一个实现了这个接口的类的实例。new后面接的应该是类。类实现了接口。Iterator是接口,那它就不能被new。被new的一定是实现了它的一个类。
建议你按iterator和arraylist的结构写一个类似的代码。看看源码中他们的关系。写一个接口A,写一个实现了这个接口的类B,再写一个使用B类的类c,在c中写一个方法返回值是类型是A.
这样你才能深刻的理解接口和抽象类(接口是一种特殊的抽象类)。(我建议你写一些实际的应用,如俄罗斯方块,我以前有很多知识都不明白,但硬着头皮写出这个游戏后我明白了很多。)
作者:
宋伟
时间:
2011-11-21 16:43
接口是不能实例化的,接口里面的方法都是抽象的,不能被实现,所以不能new对象,你所说的ArrayList这个集合类是调用了iterator()方法,返回了一个实现Iterator接口的对象
作者:
张志东
时间:
2011-11-21 20:50
我补充一点:开始的时候我们都会很郁闷这样一件事情:语法上说接口不可以“创建”对象,而我们在程序中往往会使用类似 List list = new ArrayList(); 的用法,你就会有些郁闷和不解,当然这里涉及的学问很多,我理解的也不够深,在这里说一点视频里看到的一点:我们创建接口对象的时候使用起来更灵活。这好像是什么也没有说。
作者:
柴亚飞
时间:
2011-11-22 01:19
List list = new ArrayList();在这句话中,创建了ArrayList这个类的使用,但是list是一个接口引用。new出来的不是接口,而是一个包含了实现List接口的类的实例(对象)。之所以说灵活,是针对后期维护(个人理解),后期很容易用更好的实现来代替(可能开发时用一个类,后期出了个更好的类)。用一个list引用指向一个ArrayList的对象,就意味着通过这个引用只能使用这个引用代表的类型,即使ArrayList中有更多的方法,对list来说也只能使用List中包含的方法,ArrayList中的其他方法对list来说是不可见的
作者:
柴亚飞
时间:
2011-11-22 01:20
“创建了ArrayList这个类的使用”----》“创建了ArrayList这个类的实例”
作者:
刘元霄
时间:
2011-11-22 01:39
接口 不能被创建对象, 只有接口被类实现后,并把接口里所有抽象方法 复写后才可创建该类对象。
作者:
embassy
时间:
2013-5-3 20:12
首先 ,你要明白一点: List list是定义接口变量 而 new ArrayList()才是构建对象
List可以是接口也可以是类,他都是数据类型 只要他是父类(可以是他本身)或父接口
我认为List是类或是接口的区别在于:
List为类时: 更换类名时,意味着原有的代码也要修改: List可能被修改
List为接口时: 接口只是个定义,不管你怎样去实现只要定义不发生改变.原来的代码就不用修改: List可以不修改. 如果在添加动态实例对象(使用反射),此时的接口就像分割线一样;就算实现部分发生了改变也不会影响到原来的代码更不需要去修改: 面向修改封闭,面向扩展开放.
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2