Java集合類庫的頂層裡的Collection,List,Set是抽象類的話是否更“正確”一些?

紅楓似血


回答此問題前,先上Java的容器架構圖:

看了上述架構後,應該不會再問上述問題了。如果還會問的話,再展開一二:

1. Java中接口和抽象類的區別?

2. 接口和抽象類如何選擇?

3. 針對接口而非對象編程!

1. Java中接口和抽象類的區別?

接口

1. 因為java不支持多重繼承,所以有了接口,一個類只能繼承一個父類,但可以實現多個接口,接口本身也可以繼承多個接口。

2. 接口裡面的成員變量默認都是public static final類型的。必須被顯示的初始化。

3. 接口裡面的方法默認都是public abstract類型的。隱式聲明。

4. 接口沒有構造方法,不能被實例化。

5. 接口不能實現另一個接口,但可以繼承多個接口。

6. 類如果實現了一個接口,那麼必須實現接口裡面的所有抽象方法,否則類要被定義為抽象類。

抽象類

1. 如果將一個類聲明為abstract,此類不能生成對象,只能被繼承使用。

2. 抽象方法必須存在於抽象類中。

3. 抽象類中可以有一般的變量和一般的方法。

4. 子類繼承抽象類必須實現其中抽象方法,除非子類為抽象類。 private void print(){};此語句表示方法的空實現。 abstract void print(); 此語句表示方法的抽象,無實現。

接口和抽象類的區別:

  1. 抽象類只能繼承一次,但是可以實現多個接口;
  2. 接口和抽象類必須實現其中所有的方法,抽象類中如果有未實現的抽象方法,那麼子類也需要定義為抽象類。抽象類中可以有非抽象的方法;
  3. 接口中的變量必須用 public static final 修飾,並且需要給出初始值。所以實現類不能重新定義,也不能改變其值。
  4. 接口中的方法默認是 public abstract,也只能是這個類型。不能是 static,接口中的方法也不允許子類覆寫,抽象類中允許有static 的方法。

接口和抽象類的核心一點,總結一句話:Java特有的接口機制突破了Java單繼承的缺陷,使之擁有了C++一樣的多繼承功能。

2. 接口和抽象類如何選擇?

1. 如果預計要創建類的多個版本,則創建抽象類。抽象類提供簡單的方法來控制類版本。

2. 如果創建的功能將在大範圍的異類對象間使用,則使用接口。

3. 如果要設計小而簡練的功能塊,則使用接口。

4. 如果要設計大的功能單元,則使用抽象類。

5. 如果要向類的所有子類提供通用的已實現功能,則使用抽象

3 針對接口而非對象編程!

如果上述接口改為抽象類來實現,除了架構問題,使用相關java容器時,如何實現針對接口編程?

篇幅有限,希望這個回答能幫到您。關注頭條號,更多相關Java技術進階乾貨文章免費分享。


架構師訓練營


不正確,java是單繼承的,如果頂層是抽象類,對於後面的代碼擴展很不利的。而java的接口是多實現的,java官方對於Collection和set、List設計的也都是接口來設計,符合了java的接口多少實現的特性。如果都是設計成抽象類,後面我們在實際開發中,自己的類就沒法實現了。具體它們的結構如下:

Collection 接口的接口 對象的集合(單列集合)

├——-List 接口:元素按進入先後有序保存,可重複

│—————-├ LinkedList 接口實現類, 鏈表, 插入刪除, 沒有同步, 線程不安全

│—————-├ ArrayList 接口實現類, 數組, 隨機訪問, 沒有同步, 線程不安全

│—————-└ Vector 接口實現類 數組, 同步, 線程安全

│ ———————-└ Stack 是Vector類的實現類

└——-Set 接口: 僅接收一次,不可重複,並做內部排序

├—————-└HashSet 使用hash表(數組)存儲元素

│————————└ LinkedHashSet 鏈表維護元素的插入次序

└ —————-TreeSet 底層實現為二叉樹,元素排好序


分享到:


相關文章: