爲什麼 Java 接口中不允許定義變量

 

轉自:http://www.chixiang.org/?p=93


      大家都知道,Java 中接口裏定義的成員變量都自動是 final static 的,爲什麼?這樣有什麼好處?爲什麼不能定義變量?

      接口就是提供一種統一的”協議”,而接口中的屬性也屬於“協議”中的成員。它們是公共的,靜態的,最終的常量。相當於全局常量。抽象類是不“完全”的類,相當於是接口和具體類的一箇中間層。即滿足接口的抽象,也滿足具體的實現。
      如果接口可以定義變量,但是接口中的方法又都是抽象的,在接口中無法通過行爲來修改屬性。有的人會說了,沒有關係,可以通過實現接口的對象的行爲來修改接 口中的屬性。這當然沒有問題,但是考慮這樣的情況。如果接口 A 中有一個public 訪問權限的靜態變量 a。按照 
Java 的語義,我們可以不通過實現接口的對象來訪問變量 a,通過 A.a = xxx; 就可以改變接口中的變量 a 的值了。正如抽象類中是可以這樣做的,那麼實現接口 A 的所有對象也都會自動擁有這一改變後的 a 的值了,也就是說一個地方改變了 a,所有這些對象中 a 的值也都跟着變了。這和抽象類有什麼區別呢,怎麼體現接口更高的抽象級別呢,怎麼體現接口提供的統一的協議呢,那還要接口這種抽象來做什麼呢?所以接口中 不能出現變量,如果有變量,就和接口提供的統一的抽象這種思想是牴觸的。所以接口中的屬性必然是常量,只能讀不能改,這樣才能爲實現接口的對象提供一個統 一的屬性。

      通俗的講,你認爲是要變化的東西,就放在你自己的實現中,不能放在接口中去,接口只是對一類事物的屬性和行爲更高層次的抽象。對修改關閉,對擴展(不同的實現 implements)開放,接口是對開閉原則的一種體現。

 

發佈了22 篇原創文章 · 獲贊 6 · 訪問量 15萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章