1.接口不是類,為什么?
接口如果是類,那就失去了java引入接口的意義了。
java之所以引入接口,就是為了彌補不能多繼承的缺點,在java中每個類只能有一個超類,但卻可以實現多個接口。
2.接口可以有靜態常量(一定是靜態的,無論寫沒寫static),但是不能含有實例域,為什么?
接口就類似一個說明文檔,定義繼承接口的類應該必須有什么方法以及該方法的輸入輸出。
接口的思想不允許出現變量,接口只是對一類事物的屬性和行為更高層次的抽象。對修改關閉,對擴展(不同的實現 implements)開放。所以接口中的屬性必然是常量,只能讀不能改,這樣才能為實現接口的對象提供一個統一的屬性。
3.接口中可以有靜態方法,為什么?
JAVA SE 8中可以定義帶有方法體的靜態方法,以保證“源代碼兼容”。
4.接口可以有靜態常量,並且這個常量一定是靜態的,為什么?
因為static是所有對象可以訪問,而且可以直接通過類名訪問。接口沒有對象,必須通過類名來訪問所以是要靜態的。
5.內部接口默認是靜態的,為什么?
接口不能被實例化,所以內部接口只有在靜態時才有意義。 因此,默認情況下,無論是否手動添加靜態,內部接口都是靜態的。
想清楚這些,再想想接口和抽象類有什么不一樣,什么時候用接口,什么時候用抽象類?
1.抽象類是類,但接口不是。
2.接口中的方法都是抽象方法,而抽象類必須有抽象方法,但也可以有普通方法。
3.接口定義的方法以及常量都是public,而抽象類是可以有私有方法或私有變量的。
4.實現接口需要實現接口中的每一個方法,而繼承抽象類則可以選擇實現抽象類中的一部分抽象方法,但此時這個子類仍然是一個抽象類。
5.接口可以實現多繼承,但是一個類只能實現一個超類。
6.接口中定義的變量默認是public static final 型,必須給其初值,所以實現類中不能重新定義,也不能改變其值。抽象類中的變量默認是default 型,其值可以在子類中重新定義,也可以重新賦值。
接口更像是一種協議,實現接口的子類需要按照這種協議來編寫自己的代碼,但抽象類就更像一個不能實例化的普通類,只不過為了子類更加靈活多變,將一部分方法留給子類去實現,這也體現了java的多態。