Java中的HashMap继承了AbstractMap类并实现了Map接口,而AbstractMap也实现了Map接口,这样一来HashMap就实现了两次Map接口,Sun为什么这么做?

dingxw92 2008-01-30 12:45:25
如题
...全文
931 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
pingguotian 2009-05-09
  • 打赏
  • 举报
回复
挺不错的,很详细,也很挺好理解的
嘻嘻
Dan1980 2008-02-01
  • 打赏
  • 举报
回复
何必把问题想得那么复杂?

其实,个人认为,就是为了增强点可读性罢了。

HashMap继承了AbstractMap就是实现了Map,再来一个implements Map,没有任何实质性的作用。

但是,因为Map比AbstractMap的知名度要高得多,如果HashMap的接口列表有一个Map,那么读者一眼就可以判断出HashMap“是一个”Map;
而如果单是extends AbstractMap,字面上体现不出这一点。
毕竟,绝大多数java程序员更关心一个类是否是一个Map,而很少关心一个类是否是一个AbstractMap。

不光是Map家族,List,Set也都一样,ArrayList继承AbstractList又实现List,HashSet继承AbstractSet又实现Set,等等。。。。

呵呵。。。。
wdman 2008-02-01
  • 打赏
  • 举报
回复
AttributeMap, ConcurrentHashMap, NavigableSubMap
这些也都实现了Map接口
dingxw92 2008-02-01
  • 打赏
  • 举报
回复
Narcist 说的不错
Narcist 2008-01-31
  • 打赏
  • 举报
回复
少了两句

一种是优先实现接口的方式
一种是优先继承的方式

根据不同的需要,用不同的方式!
这个需要只有你自己明白
Narcist 2008-01-31
  • 打赏
  • 举报
回复
其实除了SUN自己知道为什么这么做以外,其他人也只是猜测
猜测的结果符合你的思想就可以说是对的,也就是你所认同的
首先一个类要有一个接口的功能就要实现它(这个类是独自存
在的,没有继承其他类,不依赖父类,有父类没父类我都可以
用,因为我实现了接口,即使继承了一个同样实现接口的类,
也和我没什么关系,只是我可以使用我所继承类的方法)
或是
继承实现接口的类(虽然这个类也可以使用接口的功能,但这
种继承依赖父类,就是当父类不存在的时候,子类也没有存在
的必要,)

有的时候按照中国的文化很难明白外国人是怎么想的
大家都觉得父与子的关系比遵循协议更重要,子继承父天经地义的正确,
其实计算机不知道你什么父什么子的这种关系有多密切,在原则的世界里,
想用我的东西,就要先满足我的要求(协议),剩下的你愿意是
谁的儿子就是谁的儿子!------这样就出现了有的类先实现接口,
然后也凑巧继承了实现接口的其他类,这个父类也只是子类完成需
求的一个工具,不存在伦理关系!
第二个:有的类直接继承父类,而拥有了一些父类实现接口的方法。
这样子类只是拿来用你父类的东西,其他的事情子类什么也不管,子
类不需要知道父类实现什么什么接口,子类也不需要实现什么什么接口!
你父类有,我就能用!如果父类废弃那么
他的这个子类没有存在的意义,一样的被废弃。和他通过父类实现接
口没有关系,再说那也不是你子类实现的,只是你可以直接拿来用!

两种不同的方式也只是解决不同的业务需求,解决同一件事情的方法有很多
上面的也只是两种而已,根据情况选择用那种!你要是编写自己的类和接口
的话,在不同的业务需求上也会有以上的不同选择,找更好的去做!至于为什么
这么做也只有SUN知道,只有它才能了解业务需求是什么样的,怎么继承或者实现
才能满足多数人的需求!

很惭愧,我一中国人中文学得这么滥!可能不是很明白!见谅

以上仅代表个人意见
老紫竹 2008-01-30
  • 打赏
  • 举报
回复
有问题吗,很正常啊!
HashMap 继承自 AbstractMap, 既然父类实现了 Map 接口,子类当然也实现了Map接口。 不这样才奇怪呢!
dingxw92 2008-01-30
  • 打赏
  • 举报
回复
7楼说的有点意思
不过我感觉这个问题似乎还是没有找到根源
有的Map继承了AbstractMap类,如: AttributeMap, ConcurrentHashMap, NavigableSubMap等等
但是没有直接实现Map接口
有的类像HashMap一样,既继承自已经实现Map的类,又直接实现了Map接口
如: IdentityHashMap, WeakHashMap, SubMap等等
如果AbstractMap类被废弃,HashMap是谁的子类?
但是在java API中找不到关于任何要废弃该类的意思
Sun这样做似乎另有用意

继续等待中...
Narcist 2008-01-30
  • 打赏
  • 举报
回复
所有想具有Map接口的功能都要先实现Map接口
然后你愿意继承什么继承什么!包括继承同样
实现Map接口的类!
Narcist 2008-01-30
  • 打赏
  • 举报
回复
如果HashMap从AbstractMap继承下来,拥有Map接口。
未来的日子里,如果AbstractMap类被废弃,HashMap是谁的子类?它什么也不是
如果HashMap先实现Map接口,不管AbstractMap存不存在,我都是遵循协议生存,有AbstractMap的时候HashMap
可以多用几个方法,没有他,HashMap少用几个方法,或者自己写。
老紫竹 2008-01-30
  • 打赏
  • 举报
回复
什么叫继承,继承就是我什么都不做,我依然拥有父类,以及父类的父类的所有功能和状态。

因为我是子类,我可以变成任何一个父类!
duansky1 2008-01-30
  • 打赏
  • 举报
回复
同意4 楼的,我上面有说“必须implements Map,否则重写不了”,这句是错误的。因为子类是可以直接重写父类的方法
Narcist 2008-01-30
  • 打赏
  • 举报
回复
哦,对了
为什么都要先实现Map接口呢?
因为接口可以说是一种统一协议,既然你要用我的东西,必须先遵守我的这个协议(个人见解)
Narcist 2008-01-30
  • 打赏
  • 举报
回复
首先AbstractMap和HashMap都实现了Map接口
HashMap需要使用AbstractMap类的方法,所以继承AbstractMap
就这样感觉好像是实现了两次Map接口

duansky1 2008-01-30
  • 打赏
  • 举报
回复
就拿remove(Object key)方法来说,Map接口中定义了此方法,AbstractMap实现了此方法,如果HashMap想要重写此方法就必须implements Map,否则重写不了,我的理解就是这样的,不知道LZ是否受用?

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧