84669 人學習
152542 人學習
20005 人學習
5487 人學習
7821 人學習
359900 人學習
3350 人學習
180660 人學習
48569 人學習
18603 人學習
40936 人學習
1549 人學習
1183 人學習
32909 人學習
HashMap已经实现了Map接口,LinkedHashMap既然继承了HashMap,为什么还要implements一遍,是为了保留自己跟父类HashMap中Map方法不一样的可能性吗?如果是,那为什么不直接重写,还要再继承呢?
附:LinkedHashMap源代码
public class LinkedHashMap<K,V> extends HashMap<K,V> implements Map<K,V> { /* 省略内部代码 */ }
ringa_lee
JDK的Collection原始碼裡這種寫法是很多的。 其實我們必須承認,這種寫法是沒有任何副作用的。 但是這樣寫有一個好處,單獨打開LinkedHashMap的源码,你就知道了它继承了哪个类,并实现了哪个接口。换句话说,不用去点开HashMap的源代码才能知道原来LinkedHashMap实现了Map。也就是,你不用在繼承關係中苦苦徘徊,特別是當類別與類別之間的繼承關係很複雜的時候。
LinkedHashMap
HashMap
Map
這種出於人性化考慮的代碼寫法,還有一些例子,比如接口繼承了接口,但子接口會顯式聲明父接口中的所有方法,並顯式加上@Override 這樣的註解,以特別說明這個方法是從父介面繼承而來的,跟我自己定義的介面沒關係。
其實這也許只是Java開發者的一種做法罷了。 通常我們的需求會說某某類需要實現哪些接口,但實際上,我們如果費勁去查找這些接口相互的依賴然後去排除重複的項目,其過程是繁瑣的,況且這些重複項也會在編譯時自動處理掉。所以這些人就直接寫出那些被要求實現的類,省去人工去重的麻煩了。
你看源碼只看到了類別的定義,而沒有更深層的探索下去這樣的原因。我們知道在java中是單繼承的,只可以繼承一個類,但是可以實作多個不同的介面。
源码LinkedHashMap: public class LinkedHashMap<K,V> extends HashMap<K,V> implements Map<K,V> 源码HashMap: public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Cloneable, Serializable 之所以这样设计,我想有一下几个原因: 1.LinkedHashMap要保留Map这种数据结构的特性,因此它要实现Map所有的方法。 2.LinkedHashMap是对HashMap中无序问题提出的改进,因此,它继承了HashMap。 试想,如果你只继承了HashMap,而没有实现Map接口,那么是不是Map中的一些方法,LinkedHashMap可以不需要去实现的啊?那么LinkedHashMap保留Map这种数据结构的特性也就失去意义了。 仅供参考~~~
JDK的Collection原始碼裡這種寫法是很多的。
其實我們必須承認,這種寫法是沒有任何副作用的。
但是這樣寫有一個好處,單獨打開
LinkedHashMap
的源码,你就知道了它继承了哪个类,并实现了哪个接口。换句话说,不用去点开HashMap
的源代码才能知道原来LinkedHashMap
实现了Map
。也就是,你不用在繼承關係中苦苦徘徊,特別是當類別與類別之間的繼承關係很複雜的時候。這種出於人性化考慮的代碼寫法,還有一些例子,比如
接口繼承了接口,但子接口會顯式聲明父接口中的所有方法,並顯式加上@Override 這樣的註解,以特別說明這個方法是從父介面繼承而來的,跟我自己定義的介面沒關係。
其實這也許只是Java開發者的一種做法罷了。
通常我們的需求會說某某類需要實現哪些接口,但實際上,我們如果費勁去查找這些接口相互的依賴然後去排除重複的項目,其過程是繁瑣的,況且這些重複項也會在編譯時自動處理掉。所以這些人就直接寫出那些被要求實現的類,省去人工去重的麻煩了。
你看源碼只看到了類別的定義,而沒有更深層的探索下去這樣的原因。我們知道在java中是單繼承的,只可以繼承一個類,但是可以實作多個不同的介面。