黑马程序员技术交流社区

标题: 关于接口的使用格式问题,非常好奇!! [打印本页]

作者: 小冰块    时间: 2013-6-13 01:30
标题: 关于接口的使用格式问题,非常好奇!!
本帖最后由 小冰块 于 2013-6-13 15:00 编辑

今天看毕老师将Map的时候忽然注意到他这么写:

Map<String,String> map = new HashMap<String,String>();

开始的时候我以为Map是父类,还在疑惑为什么要用多态,一翻API才发现Map是接口
(我是有多后知后觉,List,Iterator都是接口,之前也一直都是这么写的,却没有注意到)

但是不论我怎么搜,网上或者API文档给出的接口使用格式都是implements(实现),从来没说可以直接将接口引用指向以实现类的对象。


所以我就好奇为什么接口可以这么用,那我们以后写程序的时候什么情况下可以不用实现接口,而是直接用接口定义对象?只要有已实现类就可以吗?那和我们用以实现类直接定义对象又有什么区别呢?



作者: hadexs    时间: 2013-6-13 01:52
这是java中多态的表现形式,父类引用指向子类对象!接口是一个抽象类,只有方法名没有实体,所以在使用该类方法时要先去实现接口中的方法!
作者: 小冰块    时间: 2013-6-13 02:05
hadexs 发表于 2013-6-13 01:52
这是java中多态的表现形式,父类引用指向子类对象!接口是一个抽象类,只有方法名没有实体,所以在使用该类 ...

你没有解释我的疑惑啊,我知道多态是只父类引用指向子类对象,但问题是Map是接口,并不是父类,他和HashMap之间并没有extends继承关系,只有实现关系,那么为什么接口可以用多态的方式去实现?

作者: 孙百鑫    时间: 2013-6-13 06:46
关于接口楼主您看看
  1:是用关键字interface定义的。
  2:接口中包含的成员,最常见的有全局常量、抽象方法。
  3:接口中有抽象方法,说明接口不可以实例化。接口的子类必须实现了接口中所有的抽象方法后,该子类才可以实例化。否则,该子类还是一个抽象类。
  4:类与类之间存在着继承关系,类与接口中间存在的是实现关系。
          继承用extends  ;实现用implements ;
  5:接口和类不一样的地方,就是,接口可以被多实现,这就是多继承改良后的结果。java将多继承机制通过多现实来体现。
  6:一个类在继承另一个类的同时,还可以实现多个接口。所以接口的出现避免了单继承的局限性。还可以将类进行功能的扩展。
  7:其实java中是有多继承的。接口与接口之间存在着继承关系,接口可以多继承接口。
作者: 神之梦    时间: 2013-6-13 07:22
明白楼主纠结的问题,子类实现接口与继承父类的最主要区别就是:接口中的方法没有实体,需要子类进行覆盖;而对于父类的方法,子类可以覆盖,也可以直接调用。既然可以利用多态将父类引用指向子类对象,接口是不是也可以这么写!爪机无力给楼主去API中找例子。对于楼主的问题:
1、写程序的时候什么情况下可以不用实现接口,而是直接用接口定义对象?只要有已实现类就可以吗?
只要java中提供的接口,我们都可以用其指向实现类对象,注意这不是直接用接口创建对象,而只是将接口的引用指向了实现他的类的对象。对于自己创建的接口,肯定需要实现才可以使用了。

2、那和我们用以实现类直接定义对象又有什么区别呢?
区别跟父类引用指向子类对象的区别差不多,用接口引用指向实现类的对象,那其只能调用接口中的方法,而不能调用实现类的特有方法。而如果用实现类直接定义对象,可以使用自己的特有方法和成员。
楼主找下API的示例,肯定这么调用的例子。。。。。。。。
作者: Renica    时间: 2013-6-13 07:28
大早晨连报纸都抢不上。
作者: 张歆明    时间: 2013-6-13 07:52
楼主 很好理解  这也是多态的一种  接口和基类都属于父亲一级别的  
只不过 接口里面的方法都是抽象的  没有实现体 用不了  所以硬性规定
必须子类实现里面的方法  但是  基类的方法(除抽象类之外)  都有实现   
可以用 所以不强制要求子类实现
所以  你觉得父类的方法好 你就用 不好 你就重写

所以 你把接口和基类都可以看成是父级别的就行了   
作者: 小冰块    时间: 2013-6-13 10:03
神之梦 发表于 2013-6-13 07:22
明白楼主纠结的问题,子类实现接口与继承父类的最主要区别就是:接口中的方法没有实体,需要子类进行覆盖; ...

嗯,明白一些了,谢谢!
作者: 小冰块    时间: 2013-6-13 10:03
张歆明 发表于 2013-6-13 07:52
楼主 很好理解  这也是多态的一种  接口和基类都属于父亲一级别的  
只不过 接口里面的方法都是抽象的  没 ...

明白了,谢谢解答。
作者: 张歆明    时间: 2013-6-13 10:24
小冰块 发表于 2013-6-13 10:03
明白了,谢谢解答。

恩恩  不客气 哈哈




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