簡體   English   中英

“ static關鍵字對類聲明無效,對變量或方法聲明無效。”

[英]“The static keyword does not do to a class declaration what it does to a variable or a method declaration.”

來自: JavaWorld

我知道static只能與嵌套類一起使用,這使它們等效於頂級類。 我也了解到,這使它們可以獨立於封閉類進行聲明。

  1. 這就是理論,有人可以想到一個很好的實際例子來說明為什么我們需要這樣做嗎? (鏈接中的示例很可能是內部類AFAIK的示例)。

  2. 還有-問題背后的原因-為什么要有一個模糊的名稱,為什么要“重用” static一詞並賦予它不同的含義?

當您的類是自然嵌套的,但不需要內部類在Java中具有的自動$ this父引用時,可以使用它。 每個非靜態內部類都有對其包含實例的嵌入式引用。 當您實際上不需要該引用時,最好不要創建它。 這可能會導致對象在內存中的保留時間超出所需的時間,並且當您開始序列化對象/嘗試通過網絡發送對象時,也可能會很痛苦。最終,您可能會得到比您大得多的對象圖期望或需要序列化!

Map.Entry的實現是一個很好的例子。 將其嵌套在地圖實現中顯然是“自然的”,但實際上並不需要真正保留對地圖的父引用。

對於#2,有何不同? 字段或方法上的靜態表示它是類定義的屬性,而不是實例。 您無需實例即可訪問和使用它。 嵌套類的靜態也意味着它是類定義的屬性,您可以在沒有實例的情況下訪問和使用它。

  1. 頂級類的可見性可以是公共的或打包的; 但是嵌套靜態類的可見性也可以是私有的或受保護的。 聲明嵌套類也可以改善類的包裝(結構化)並關聯其依賴關系,例如Map.Entry 雖然,它也可能是流浪漢。

  2. static一詞的含義是在類級別聲明實例。 例如, static int i為一個類聲明一個整數。 頂級類與在類級別上聲明一個類相同。

我可以解決您的第二個問題。

其他一些關鍵字含義很重 ,因此static示例不是唯一的。 在靜態導入的上下文中, static甚至還有另一個含義。 它在另一種可能有意義的情況下重用了您已經熟悉的單詞,即使它的含義完全不同。

例如, final可用於標識只能一次初始化的變量。 它還具有其他含義,例如標識無法覆蓋的方法。

supersynchronized也用於幾種情況。

  1. 這就是理論,有人能想到一個為什么我們需要這樣做的好例子嗎? (鏈接中的示例很可能是內部類AFAIK的示例)。

這樣做有助於垃圾收集。 非靜態內部類包含對外部類的引用。

例如:如果您有一個龐大的外部類,該類創建一個Runnable以便在某些任務列表中排隊,則該Runnable的存在可能成為阻止其被收集的唯一原因。 現在,內部類正在迫使JVM保留無用的堆空間塊,這可能不得不將其移出eden並進入難以收集的幸存空間。

  1. 還有-問題背后的原因-為什么根本沒有一個模棱兩可的名稱,為什么“重用”>“靜態”一詞並賦予它不同的含義?

您想怎么稱呼它? 就語言而言,使用靜態不會在語法上造成歧義。 對我來說,“靜態”是有意義的。 內部類的實例不是外部類實例的成員,反之亦然。

在這些上下文中, static的共同含義是“在編譯時可解決的”(與必須在對象實例上查找它們並通過虛擬方法表相反)。 這適用於靜態方法,靜態變量和靜態內部類。 我認為這是編譯器作者選擇您的語言關鍵字時發生的情況,從概念上講,他將它們全部歸類為“我可以優化的東西”。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM