java——為什么要有接口?和抽象類有什么不一樣?


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的多態。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM