Java學習之抽象類和介面區別比較

2021-07-05 01:24:26 字數 4089 閱讀 9206

新建抽象類abstracttest:

public

abstract

class

abstracttest

新建介面inte***cetest:

public

inte***ce

inte***cetest

下劃線表示該處編譯器提示報錯,下面不再說明。

非法修飾的字段

;只有public、static&final被允許作為修飾符。

修改介面inte***cetest**如下:

public

inte***ce

inte***cetest

可以看到,注釋了上面編譯器報錯的**,但還是有提示報錯:空白final欄位 pub_name 尚未初始化。

由此可知,介面的成員變數預設是final修飾的常量,是必須要初始化的。換句話說,介面不能有普通成員變數。

由以上**的比較可以看出,抽象類與介面的第乙個區別:

抽象類可以有成員變數、靜態成員變數、常量和靜態常量(常量必須被初始化),而且無訪問許可權限制;

介面不能有成員變數、靜態成員變數,可以有由

public、static&final修飾的常量。

抽象類abstracttest新增如下**;

public

abstracttest

()

介面也新增構造方法:

public

inte***cetest

()

編譯器提示介面不能有構造方法。

由此得出抽象類與介面的第二個區別:

抽象類可以有構造方法,但介面不能有構造方法。

抽象類abstracttest新增如下**;

protected

abstracttest

()

protected

void

abstracttest

()

可以看到,

方法名與抽象類名相同,

編譯器沒有報錯,另外無論修改構造方法的訪問級別為private還是預設級別都沒報錯。

介面inte***cetest新增如下**:

public

void

inte***cetest

()

抽象方法不用指定乙個方法體。

修改後如下:

public

void

inte***cetest

();

這時編譯器不報錯了。而且

方法名與介面名相同。

修改inte***cetest方法的訪問許可權:

protected

void

inte***cetest

();

介面方法的修飾符僅允許public和abstract。

由此得出,抽象類與介面的第三個區別:

抽象類和介面的方法名可以和類名可以相同,但抽象方法的訪問許可權沒有限制,而介面方法的訪問許可權修飾符僅允許public和abstract,預設為public。

且抽象類中的方法可以有方法體(沒有方法體的方法需要abstract修飾),而介面中的方法不能有方法體。

抽象類abstracttest新增靜態方法:

protected

static

void

staticabstracttest

()

介面也新增靜態方法:

public

static

void

inte***cetest

();

由此得出,抽象類和介面的第四個區別:

抽象類中可以包含靜態方法,而介面中不

可以包含靜態方法。

抽象類abstracttest新增final方法:

protected

final

void

fabstracttest

()

介面也新增final方法:

public

final

void

inte***cetest

();

與第四個區別綜合得出,

抽象類和介面的第五個區別:

抽象類中的普通方法可以被static和final修飾,而介面中的方法則不能被static和final修飾。

由第二個到第五個區別可以得出如下結論:

抽象類中可以包含非抽象的普通方法,介面中的所有方法必須都是抽象的,不能有非抽象的普通方法。 

分別copy抽象類和介面,貼上其副本分別為abstracttest2、inte***cetest2,新建類inheritancetest:

public

class

inheritancetest

extends

abstracttest

,abstracttest2

}

修改如下:

public

class

inheritancetest

extends

abstracttest

implements

inte***cetest

,inte***cetest2

}

編譯通過。

由此得出抽象類和介面的第六個區別:

乙個類可以實現多個介面,但只能繼承乙個抽象類。

如有疏漏或其他問題,歡迎指出互相交流,謝謝!

抽象類和介面區別

含有abstract修飾符的class即為抽象類,abstract類不能建立的例項物件。含有abstract方法的類必須定義為abstract class,abstract class類中的方法不必是抽象的。abstract class類中定義抽象方法必須在具體 concrete 子類中實現,所以,...

抽象類和介面區別

在開發人員崗位面試時,是否了解抽象類和介面之間的基本區別是乙個很重要的考量因素。完全不是。筆者面試過很多人,通常問的第乙個問題是關於介面和抽象類的區別。但實際上很少有程式設計師能給出正確的答案。就這個問題來說,初級程式設計師可能都會清楚之間的區別,可能也並不一定理解其背後的原因,但其結構上的差異,特...

java中抽象類和介面區別

抽象類前使用abstract關鍵字修飾,則該類為抽象類 應用場景 在某些情況下,某個父類只是知道其子類應該包含怎樣的方法,但無法準確的知道這些子類如何實現這些方法。從多個具有相同特徵的類中抽象出乙個抽象類,以這個抽象類作為子類的模板,從而避免了子類設計的隨意性 作用 限制規定子類必須實現某些方法,但...