-
1 # 啊雄的分享
-
2 # 架構師訓練營
回答此問題前,先上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(); 此語句表示方法的抽象,無實現。
介面和抽象類的區別:
抽象類只能繼承一次,但是可以實現多個介面;介面和抽象類必須實現其中所有的方法,抽象類中如果有未實現的抽象方法,那麼子類也需要定義為抽象類。抽象類中可以有非抽象的方法;介面中的變數必須用 public static final 修飾,並且需要給出初始值。所以實現類不能重新定義,也不能改變其值。介面中的方法預設是 public abstract,也只能是這個型別。不能是 static,介面中的方法也不允許子類覆寫,抽象類中允許有static 的方法。介面和抽象類的核心一點,總結一句話:Java特有的介面機制突破了Java單繼承的缺陷,使之擁有了C++一樣的多繼承功能。
2. 介面和抽象類如何選擇?1. 如果預計要建立類的多個版本,則建立抽象類。抽象類提供簡單的方法來控制類版本。
2. 如果建立的功能將在大範圍的異類物件間使用,則使用介面。
3. 如果要設計小而簡練的功能塊,則使用介面。
4. 如果要設計大的功能單元,則使用抽象類。
5. 如果要向類的所有子類提供通用的已實現功能,則使用抽象
3 針對介面而非物件程式設計!如果上述介面改為抽象類來實現,除了架構問題,使用相關java容器時,如何實現針對介面程式設計?
回覆列表
不正確,java是單繼承的,如果頂層是抽象類,對於後面的程式碼擴充套件很不利的。而java的介面是多實現的,java官方對於Collection和set、List設計的也都是介面來設計,符合了java的介面多少實現的特性。如果都是設計成抽象類,後面我們在實際開發中,自己的類就沒法實現了。具體它們的結構如下:
Collection 介面的介面 物件的集合(單列集合)
├——-List 介面:元素按進入先後有序儲存,可重複
│—————-├ ArrayList 介面實現類, 陣列, 隨機訪問, 沒有同步, 執行緒不安全
│—————-└ Vector 介面實現類 陣列, 同步, 執行緒安全
│ ———————-└ Stack 是Vector類的實現類
└——-Set 介面: 僅接收一次,不可重複,並做內部排序
├—————-└HashSet 使用hash表(陣列)儲存元素
│————————└ LinkedHashSet 連結串列維護元素的插入次序
└ —————-TreeSet 底層實現為二叉樹,元素排好序