A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 小冰块 于 2013-6-13 15:00 编辑

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

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

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

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


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


9 个回复

倒序浏览
这是java中多态的表现形式,父类引用指向子类对象!接口是一个抽象类,只有方法名没有实体,所以在使用该类方法时要先去实现接口中的方法!
回复 使用道具 举报
hadexs 发表于 2013-6-13 01:52
这是java中多态的表现形式,父类引用指向子类对象!接口是一个抽象类,只有方法名没有实体,所以在使用该类 ...

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

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

所以 你把接口和基类都可以看成是父级别的就行了   
回复 使用道具 举报
神之梦 发表于 2013-6-13 07:22
明白楼主纠结的问题,子类实现接口与继承父类的最主要区别就是:接口中的方法没有实体,需要子类进行覆盖; ...

嗯,明白一些了,谢谢!
回复 使用道具 举报
张歆明 发表于 2013-6-13 07:52
楼主 很好理解  这也是多态的一种  接口和基类都属于父亲一级别的  
只不过 接口里面的方法都是抽象的  没 ...

明白了,谢谢解答。
回复 使用道具 举报
小冰块 发表于 2013-6-13 10:03
明白了,谢谢解答。

恩恩  不客气 哈哈
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马