我正在學習有關Java的考試。在我學習的時候,我遇到了java中不熟悉的語法。比如花括號({})取消沒有名稱的類體,有一些靜態關鍵字。我發現他們被稱爲「初始化器」。任何人都可以幫助我指出它們之間的關鍵區別以及它們與構造函數的不同之處。謝謝靜態初始化器與實例初始化器與構造函數
回答
他們之間的主要區別是他們執行的順序。爲了說明,我將解釋它們用一個例子:
public class SomeTest {
static int staticVariable;
int instanceVariable;
// Static initialization block:
static {
System.out.println("Static initialization.");
staticVariable = 5;
}
// Instance initialization block:
{
System.out.println("Instance initialization.");
instanceVariable = 10;
}
// Constructor
public SomeTest() {
System.out.println("Constructor executed.");
}
public static void main(String[] args) {
new SomeTest();
new SomeTest();
}
}
的輸出將是:
Static initalization.
Instance initialization.
Constructor executed.
Instance initialization.
Constructor executed.
簡言之說話:
- 靜態初始化塊運行一次的類是由加載JVM。
- 實例初始化塊在每次實例化對象時在構造函數之前運行。
- 構造函數(顯然)每次你實例化一個對象時運行。
這是一個很好的答案。但我想補充一點,構造函數比實例初始化函數更普遍。我認爲初始化器的主要用例是用於在匿名內部類中進行初始化,因爲它們缺少名稱,所以不能有構造函數。 –
非常簡單且很好的示例+1 –
創建類的新實例時會調用構造函數。在構造函數中初始化的值屬於實例的範圍。對於在構造函數中初始化的相同字段,每個實例可以具有不同的值。
靜態初始化程序對於在靜態類中執行設置代碼並填寫枚舉中的數據結構非常有用。當Class被加載到JVM中並且數據存在於Class或Enum的範圍內時,它們從上到下依次調用一次。所有對類的引用將返回在靜態初始化程序中初始化的字段的相同值。
未命名的大括號是範圍引用名稱的匿名代碼塊。如果在塊內創建引用,則無法在塊之外獲取該引用的值。如果你發現自己需要他們,這是你需要將代碼重構爲更多方法的標誌。
「未命名的大括號」稱爲[實例初始化程序](http://docs.oracle.com/javase/specs/jls/se7/html/jls-8.html#jls-8.6 ) –
這是你真正需要在教科書中尋找答案的那種東西。不過,我可以給你一些指示。自從我對Java編程以來,這已經有好幾年了,所以我給你的任何信息都是一般的。
一般而言,帶花括號的無名塊是一個匿名函數。靜態初始化器初始化該類的所有實例全局的數據,並在第一次引用類時運行。你需要小心你如何使用靜態屬性或方法。有了這些信息,你可以在你的教科書中找到準確的細節。
- 1. 初始化實例變量與構造
- 2. 初始化在定義與初始化在構造函數中
- 3. 在實例的構造函數中初始化靜態成員
- 4. c#構造函數與初始化
- 5. 在靜態構造函數中初始化容器
- 6. PHP靜態初始化器
- 7. 靜態初始化與動態初始化
- 8. C++靜態初始化VS __attribute __((構造))
- 9. 初始化靜態結構
- 10. 初始化靜態final變量聲明與初始化在Application.OnCreate()
- 11. 在構造函數中初始化靜態函數指針
- 12. 靜態只讀字段初始值設定項與靜態構造函數初始化
- 13. 初始化塊vs構造函數vs變量初始化
- 14. 構造函數初始化vs獲取集合初始化
- 15. 初始化的聲明VS在構造函數初始化
- 16. 帶空初始化的構造函數初始化列表
- 17. Python中是否存在靜態構造函數或靜態初始化器?
- 18. 用初始化器列表中的空構造函數初始化父類?
- 19. 初始化,初始化與參數和便利初始化
- 20. TableCell初始化與編碼器和初始化與樣式
- 21. 靜態初始化
- 22. 初始化與控制器
- 23. 靜態或公共構造函數的數據初始化
- 24. Vue.js路由器初始化工作與router.map不與路由器構造函數
- 25. 靜態初始化數組?
- 26. 是需要初始化靜態變量的構造函數嗎?
- 27. 使用靜態構造函數初始化一個類?
- 28. 由於靜態初始化而被調用的構造函數
- 29. 做默認構造函數初始化的靜態變量?
- 30. 在構造函數中初始化靜態泛型列表
我推薦你這本書http://www.apress.com/9781430247647第3和4章 – Leo
@Reieus他還問了關於匿名代碼塊 – jeremyjjbrown