當我們有一個類的最終實例變量時,它是爲每個由該類創建的對象實例化還是隻創建一次並被引用?
如果最終變量是一個本地類變量,情況如何?是每次實例化的最終變量
回答
最終變量爲類的每個實例實例化。曾經分配給它們的值可能不會改變。這些變量可以通過初始化程序或賦值語句初始化一次。
你所指的是靜態變量。這些變量不是附加到一個特定的對象上,而是附加到整個類上。它們在班級加載時分配。
把這兩者結合在一起,你可以得到一個static final這個類的變量。這基本上意味着分配給變量的值一旦被賦值是恆定的,並且它將被附加到類而不是類的實例。
變量不是被實例化的變量。類被實例化。變量被初始化。實例變量必須在構造對象時初始化,並且如果它們是final
,您將無法爲其重新分配值。如果它是一個實例變量,那麼每個類的實例將擁有它自己的副本,否則如果它是靜態的,那麼將只有一個副本屬於類本身。
是的,但對於非原始字段,它所引用的對象被實例化。 – Bohemian
@Bohemian:但仍然是實例化的對象而不是引用該對象的變量。 –
final
修飾符只是表示該變量可以被分配一次並且永不再次。它對實例化沒有影響;規則與正常變量相同。所有final
修飾符都會阻止該值第二次分配。
下面的例子。
private final List myList = new ArrayList();
該列表將在每次運行時被實例化,即每次封裝類被實例化時。
public void bob() {
final List myList = new ArrayList();
}
該列表將每個此運行時實例化,即,每個所述方法bob
被調用時。
private static final List MY_LIST = new ArrayList();
此外,每次運行時都會實例化列表。因爲這也是一個static
字段初始值設定項,所以這個代碼將在第一次加載類時運行。因此,對於簡單程序,這將只運行一次 - 在多個類加載器在使用的情況下(例如應用程序服務器等),但是,每次在新類加載器中加載該類時都會運行一次。
實例變量,類變量和局部變量用於引用三個不同的事物,因此調用變量「類的實例變量」或「本地類變量」會造成混淆。
一個實例變量屬於一個對象。無論是否爲final
,都會在每個實例中分配空間。如果是final
,則必須在施工期間分配一個值,並且該變量只能分配一次。
類變量屬於整個類。只有一個變量,無論該類的對象數量多少,並且所有實例都可以引用它。聲明一個變量爲static
意味着它屬於這個類。與實例變量類似,static
類變量可以聲明爲final
。然後,在初始化類時,它必須被賦值一次且只有一次。
局部變量在方法中聲明,變量佔用方法棧幀—中的空間,儘管該變量可能包含指向堆中對象的指針。局部變量可以是final
,這意味着它們只能被分配一次。另外,如果一個局部變量是final
,它可以被方法中實例化的內部類引用。
- 1. 初始化「最終」實例變量
- 2. 編譯器認爲最終的實例變量未初始化
- 3. 爲什麼最終的實例變量需要初始化,當一個最終的局部變量沒有?
- 4. 變量將被實例化多次
- 5. 最終實例變量是否爲最終的次級引用傳遞的安全發佈?
- 6. Spring每次使用實例變量都會返回新實例
- 7. 最終變量初始化
- 8. 是否正在實例化非最終靜態變量線程安全?
- 9. 是否爲每個類的實例實例化私有類變量?
- 10. 最佳實踐 - 每次保持參考或實例化?
- 11. 初始化對象時,實例變量始終未初始化?
- 12. 實例化實例變量爲塊
- 13. 非最終靜態變量的用例
- 14. 實例化空csv變量
- 15. 最終實例變量在編譯時已知值的使用
- 16. 陣列天線的最終實例變量和重置基準
- 17. 有一個實例變量作爲最終的點?
- 18. 強制子類定義受保護的最終實例變量
- 19. 無法實現try/catch /最後變量是最終的
- 20. 每次我實例化一個新的孩子時,父變換髮生變化
- 21. 如何實例化面板每次
- 22. 最終變量
- 23. `auto`每次都創建一個新的變量實例?
- 24. Flash實例變量始終爲空?
- 25. 聲明變量最終訴延遲實例
- 26. Java枚舉靜態最終實例變量
- 27. 初始化最終靜態變量
- 28. Java最終變量初始化
- 29. 如何最終化/銷燬類變量
- 30. 初始化靜態最終變量
它們被稱爲「字段」,而不是「變量」 – Bohemian
您可以通過在對象的構造函數中放置print語句來測試它。 –
@波希米亞 - 它們也被稱爲實例變量。甲骨文稱他們爲好,所以我們也可以這樣做;例如http://docs.oracle.com/javase/tutorial/java/javaOO/classvars.html –