介面和抽象類詳解

微醺的小布發表於2024-11-08

抽象類

特點:
1.抽象類中可以有構造方法
2.抽象類中可以存在普通屬性,方法,靜態屬性和方法。
3.抽象類中可以存在抽象方法。 抽象方法不能有方法體
4.如果一個類中有一個抽象方法,那麼當前類一定是抽象類;抽象類中不一定有抽象方法。
5.抽象類中的抽象方法,需要有子類實現,如果子類不實現,則子類也需要定義為抽象的。
6.抽象類不能被例項化,抽象類和抽象方法必須被abstract修飾
7.抽象類方法中預設的訪問許可權jdk1.8之前是protected之後是default
8.抽象類中可以有main方法
9.抽象類中可以有static方法,但是不能有default方法

關鍵字使用注意:
1.抽象類中的抽象方法(其前有abstract修飾)不能用private、default、static、synchronized、native訪問修飾符修飾。 (public和protected可以)
2.外部類的修飾符只能是不寫,介面的修飾符只能是不寫或者public
3.介面種的變數預設是public static final的,所以介面的成員變數必須賦值。方法預設是public abstract的。
4.抽象類中的非抽象方法可以被重寫
5.抽象類可以有構造方法,只是不能例項化
6.抽象類不能多繼承

介面
1.在介面中只有方法的宣告,沒有方法體。
2.在介面中只有【常量】,因為定義的變數,在編譯的時候都會預設加上public static final
3.在介面中的方法,永遠都被public來修飾。
4.介面中沒有構造方法,也不能例項化介面的物件。(所以介面不能繼承類)
5.介面可以實現多繼承
6.介面中定義的方法都需要有實現類來實現,如果實現類不能實現介面中的所有方法則實現類定義為抽象類。
7.介面可以繼承介面,用extends
8.介面中方法訪問修飾符預設是public abstract的,但是JDK1.8之後介面中可以有static方法或者default方法,但是這兩種方法必須有方法體。
9.介面中的方法用static修飾之後,就不能用abstract修飾了
10.介面中可以有main方法


在JDK1.8之前的版本(不包括JDK1.8),介面中不能有靜態方法,抽象類中因為有普通方法,故也可以有靜態方法。

在JDK1.8後(包括JDK1.8),在抽象類中依舊可以有靜態方法,同時在介面中也可以定義靜態方法了。


介面可以繼承介面,而且可以繼承多個介面,但是不能實現介面,因為介面中的方法全部是抽象的,無法實現;

如果是Java 7以及以前的版本,那麼介面中可以包含的內容有:1. 常量;2. 抽象方法
如果是Java 8,還可以額外包含有:3. 預設方法;4. 靜態方法
如果是Java 9,還可以額外包含有:5. 私有方法

抽象類可以實現介面,可以繼承具體類,可以繼承抽象類,也可以繼承有構造器的實體類。

抽象類中可以有靜態main方法;抽象類裡可以沒有抽象方法,沒有抽象方法的抽象類就是不想讓別人例項化它;

另外,抽象類可以有構造方法,只是不能直接建立抽象類的例項物件而已。在繼承了抽象類的子類中透過super(引數列表)呼叫抽象類中的構造方法,可以用於例項化抽象類的欄位。

當抽象類只有有參構造時,子類(包括抽象類和非抽象類)必須定義有參構造,呼叫super(引數)


下面總結常見的抽象類與介面的區別:

1.抽象類和介面都不能直接例項化,如果要例項化,抽象類變數必須指向實現所有抽象方法的子類物件,介面變數必須指向實現所有介面方法的類物件;

2.介面只能做方法申明,抽象類中可以做方法申明,也可以做方法實現(java8中 介面可以有實現方法 使用default或static修飾);

3.介面裡定義的變數只能是公共的靜態的常量,抽象類中的變數是普通變數;

4.抽象類裡的抽象方法必須全部被子類所實現,如果子類不能全部實現父類抽象方法,那麼該子類只能是抽象類。同樣,一個類實現介面的時候,如不能全部實現介面方法,那麼該類也只能為抽象類;

5.抽象方法要被實現,所以不能是靜態static的,也不能是私有private的,也不能被final修飾(試想一下,靜態方法可以被類名直接呼叫,而類名直接呼叫一個沒有實現的抽象方法沒有意義)。

相關文章