问题描述
在Java中,对于HashMap的定义是这样的:public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Cloneable, Serializable 我想知道的是,为什么HashMap的父类AbstractMap已经implements了Map<K,V>接口,而在HashMap的定义中又再一次的声明implements Map<K,V>接口呢,这么做有什么意义呢? 我记得我学长给我的答案是为了更好的面向接口编程,但有些模糊,请大家指导一下;
解决方案
从编译和运行的角度来说,没有意义。但是从读者的角度来说,有意义。你可以考虑一下如下场景:1,你定义了一个接口,里面有10个抽象方法(接口里面的都是抽象方法)2,你有9个抽象类,抽象类1继承接口,实现了1个方法(可以只实现接口的部分方法)3,抽象类2继承抽象类1,同时又多实现了一个方法4,依次类推,每个抽象类依次继承上面的抽象类,每个都多实现一个方法。5,最后你的实现类实现抽象类9,把最后一个未实现的方法实现了。那么问题来了这时候你读源代码或者文档的时候,你根本不知道你这个类实现了什么接口,如果想知道的话,就要依次把抽象类9,8。。。一直找到抽象类1的时候,你才知道你的这个实现类实际上是实现了你第一步定义的接口,这样是不是对读者很不友好?如果每一层都明确声明实现了第一步的接口,那么你看实现类或者任一层次的抽象类的时候,你都不需要再找别的继承关系的类了,因为你可以直接跳到接口去看定义就可以了。这就是对读者友好的体现,推荐你以后的开发中注意这一点,代码主要是给人看的,对于机器来说,他只需要2进制字节就可以了。#你学长是忽悠你的,愿意钻研是好习惯,希望保持下去!
解决方案二:
学习下~~~~~~~~~~~~
解决方案三:
1、与面向接口编程没什么关系,因为不管是否声明implements Map<K,V>,对于使用者来说都没有什么影响;2、这个模式在JDK的很多集合类里面都在使用,我本人更倾向于增强可读性的说法 。看了HashMap的Javadoc马上就知道是实现了Map的接口(当然,通过AbstractMap也是可以知道的) 。对Map接口的Javadoc,能够明确的知道哪些类实现了这个接口:我没有测试过,猜想可能是生成Javadoc的时候对于接口的Implement只识别了一层,这样的情况下如果不明确声明的情况下接口的实现类列表里面就没有HashMap了。
解决方案四:
对“更好的面向接口编程”表示同意。通过源码可知:1:AbstractMap<K,V>对“实现Map接口所需做的工作”进行了最小化,即当需实现“unmodifiable不可修改”/“modifiable可修改”的Map时只需少量工作;2:HashMap<K,V>实现了Map接口的所有方法,除了clone()外无其他方法使用super,实现了AbstractMap中的entrySet方法;所以HashMap代码逻辑与AbstractMap的关系很小,类之间只有extend关系。另概念:父类引用指向子类对象代码:HashMap<String, String> map = new HashMap<String, String>();AbstractMap<String, String> aMap = map;Map<String, String> mMap = map;HashMap实例可以被AbstractMap或Map引用,实际使用更灵活。
解决方案五:
AbstractMap 和 Hashmap 里面都有对map的实现, 如果HashMap不implements Map, 那就是HashMap对AbstractMap 方法的覆盖.如果implements Map, 那就是对Map接口的实现.这个从语法方面讲,还是有些区别的.