1. 程式人生 > >java-OOP-抽象類和介面

java-OOP-抽象類和介面

通過兩種形式來體現OOP的抽象:介面和抽象類。

抽象類

抽象方法是一種特殊的方法:它只有宣告,而沒有具體的實現

abstract void fun();

如果一個類含有抽象方法,則稱這個類為抽象類,抽象類必須在類前用abstract關鍵字修飾。因為抽象類中含有無具體實現的方法,所以不能用抽象類建立物件。
只是用abstract修飾的話也是抽象類。也就是說抽象類不一定必須含有抽象方法。(有點雞肋了)

[public] abstract class ClassName {
    abstract void fun();
}

包含抽象方法的類稱為抽象類,但並不意味著抽象類中只能有抽象方法,它和普通類一樣,同樣可以擁有成員變數和普通的成員方法。

  • 抽象方法必須為public或者protected(因為如果為private,則不能被子類繼承,子類便無法實現該方法),預設情況下預設為public。
  • 抽象類不能用來建立物件;
  • 如果一個類繼承於一個抽象類,則子類必須實現父類的抽象方法。如果子類沒有實現父類的抽象方法,則必須將子類也定義為為abstract類。(還是乖乖實現吧)
  • 從設計角度講抽象類屬於is-A 的關係

介面

interface,在軟體工程中,介面泛指供別人呼叫的方法或者函式。從這裡,我們可以體會到Java語言設計者的初衷,它是對行為的抽象。

[public] interface InterfaceName {

}

介面中的變數會被隱式地指定為public static final變數(並且只能是public static final變數,用private修飾會報編譯錯誤),而方法會被隱式地指定為public abstract方法且只能是public abstract方法(用其他關鍵字,比如private、protected、static、 final等修飾會報編譯錯誤)介面中的方法必須都是抽象方法。
介面可以說是極度的抽象,是特殊的抽象類。並且一般情況下不在介面中定義變。

抽象類和介面的區別

抽象類可以提供成員方法的實現細節,而介面中只能存在public abstract 方法;
抽象類中的成員變數可以是各種型別的,而介面中的成員變數只能是public static final型別的;
介面中不能含有靜態程式碼塊以及靜態方法,而抽象類可以有靜態程式碼塊和靜態方法;
一個類只能繼承一個抽象類,而一個類卻可以實現多個介面。
抽象類是對一種事物的抽象,即對類抽象,而介面是對行為的抽象。
抽象類是對整個類整體進行抽象,包括屬性、行為,但是介面卻是對類區域性(行為)進行抽象。
抽象類作為很多子類的父類,它是一種模板式設計。而介面是一種行為規範,它是一種輻射式設計。對於抽象類,如果需要新增新的方法,可以直接在抽象類中新增具體的實現,子類可以不進行變更;而對於介面則不行,如果介面進行了變更,則所有實現這個介面的類都必須進行相應的改動。

interface Alram {
    void alarm();
}

abstract class Door {
    void open();
    void close();
}

class AlarmDoor extends Door implements Alarm {
    void oepn() {
      //....
    }
    void close() {
      //....
    }
    void alarm() {
      //....
    }
}