java抽象類和接口的對比
抽象類:
- 含有abstract修飾符的class即爲抽象類,abstract類不能創建的實例對象。
- 含有abstract方法的類必須定義爲abstract class,abstract class類中的方法不必都是抽象的,抽象類中可以包含不帶abstract關鍵字的方法。
- abstract class類中定義抽象方法必須在具體的子類中實現,所以,不能有抽象構造方法或抽象靜態方法。
- 如果的子類沒有實現抽象父類中的所有抽象方法,那麼子類也必須定義爲abstract類型。
接口:
- interface可以說成是抽象類的一種特例,接口中的所有方法都必須是抽象的。
- 接口中的方法定義默認爲public abstract類型
- 接口中的成員變量類型默認爲public static final。
兩者的區別:
- 抽象類可以有構造方法,接口中不能有構造方法。
- 抽象類中可以有普通成員變量,接口中沒有普通成員變量
- 抽象類中可以包含非抽象的普通方法,接口中的所有方法必須都是抽象的,不能有非抽象的普通方法。
- 抽象類中的抽象方法的訪問類型可以是public,protected和(默認類型,雖然
eclipse下不報錯,但應該也不行),但接口中的抽象方法只能是public類型的,並且默認即爲public abstract類型。 - 抽象類中可以包含靜態方法,接口中不能包含靜態方法
- 抽象類和接口中都可以包含靜態成員變量,抽象類中的靜態成員變量的訪問類型可以任意,但接口中定義的變量只能是public static final類型,並且默認即爲public static final類型。
使用接口的好處:
- java只是單繼承,但是可以實現多個接口,繼承的耦合性太強,java推薦高內聚低耦合的設計思路,不推薦使用繼承。在用繼承的情況下,如果還必須要繼承另外的接口會很麻煩,儘量用接口,這樣在你必須要用到繼承的時候就可以用了。抽象類和接口都不能被實例化。接口沒有構造方法,不能被實例化,但是抽象方法可以有構造方法,不過不是用來實例化對象的,使用來初始化的。