您當前的位置:首頁 > 攝影

java的成員內部類為什麼不能有靜態變數(非final)和靜態方法呢?

作者:由 OrdinaryYZH 發表于 攝影時間:2019-08-25

java的成員內部類為什麼不能有靜態變數(非final)和靜態方法呢?風雨歇2019-08-27 17:16:55

我目前的看法:這個應該就是這樣設計的。

這本書這裡寫的這句“對於每個外部物件,會分別有一個單獨的內部類例項,如果不是final,可能不是唯一的”也不知道怎麼理解,因為static變數不是單獨放方法區中嗎,多個例項又怎麼了。。

而且書中緊接著寫道,內部類“不能有static方法”的特性可能也只是根據Java設計者的想法來設計的,實際可以設計成允許有。

我看了一些關於這個問題的部落格,也有很多人從載入的角度考慮這個問題,從虛擬機器記憶體的角度考慮這個問題,但是感覺都說的不是很清楚,StackOverflow上這個問題的回答也只有搬JLS。看了很多我也不明白內部類有靜態域會導致什麼樣的問題。

而且很神奇的是,如果你令內部類繼承一個擁有靜態域的其他類,那麼編譯是成功的,可以在沒有任何例項的情況下,用內部類去訪問這個靜態域。

現在只能理解為,就是這麼設計的,Java設計人員不希望非靜態成員擁有靜態域。而編譯或載入層面可能出現的問題,希望有人可以解答吧。

java的成員內部類為什麼不能有靜態變數(非final)和靜態方法呢?知乎使用者2019-10-19 18:15:45

感覺匿名高贊提出的兩種解釋的第二種並不合理。既然類方法都是載入到方法區裡面去,理論上就不應該和例項扯上關係。

從程式語義上來說,

讓成員內部類擁有其靜態成員本身不會造成問題

。 所以從理論上說, 並不是一定要有這個規定。

但是從實際功能來看, 實際上並不需要這樣的靜態成員。如果想在所有同一成員內部類共享,可以用外部類的類成員來實現; 如果想在所有引用同一外部類例項的成員內部類的例項之間共享,那可以用外部類的例項成員來實現。 這樣看來, 成員內部類的靜態成員,是不是顯得有點多餘了?

可能還有一點就是, 這樣的規定可以使得 巢狀類 和 成員內部類 的功能特徵區別更加明顯。

19。10。24更新

主要是更正一下之前的表述,以及回覆一下匿名使用者。

首先,更正一下,類變數不應該和例項相關,是類變數的定義導致的。 帶有static的變數,不應該依賴於類的例項存在而存在。 從這種規約來看,匿名回答裡面的第二種解釋是不太合理的,因為其相當於成員內部類的靜態變數依賴了外部類的例項。

其次,說說實現細節的問題。 我們知道編譯之後會把所有的類都展成top-level。 假使我們現在想要讓內部類的靜態變數依賴於外部類的例項,那請問應該把這個變數載入到哪裡?恐怕只能放到heap裡,這就會帶來“需要將static域載入到堆上”這樣尷尬的場景。 直接轉化為外部類的成員也能實現,但是把一個類的靜態轉換成另一個類的成員,這一波操作可以說是更迷了。

當然,不排除語言設計者最開始是想要這樣做的。 但是很可能他們發現這個事情既不太符合既有的規約,實現起來又會引入很多奇怪操作,就放棄了。前面說了,從實用角度來說,這個變數的價值有限。

匿名使用者的迴應是有一定道理的,這個事情有沒有二義性,和JVM實現其實沒有關係。 我個人覺得沒有二義性還是源於類變數的內在含義。 這個之前說的有點問題,這裡解釋一下。

最後,「成員內部類內不能使用靜態域 這就是一個規定」這句話是完全正確的。兩種語義其實都是可以實現的,這種要求的確就是個規約而已。個人認為,這個規約是考慮實現複雜度、使用者心智負擔、和既有規約的內涵相容性的一個結果。

java的成員內部類為什麼不能有靜態變數(非final)和靜態方法呢?柚子2019-12-02 10:49:43

不瞭解目前

java的成員內部類為什麼不能有靜態變數(非final)和靜態方法呢?Luminous2021-07-16 21:43:30

java的成員內部類為什麼不能有靜態變數(非final)和靜態方法呢?一表堂堂2021-09-16 09:46:30

標簽: 靜態  例項  成員  內部  變數