1. 程式人生 > 其它 >Java中抽象類和介面的區別

Java中抽象類和介面的區別

Java中抽象類與介面的區別

抽象類

什麼是抽象類?

在繼承時,許多的子類方法才會比較具體,但我們在父類中只能給出比較通用的定義,比如說計算面積,對於不同的派生類會有不同的實現方法,比如三角形和矩形的面積計算公式就是不一樣的,子類派生出後才能使得類的方法變得具體,這時含有沒有具體定義的方法的父類就是抽象類(abstract class)。當一個父類是抽象類時,它沒有具體的例項。

定義格式

在class前加上abstract關鍵字,就定義了一個抽象類

/*例如*/ public abstract class Base {}

抽象類中的方法成員

  1. 抽象類的構造方法應該定義為protected,因為其不應該被例項化物件且構造方法需要被子類呼叫
  2. 抽象類的方法可以是抽象方法也可以是普通方法
  3. 如果一個類有抽象方法,那必須定義為抽象類
  4. 抽象方法必須定義為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關鍵字修飾一個方法,並提供實現,稱為介面靜態方法。介面靜態方法只能通過介面呼叫。

格式:介面名.靜態方法名

抽象類和介面比較

相同點

  1. 不能被例項化

  2. 抽象方法都必須被子類重寫才能例項化

不同點

引數 抽象類 介面
預設建構函式 有預設構造方法 不存在構造方法
定義 class abstract interface
繼承 extends,由抽象類和普通類繼承,只能單繼承 能被介面和普通類繼承,可以多繼承,也可以被抽象類實現
新增新方法 只需要在抽象類中新增方法 必須將全部子方法重寫

應用場景

  1. 抽象類

    如果你擁有一些方法並且想讓它們中的一些有預設實現,那麼可以使用抽象類

    如果基本功能在不斷改變,那麼就需要使用抽象類

  2. 介面

    如果你想實現多重繼承,那麼你必須使用介面。由於Java不支援多繼承,子類不能夠繼承多個類,但可以實現多個介面。因此你就可以使用介面來解決它。

    如果方法不需要一直改變,你可以使用介面