1. 程式人生 > >【Java核心知識三】抽象類和介面

【Java核心知識三】抽象類和介面

介面和內部類為我們提供了一種將介面和實現分離的更加結構化的方法

抽象類和抽象方法

  • 抽象方法:不完整,僅有申明而沒有方法體。
abstract void f();
  • 抽象類:
    • 包含(一個或者多個)抽象方法的類。
    • 是普通類和介面的中庸之道。
    • 若繼承抽象類並建立新類的物件,則
      • 1)必須為基類中的所有抽象方法提供方法定義。
      • 2)或者匯出類也是抽象類(編譯器強制我們用abstract限定該類)。

抽象類和抽象方法非常有用,因為他們可以使類的抽象性明確起來,並告訴使用者和編譯器打算怎樣使用他們。
抽象類還是很有用的重構工具,因為他們使得我們很容易將公共方法沿著繼承層次結構向上移動

介面

interface關鍵字使得抽象的概念更向前邁進了一步。它允許建立者確定方法名、引數列表和返回型別,但是沒有提供方法體。即:介面只提供了形式,未提供任何具體實現。

介面的作用:

  • 介面被用來實現類與類之間的協議。
  • 實現完全解耦

只要一個方法操作的是類而非介面,那麼你只能使用這個類及其子類。如果你想要將這個方法應用於不在此繼承結構中的某個類,那麼你就觸黴頭了。介面可以在很大程度上放寬這種限制,因此,他使我們可以編寫可複用性更好的程式碼。

介面和普通類相似點:

  • 一個介面可以有多個方法。
  • 介面檔案儲存在 .java 結尾的檔案中,檔名使用介面名。
  • 介面的位元組碼檔案儲存在 .class 結尾的檔案中。
  • 介面相應的位元組碼檔案必須在與包名稱相匹配的目錄結構中。

介面與普通類的區別:

  • 介面不能用於例項化物件。
  • 介面沒有構造方法。
  • 介面中所有的方法必須是抽象方法。
  • 介面不能包含成員變數(除了 static 和 final 變數)。
  • 介面不是被類繼承了,而是要被類實現。
  • 介面支援多繼承。

介面和抽象類的區別:

  • 抽象類中的方法可以有方法體,就是能實現方法的具體功能,但是介面中的方法不行。
  • 抽象類中的成員變數可以是各種型別的,而介面中的成員變數只能是 public static final 型別的。
  • 介面中不能含有靜態程式碼塊以及靜態方法(用 static 修飾的方法),而抽象類是可以有靜態程式碼塊和靜態方法。
  • 一個類只能繼承一個抽象類,而一個類卻可以實現多個介面。

Java中的多重繼承:

interface CanFight { void fight(); }

interface CanSwim { void swim(); }

interface CanFly { void fly(); }

calss ActionMan { public void fight() {} }

class SuperMan extends ActionMan implements CanFight, CanSwim, CanFly {
    public void swim() {}
    public void fly() {}
}

public class Adventure {
    public statiic void t(CanFight x) { x.fight(); }
    public statiic void u(CanSwim x) { x.swim(); }
    public statiic void v(CanFly x) { x.fly(); }
    public statiic void m(ActionMan x) { x.fight(); }
    public static void main(String[] args) {
        SuperMan s = new SuperMan();
        t(s); // SuperMan向上轉型為CanFight
        u(s); // SuperMan向上轉型為CanSwim
        v(s); // SuperMan向上轉型為CanFly
        w(s); // SuperMan向上轉型為ActionMan
    }
}
  • 上述的例子是使用介面核心原因為了能夠向上轉型為多個基類(以及由此帶來的靈活性)
  • 使用介面的第二個原因與使用抽象基類一樣:防止客戶端程式設計師建立該類的物件,並確保這僅僅是一個介面。
  • 選哪個?
    • 如果建立不帶任何方法定義和成員變數的基類,就應該選擇介面而非抽象類。
    • 事實上,如果知道某事物應該成為一個基類,第一選擇應該是的使他成為介面。