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