抽象類和介面之間的區別是一個流行的問試問題。抽象類和介面是java程式設計語言的核心部分。是選擇介面還是抽象類是每個架構師都面臨的設計決策。
在本系列Java教學中,提供了有關java介面和抽象類的講解和範例。
抽象類和介面都用於實現抽象,可以宣告抽象方法。抽象類和介面都不能被範例化。但是在下面給出的抽象類和介面之間有許多區別。
抽象類 | 介面 |
---|---|
抽象類可以有抽象和非抽象方法。 | 介面只能有抽象方法。從Java 8開始,它也可以有預設和靜態方法。 |
抽象類不支援多重繼承。 | 介面支援多繼承。 |
抽象類可以有final ,非final ,靜態和非靜態變數。 |
介面只有靜態和final 變數。 |
抽象類可以提供介面的實現。 | 介面不能提供抽象類的實現。 |
abstract 關鍵字用來宣告抽象類。 |
interface 關鍵字用於宣告介面。 |
簡單地說,抽象類實現了部分抽象(0到100%),而介面實現了完全抽象(100%)。
在大多數時候,使用介面和抽象類是設計系統的最佳方法,例如在JDK中java.util.List
是一個包含很多方法的介面,因此有一個抽象類 - java.util.AbstractLis
為List
介面的所有方法提供基礎實現,以便任何子類都可以擴充套件此類並僅實現所需的方法。
應該始終以介面為基礎並在定義每個子類時都應該實現方法,如果有一些方法只應該實現某些子類,可以擴充套件基介面並使用這些方法建立一個新介面。子類可以選擇在基介面或子介面之間進行選擇,以根據其要求實現。如果方法的數量增長很多,那麼提供一個實現子介面的骨架抽象類並為子類提供在介面和抽象類之間進行選擇的靈活性也是一個不錯的做法。
讓我們來看看下面一個簡單的例子,使用介面和抽象類。
//建立具有4種方法的介面
interface A {
void a();// 預設使用修辭符是:public 和 abstract
void b();
void c();
void d();
}
// 建立實現介面A的方法的抽象類
//
abstract class B implements A {
public void c() {
System.out.println("I am C");
}
}
// 建立抽象類的子類,需要提供抽象類方法的實現
class M extends B {
public void a() {
System.out.println("I am a");
}
public void b() {
System.out.println("I am b");
}
public void d() {
System.out.println("I am d");
}
}
// 建立一個呼叫A介面方法的測試類
class Test5 {
public static void main(String args[]) {
A a = new M();
a.a();
a.b();
a.c();
a.d();
}
}
執行上面的範例程式碼,得到以下結果 -
I am a
I am b
I am c
I am d