靜態嵌套類和頂級類的初始化之間有區別?我明白,靜態類不需要一個封閉的類實例,但如果有多個靜態嵌套類的實例會發生什麼?就像靜態變量被類實例共享一樣,靜態類的實例也會被共享嗎?靜態類在Java初始化
回答
讓我看看我是否正確理解你的問題。
一個類可以聲明嵌套類。
如果一個C1類聲明瞭一個non-static
內部類C2,則C2可以訪問所有C1的字段和方法,而不管它們的訪問修飾符如何。實際上,C2被視爲一個字段:無論何時創建C1的新實例,都會加載其聲明。這意味着non-static
內部類比static
更昂貴,如果不是絕對必要的,應該避免。
如果一個C1類聲明瞭一個static
內部類C3,那麼C3在C1的所有實例中共享。它可以訪問C1的所有靜態方法和字段,但不能訪問非靜態方法 - C3根據定義不與C1的特定實例綁定,因此它沒有任何訪問權限。
當你聲明一個靜態內部類時,你並沒有說它的實例。你只是告訴編譯器該類的定義是在封閉類的所有實例中共享的。所以,不,嵌套靜態類的實例不會自動共享。
A static
嵌套類不需要封閉類的實例(如您所指出的那樣),因此到之間沒有任何共享。
如果您有一個static
變量,那麼該類的每個實例都將持有對同一個static
變量的引用。一個類的變化將改變所有類中的變量。
由於class
在運行時是不可變的,所以這個相同的邏輯沒有通過。
static
嵌套類的實例與任何其他類的實例實際上是相同的。
如果您有一個指向static
嵌套類實例的static
變量,則共享實例的唯一方法。在這種情況下,它與任何其他static
變量相同。
正如指出the tutorial一個static
嵌套類和頂層類之間的唯一真正不同的是,一個static
嵌套類可以訪問它private static
成員是包類。
每個類都是Class類型的單例對象。
A 靜態內部類是基本情況。另一個是正常的內部類,它的實例對象也有一個OuterClass.this
指針。
因此,任何班級的班級初始化都沒有區別。
您聲明爲「靜態類」的嵌套類與另一個頂級類沒有區別,如inner class。將靜態聲明添加到聲明中,可以將它聲明爲與僅作爲其名稱空間的所有者類分離。
package org.stack.question
public class Top {
public static class Nested {
}
}
要創建嵌套類的一個實例,你只能這樣做
Object instance = new org.stack.question.Top.Nested();
從規格:
嵌套類不屬於內部類可以聲明靜態成員 自如,在按照Java編程 語言的通常規則。成員接口(第8.5節)是隱式靜態的,因此它們從不被認爲是內部類。
- 1. Java - 靜態類及其父初始化
- 2. 如何在初始化靜態類之前初始化靜態屬性?
- 3. 靜態初始化的Java序列化
- 4. 靜態初始化
- 5. 在類中初始化靜態捲曲
- 6. java球衣靜態字段初始化
- 7. Java靜態初始化命令
- 8. 靜態成員java初始化順序
- 9. java繼承的靜態初始化
- 10. Java靜態字段初始化
- 11. 初始化靜態指針在靜態類
- 12. 如何在JavaScript靜態類中初始化靜態變量?
- 13. XamlParseException初始化一個靜態類
- 14. 需要靜態類初始化
- 15. 哪個靜態類首先初始化?
- 16. 初始化靜態內部類
- 17. 靜態類初始化何時發生?
- 18. 靜態類初始化階段
- 19. C++類的靜態成員初始化
- 20. 靜態初始化派生類
- 21. 內部類的靜態初始化器?
- 22. C++類靜態成員初始化
- 23. 隱式初始化靜態類
- 24. .NET中的靜態類初始化
- 25. 初始化靜態類成員
- 26. 懶屬性初始化靜態類C#
- 27. C# - 將靜態類初始化爲非靜態類?
- 28. 有沒有辦法在Java中重新初始化靜態類?
- 29. 靜態初始化數組?
- 30. 靜態HashMap的初始化
嗨,boris,感謝您的輸入「由於一個類在運行時是不可變的,所以這個相同的邏輯不能通過。」任何想法爲什麼這種行爲差異? – hakish
行爲有什麼不同? 'class'是一個'class',一個變量是一個變量。他們完全不同。 –