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

dingxw92 2008-01-30 12:45:25
如题
...全文
1114 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是否受用?
内容概要:本文提出一种基于灰狼优化算法(GWO)优化改进互补集合经验模态分解(CEEMDAN)的混合储能风电功率平抑策略。通过GWO算法对CEEMDAN的关键参数(如白噪声幅值、最大本征模态函数数量等)进行全局寻优,显著提高了信号分解的精度与自适应性,有效克服模态混叠与残余噪声问题。在此基础上,将分解后的风电功率序列按频域特征分配给电池与超级电容构成的混合储能系统,充分发挥电池长时储能与超级电容快速响应的优势,实现高频分量由超级电容平抑、低频分量由电池承担的协调控制。结合Matlab平台完成算法仿真与系统建模,验证了该方法在平抑风电功率波动、降低储能系统综合损耗、延长设备寿命及提升电网电能质量与运行稳定性方面的优越性能。; 适合人群:具备一定电力系统分析、可再生能源并网技术、现代信号处理(如EMD方法)及智能优化算法基础的研究生、科研人员及从事新能源发电控制、储能系统设计与智能电网调度的工程技术人员。; 使用场景及目标:①应用于风电场配套混合储能系统的实时功率协调控制,提升并网友好性;②优化非平稳、非线性风电功率信号的自适应分解精度,服务于后续预测与调度;③结合GWO等群智能优化算法,提升储能系统在平抑可再生能源波动的动态响应能力、运行经济性与工程实用性。; 阅读建议:建议读者结合提供的Matlab代码深入理解GWO优化CEEMDAN参数选择机制与混合储能功率分配逻辑,重点关注信号分解效果评价指标(如相关系数、均方根误差)与储能系统性能指标(如SOC变化、功率应力)的关联分析,可进一步拓展至多目标优化、在线滚动优化及其他智能算法(如鲸鱼优化、麻雀搜索)的对比研究。

62,621

社区成员

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

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