Java 中介面與抽象類的區別
什麼是介面
介面是一個可用於實現類的藍圖。該介面不包含任何具體方法(具有程式碼的方法)。介面的所有方法都是抽象方法。
Java 無法例項化介面。但是,可以例項化實現介面的類。介面永遠不包含例項變數,但它們可以包含公共靜態最終變數(即常量類變數)
什麼是抽象類?
在其宣告中具有 abstract
關鍵字的類稱為抽象類。抽象類應該至少有一個抽象方法,即沒有具體實現的方法。它可以有多種具體方法。
抽象類允許你為具體類建立藍圖。但是繼承類應該實現抽象方法。抽象類無法例項化。
使用介面的重要原因
- 介面用於實現抽象。
- 旨在支援執行時的動態方法解析
- 它可以幫助你實現鬆耦合。
- 允許你將方法的定義與繼承層次結構分開
使用抽象類的重要原因
- 抽象類為子類提供預設功能。
- 為將來的特定類提供模板
- 幫助你為其子類定義公共介面
- 抽象類允許程式碼可重用性。
介面與抽象類
引數 | 介面 | 抽象類 |
---|---|---|
速度 | 慢 | 快 |
多重繼承 | 實現幾個介面 | 只有一個抽象類 |
結構 | 抽象方法 | 摘要和具體方法 |
何時使用 | 未來的增強 | 為了避免獨立 |
繼承/實施 | 一個 Class 可以實現多個介面 | 該類只能繼承一個抽象類 |
預設實施 | 在向介面新增新內容時,找到所有實現者並實現新定義的東西是一場噩夢。 | 對於 Abstract Class,你可以利用預設實現。 |
訪問修飾符 | 該介面沒有訪問修飾符。介面內定義的所有內容都假定為 public 修飾符。 | Abstract 類可以有一個訪問修飾符。 |
何時使用 | 當各種實現僅共享方法簽名時,最好使用介面。值型別的多型層次結構。 | 當相同型別的各種實現共享共同行為時,應該使用它。 |
資料欄位 | 該介面不能包含資料欄位。 | 該類可以有資料欄位。 |
多重繼承預設值 | 一個類可以實現許多介面。 | 一個類只繼承一個抽象類。 |
實施 | 介面是抽象的,因此無法提供任何程式碼。 | 抽象類可以提供應該被覆蓋的完整的預設程式碼。 |
使用 Access 修飾符 | 你不能對方法,屬性等使用訪問修飾符 | 你可以使用包含訪問修飾符的抽象類。 |
用法 | 介面有助於定義類的外圍功能。 | 抽象類定義類的標識。 |
定義的欄位 | 沒有欄位可以定義 | 抽象類允許你定義欄位和常量 |
繼承 | 介面可以繼承多個介面但不能繼承類。 | 抽象類可以繼承一個類和多個介面。 |
建構函式或解構函式 | 介面不能宣告建構函式或解構函式。 | 抽象類可以宣告建構函式和解構函式。 |
擴充套件限制 | 它可以擴充套件任意數量的介面。 | 它一次只能擴充套件一個類或一個抽象類。 |
抽象關鍵字 | 在抽象介面關鍵字中,可以選擇將方法宣告為抽象。 | 在抽象類中,abstract 關鍵字是將方法宣告為抽象的必需項。 |
類型別 | 介面只能有公共抽象方法。 | 抽象類具有保護和公共抽象方法。 |
Java 中的介面和抽象類的示例程式碼
以下是在 Java 中建立介面和抽象類的示例程式碼
介面語法
interface name{
//methods
}
Java 介面示例:
interface Pet {
public void test();
}
class Dog implements Pet {
public void test() {
System.out.println("Interface Method Implemented");
}
public static void main(String args[]) {
Pet p = new Dog();
p.test();
}
}
抽象類語法
abstract class name{
//code
}
抽象類示例:
abstract class Shape {
int b = 20;
abstract public void calculateArea();
}
public class Rectangle extends Shape {
public static void main(String args[]) {
Rectangle obj = new Rectangle();
obj.b = 200;
obj.calculateArea();
}
public void calculateArea() {
System.out.println("Area is " + (obj.b * obj.b));
}
}