標籤:
Java 語言中,抽象類別(abstract class) 和介面(interface) 是抽象思想的兩種體現形式.初學者很容易把這兩者搞混,所以Java面試中考抽象類別和介面的區別的面試題也常有出現的.
本文將從下面幾個方面深入探討一下Java 抽象類別和介面
一.抽象類別文法及規範
二.介面的文法及規範
三.抽象類別和介面的區別 ,將從語義細節及設計層面兩方面來描述
本文由本人查閱資料並結合自己理解所作,如果有理解不到位的地方,歡迎各位斧正.
一.抽象類別
抽象類別使用 abstract class 來定義,如果一個類使用abstract 來定義,那麼這個類就是抽象類別.
文法如下:
abstract class className{}
抽象類別的設計就是用來被繼承的,抽象類別與普通類的區別如下:
1.抽象類別不能用來建立對象.
如果一個類被定義為抽象類別 如 public class A{}, 使用 諸如 class A a = new A();等方法類試圖建立一個A 對象,編譯將會報錯.
2.抽象類別的子類必須實現父類的抽象方法,否則這個子類也必須定義為抽象類別
3.抽象的方法不能定義為private,因為抽象方法必須被實現
除了這兩個方面,抽象類別和普通的類的特性一致.
特別說明:
抽象類別一般得有抽象方法,但這不是必須的.也就是一個抽象類別裡面的方法都可以是不抽象的.
反過來,而如果一個類有抽象方法,那麼這個類一定都是抽象類別.
另外:抽象類別裡面的抽象方法如果沒有指定存取權限,那麼為default 許可權,即包內可見許可權,並不是預設為public 許可權,這個和普通類的機制一樣的.
這點需要特別注意,有人在部落格裡面說抽象方法的預設存取權限是pubulic,經過本人認證,這個是錯誤的.
二.介面
介面被聲明為 interface ,文法如下:
interface interfaceName{}
介面是抽象的高度體現,有如下的特點:
1.介面裡的所有方面預設都是 public abstract的,也只能是public abstract 所以在介面裡面定義方法,只需要定義方法名和傳回型別即可.
使用諸如 public int methodName{} 或者 public abstract void methodName{} 類似的定義其實是多此一舉.
而試圖用 protected 或者 private ,final ,static 等修飾介面中的方法,將會得到編譯錯誤提示.
2.介面裡面也可以定義變數名,而他們預設將會是 public static final 的,除了之外,變數名不予許使用其他的修飾名修飾.
介面中 例如 private int a = 1; protected int b = 2 ;之類的語句將會提示編譯錯誤.
一般不在介面裡面定義變數
3.實現介面的類必須實現介面的所有方法,除非實作類別也為抽象的.
4. 不能使用new interfaceName 來建立介面對象。
三. 抽象類別和介面的區別 1.語義細節上
抽象類別是從本質上來說,他還是一個類(class),除了上面的一些特殊約定外,他和具體類的約定一致.但是介面不是類( an interface is not a class),介面和抽象類別語義不同如下:
1) 抽象類別裡面可以有構造器.而介面不可以
2) 抽象類別裡面可以具有非抽象的方法,而介面中的所有方法都是public abstract 的,介面中的所有方法都是抽象的.
3) 抽象類別裡面可以定義各種存取權限的成員變數. 但如果在介面中定義成員變數,他們只能是 public final static 的.
4) 抽象類別可以定義靜態代碼塊,而介面不可以
5) 子類可以只能繼承一個抽象類別,但是介面的實作類別可以實現多個介面
2.設計理念選擇
1)抽象類別體現的是對事物的抽象.它是對整個類的一種抽象,這種抽象可以包含行為,屬性的抽象.但是介面是針對行為抽象.比如
貓和狗都是動物,他們都具有一些共同的特徵..所以可以抽象出一個Animal 的抽象類別,貓和狗都是Animal 的子類. 他們都具有一些動物的共同特徵.猴子也是Animal 的子類. 芒果樹不屬於動物,所以他不能繼承Animal
貓和猴子都可以爬樹, 但是他們爬樹的方式不太一樣.爬樹是一種行為的抽象.這時,就應該將爬定義為介面 Climb .裡面定義行為 climb().
貓和猴子的爬樹行為不一樣,在各自實現Climb 介面,裡面在實現各自的爬樹 climb() 即可.而狗不具有爬樹的行為,所以他不能實現爬樹的介面.
而如果將Climb 定義為抽象類別,那麼 貓和猴子就是 Climb 的子類了!顯然不合適.
2)抽象類別體現的是模板式設計的思想,子類自需繼承父類即可以具有預設的行為,以後如果在父類增加一個新的非private或default 方法,他的子類會自動具有改新增的行為,子類代碼不需要任何更改.
而介面更多體現的一種規範,它是一種輻射式的設計思想.介面一旦發布,再修改的代價就會很大. 比如在如果介面裡面增加一個新方法,它的所有實作類別都必須增加這個方法的實現.
介面類似於系統裡面的總綱.而抽象類別類似與系統中的中間產品,他們定義了一些具體的行為,也有更多的抽象行為,他們不能作為最終產品發布。
JAVA抽象類別和介面的深入探討