[英]Explanation for convoluted generic-type declaration. What does Class<? extends Class<? extends Actor>[]> actually mean?
[英]“The static keyword does not do to a class declaration what it does to a variable or a method declaration.”
來自: JavaWorld
我知道static
只能與嵌套類一起使用,這使它們等效於頂級類。 我也了解到,這使它們可以獨立於封閉類進行聲明。
這就是理論,有人可以想到一個很好的實際例子來說明為什么我們需要這樣做嗎? (鏈接中的示例很可能是內部類AFAIK的示例)。
還有-問題背后的原因-為什么要有一個模糊的名稱,為什么要“重用” static
一詞並賦予它不同的含義?
當您的類是自然嵌套的,但不需要內部類在Java中具有的自動$ this父引用時,可以使用它。 每個非靜態內部類都有對其包含實例的嵌入式引用。 當您實際上不需要該引用時,最好不要創建它。 這可能會導致對象在內存中的保留時間超出所需的時間,並且當您開始序列化對象/嘗試通過網絡發送對象時,也可能會很痛苦。最終,您可能會得到比您大得多的對象圖期望或需要序列化!
Map.Entry的實現是一個很好的例子。 將其嵌套在地圖實現中顯然是“自然的”,但實際上並不需要真正保留對地圖的父引用。
對於#2,有何不同? 字段或方法上的靜態表示它是類定義的屬性,而不是實例。 您無需實例即可訪問和使用它。 嵌套類的靜態也意味着它是類定義的屬性,您可以在沒有實例的情況下訪問和使用它。
頂級類的可見性可以是公共的或打包的; 但是嵌套靜態類的可見性也可以是私有的或受保護的。 聲明嵌套類也可以改善類的包裝(結構化)並關聯其依賴關系,例如Map.Entry
。 雖然,它也可能是流浪漢。
static
一詞的含義是在類級別聲明實例。 例如, static int i
為一個類聲明一個整數。 頂級類與在類級別上聲明一個類相同。
我可以解決您的第二個問題。
其他一些關鍵字含義很重 ,因此static
示例不是唯一的。 在靜態導入的上下文中, static
甚至還有另一個含義。 它在另一種可能有意義的情況下重用了您已經熟悉的單詞,即使它的含義完全不同。
例如, final
可用於標識只能一次初始化的變量。 它還具有其他含義,例如標識無法覆蓋的方法。
super
和synchronized
也用於幾種情況。
- 這就是理論,有人能想到一個為什么我們需要這樣做的好例子嗎? (鏈接中的示例很可能是內部類AFAIK的示例)。
這樣做有助於垃圾收集。 非靜態內部類包含對外部類的引用。
例如:如果您有一個龐大的外部類,該類創建一個Runnable以便在某些任務列表中排隊,則該Runnable的存在可能成為阻止其被收集的唯一原因。 現在,內部類正在迫使JVM保留無用的堆空間塊,這可能不得不將其移出eden並進入難以收集的幸存空間。
- 還有-問題背后的原因-為什么根本沒有一個模棱兩可的名稱,為什么“重用”>“靜態”一詞並賦予它不同的含義?
您想怎么稱呼它? 就語言而言,使用靜態不會在語法上造成歧義。 對我來說,“靜態”是有意義的。 內部類的實例不是外部類實例的成員,反之亦然。
在這些上下文中, static
的共同含義是“在編譯時可解決的”(與必須在對象實例上查找它們並通過虛擬方法表相反)。 這適用於靜態方法,靜態變量和靜態內部類。 我認為這是編譯器作者選擇您的語言關鍵字時發生的情況,從概念上講,他將它們全部歸類為“我可以優化的東西”。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.