抽象類和介面之間的區別是一個流行的問試問題。抽象類和介面是java編程語言的核心部分。是選擇介面還是抽象類是每個架構師都面臨的設計決策。
在本系列Java教學中,提供了有關java介面和抽象類的講解和示例。
抽象類和介面都用於實現抽象,可以聲明抽象方法。抽象類和介面都不能被實例化。但是在下面給出的抽象類和介面之間有許多區別。
抽象類 | 介面 |
---|---|
抽象類可以有抽象和非抽象方法。 | 介面只能有抽象方法。從Java 8開始,它也可以有默認和靜態方法。 |
抽象類不支持多重繼承。 | 介面支持多繼承。 |
抽象類可以有final ,非final ,靜態和非靜態變數。 |
介面只有靜態和final 變數。 |
抽象類可以提供介面的實現。 | 介面不能提供抽象類的實現。 |
abstract 關鍵字用來聲明抽象類。 |
interface 關鍵字用於聲明介面。 |
簡單地說,抽象類實現了部分抽象(0到100%),而介面實現了完全抽象(100%)。
使用抽象類和介面
在大多數時候,使用介面和抽象類是設計系統的最佳方法,例如在JDK中java.util.List
是一個包含很多方法的介面,因此有一個抽象類 - java.util.AbstractLis
為List
介面的所有方法提供基礎實現,以便任何子類都可以擴展此類並僅實現所需的方法。
應該始終以介面為基礎並在定義每個子類時都應該實現方法,如果有一些方法只應該實現某些子類,可以擴展基介面並使用這些方法創建一個新介面。子類可以選擇在基介面或子介面之間進行選擇,以根據其要求實現。如果方法的數量增長很多,那麼提供一個實現子介面的骨架抽象類並為子類提供在介面和抽象類之間進行選擇的靈活性也是一個不錯的做法。
Java抽象類和介面的示例
讓我們來看看下麵一個簡單的例子,使用介面和抽象類。
//創建具有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