[英]static initialization in java
我知道有很多與此問題類似的問題,但是我想對此問題進行一些詳細的解釋。
假設我有此代碼-
public class Finalexamples {
public int num = 3;
public static int num2;
public static Finalexamples a;
public Finalexamples(){
Finalexamples.num2 = 4;
}
static{
a = new Finalexamples();
System.out.println(num2);
Finalexamples.num2 = 5;
}
public static void main(String[] args) {
System.out.println("Starting...");
}
}
為什么是0
? 它應該輸出4
而不是。
加載類時,將按固定順序讀取並執行靜態字段和語句。
所以這些首先執行:
public static int num2;
public static Finalexamples a;
然后調用:
static{
a = new Finalexamples();
System.out.println(num2);
Finalexamples.num2 = 5;
}
這是: a = new Finalexamples();
執行: Finalexamples.num2 = 4;
所以System.out.println(num2);
顯示4
好的,因此,首先Java轉到類中最頂層的靜態聲明(將num2
定義為int),然后將a
定義為Finalexamples
對象。 然后轉到您的靜態塊。 在靜態塊中,它看到a = new Finalexamples();
因此,它將通過構造函數創建a
。 (如果直到靜態初始化結束才執行此步驟,則a
直到結束都將無法訪問,因為它沒有被構造,這是不好的!)因此,在變量a
構造函數中,我們設置了Finalexamples.num2
等於4。構造函數完成,Java返回執行靜態塊,並打印出Finalexamples.num2
,現在為4。
首先了解此流程(僅適用於您的程序),
靜態變量的初始化。
public static int num2; public static Finalexamples a;
靜態塊的執行:
static{ a = new Finalexamples(); System.out.println(num2); Finalexamples.num2 = 5; }
在靜態塊中初始化Finalexamples
的對象引用“ a”時,將調用Finalexamples類的構造函數。
public Finalexamples(){ Finalexamples.num2 = 4; }
Finalexamples.main()方法。 哪個都沒有。
public static void main(String[] args) { System.out.println("Starting..."); }
回答您的問題。
A.靜態變量在執行開始時僅初始化一次。這些變量將在任何實例變量初始化之前首先進行初始化。 它是屬於該類而不屬於object(instance)的變量。 該類的所有實例共享一個副本
B.不是'0'
因為您正在使用Finalexamples的新對象在靜態塊中初始化對象引用。 這時將調用構造函數,並將num2
的值設置為4
。
希望對您有所幫助!
您在Java中的最終輸出是5,您的兩個部分首先是類區域,其次是堆區域類區域塊包含三個塊方法區域,靜態區域,常量池。在類加載時運行static塊,因此您的靜態變量是在static中創建的塊它在靜態塊的運行時初始化,並且對於靜態變量,不會在Java中創建多個副本,因此您可以像這樣測試代碼
public class HelloWorld{
public int num = 3;
public static int num2;
public static HelloWorld a;
public HelloWorld(){
System.out.println("Constructor Creation value of num2 "+num2);
HelloWorld.num2 = 4;
System.out.println("Variable Initialization in Constructor value of num2 "+num2);
}
static{
System.out.println("Static bloack execution value of num2 "+num2);
a = new HelloWorld();
HelloWorld.num2 = 5;
System.out.println("Variable Initialization in Static bloack value of num2 "+num2);
}
public static void main(String[] args) {
System.out.println("Starting...");
}}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.