Java - interface



Ps1:接口命名規則:IXxx...

Ps2:接口中的interface前面的public abstract,方法前面的public abstract,屬性前面的public static final都可以省略的。可以通過繼承該接口的類查看報錯的原因反推推出系統默認的修飾符等(如圖)。

報錯提示要大於等於父類的修飾符,父類此時是沒有寫修飾符,那麼如果是 default 修飾符的話,那麼子類這裏不寫應該也是OK的,protected 同理失敗,推論可得是 public 修飾符。

Ps3:static final 也同上可以反推出。

Ps4:如果接口中的變量和implements該接口的類的變量同名,則倘若用接口聲明該類則調用的是接口中的變量;否則用派生類調用的是派生類的變量。

這沒什麼難理解的,記住之前的一點:因爲靜態成員無法被重寫只是被隱藏,所以這裏根本就沒重寫父類這一說法,而父類本身就不能調用子類特有的方法,自然而然肯定調的還是父類自己的靜態成員。

Ps5:JDK 1.8 開始(如圖)

  • 新增 靜態成員調用:接口名.靜態成員
  • 新增 default成員調用:接口名.super.default 成員接口實例對象.default 成員(這裏的“default”不是訪問修飾符,而是有這個關鍵字!!!)
    Tip:在重寫“default”方法的時候,默認省略了“default”關鍵字。

Ps6:關於多接口中重名默認方法處理的解決方案:

  1. 如果一個類沒有繼承父類,而且遇上接口中重名默認方法,則需要自己在該類中寫一個一樣的默認方法來解決衝突,否則該類報錯CE(如圖)


  2. 如果一個類繼承了父類,而且遇上接口中重名默認方法,以及父類中也有重名默認方法,則父類的重名方法優先(不會報錯,因爲父類已經實現了,而子類繼承了),如果繼續在該類重寫該方法時,重寫的是父類的方法,自然而然接口去調用的也是該類重寫的方法(如圖)




Ps7:關於多重接口名常量處理的解決方案:

  1. 如果一個類沒有繼承父類,而且遇上接口中重名常量名,則需要"接口名.常量名"來解決衝突(如圖)
  2. 如果一個類繼承了父類,而且遇上接口中重名常量名,以及父類中也有重名常量名(這次不會像上次默認方法可以解決衝突),則需要在該子類中,編寫一個同樣的常量名以解決衝突(如圖)

Ps8:接口也支持接口間的繼承,而且是多繼承;那如果接口繼承的父接口遇到同名的默認方法怎麼辦?只需要在子接口重寫同名的默認方法即可。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章