Java中抽象類和介面的區別
Java中抽象類與介面的區別
抽象類
什麼是抽象類?
在繼承時,許多的子類方法才會比較具體,但我們在父類中只能給出比較通用的定義,比如說計算面積,對於不同的派生類會有不同的實現方法,比如三角形和矩形的面積計算公式就是不一樣的,子類派生出後才能使得類的方法變得具體,這時含有沒有具體定義的方法的父類就是抽象類(abstract class)。當一個父類是抽象類時,它沒有具體的例項。
定義格式
在class前加上abstract關鍵字,就定義了一個抽象類
/*例如*/ public abstract class Base {}
抽象類中的方法成員
- 抽象類的構造方法應該定義為protected,因為其不應該被例項化物件且構造方法需要被子類呼叫
- 抽象類的方法可以是抽象方法也可以是普通方法
- 如果一個類有抽象方法,那必須定義為抽象類
- 抽象方法必須定義為protected或public,預設是public
抽象類的屬性成員
抽象類中的屬性和普通類沒有區別,但他只能被子類呼叫
注意事項
1. 子類繼承抽象類時如果想要把子類例項化,那就必須把抽象類中的抽象方法全部重寫,否則必須在子類前加abstract,使他成為抽象類
2. 抽象類不能被例項化,不能作為物件的實際型別
3. 但是抽象類可以作為物件的宣告型別來實現多型
public abstract class Shaped{ protected Shaped(){} public abstract double getArea(); } class Circle extends Shaped{ @Override double getArea() { return 34; } }
上面我們簡單的定義了一個抽象類和他的子類
我們不能例項化一個抽象類,但我們可以用他來進行多型的實現(可以把它作為宣告型別,但不能把它作為實際型別)
Shaped shape = new Circle();
System.out.println("The area of the circle is " + shape.getArea());
還可以利用陣列一樣的方式建立一連串的引用型別變數
Shaped[] s = new Shaped[10];
for (int i = 0; i < 10; i++) {
s[i] = new Circle();
}
需要注意的是抽象類只能被普通類和抽象類繼承
介面
什麼是介面?
介面在許多方面與抽象類相似,但是介面的目的是指明相關與不相關類的多個物件的共同行為,也就是說,是指明功能,而不是類。
定義格式
public interface 介面名 {}
介面方法
方法會被隱式地指定為public abstract方法且只能是public abstract方法(用其他關鍵字不可以,比如private、protected、static、 final等修飾會報編譯錯誤),並且介面中所有的方法不能有具體的實現,也就是說,介面中的方法必須都是抽象方法。
介面屬性
介面中的變數會被隱式地指定為public static final變數(並且只能是public static final變數,用private修飾會報編譯錯誤)
implements
格式:class Son implements Father
多繼承
介面支援多繼承,即一個介面可以extends多個介面,間接的解決了Java中類的單繼承問題。
預設方法
JDK 1.8允許給介面新增非抽象的方法實現,但必須使用default關鍵字修飾,定義了default的方法可以不被實現子類所實現,但只能被實現子類的物件呼叫;如果子類實現了多個介面,並且這些介面包含一樣的預設方法,則子類必須重寫預設方法。
靜態方法
JDK 1.8中允許使用static關鍵字修飾一個方法,並提供實現,稱為介面靜態方法。介面靜態方法只能通過介面呼叫。
格式:介面名.靜態方法名
抽象類和介面比較
相同點
-
都不能被例項化
-
抽象方法都必須被子類重寫才能例項化
不同點
引數 | 抽象類 | 介面 |
---|---|---|
預設建構函式 | 有預設構造方法 | 不存在構造方法 |
定義 | class abstract | interface |
繼承 | extends,由抽象類和普通類繼承,只能單繼承 | 能被介面和普通類繼承,可以多繼承,也可以被抽象類實現 |
新增新方法 | 只需要在抽象類中新增方法 | 必須將全部子方法重寫 |
應用場景
-
抽象類
如果你擁有一些方法並且想讓它們中的一些有預設實現,那麼可以使用抽象類
如果基本功能在不斷改變,那麼就需要使用抽象類
-
介面
如果你想實現多重繼承,那麼你必須使用介面。由於Java不支援多繼承,子類不能夠繼承多個類,但可以實現多個介面。因此你就可以使用介面來解決它。
如果方法不需要一直改變,你可以使用介面