靜態代碼塊可以將在其之後出現的靜態常量進行復制
比如底下這個例子,開始確實挺難理解的,覺得是肯定是static int m=100; 先執行,因爲上面的靜態代碼塊裏m未定義類型,所以我特意將底下的定義類型給註釋掉看結果
public class Test {
public static void main(String[] args) {
A a = new A();
System.out.println(a.m);
}
}
class A{
static{
System.out.println("A類靜態代碼塊" );
m=200;
}
static int m=100;
public A(){
System.out.println("B類代碼塊");
}
}
可以看到,結果如下圖。我分析了一下,以下是我的見解
static int m=100
這行代碼其實是執行了兩個步驟,
- 1.定義了一個int類型的常量
- 2.對其進行賦值
也就是說在爲m進行初始化的時候m的初值應該是0,此時在常量池中爲其開闢了空間。然後纔是進行賦值操作。在賦值時,靜態代碼塊和靜態常量都是靜態的,應當由上往下執行,所以m先被賦值爲200,然後才執行到了m=100,這也就不難理解爲啥最後輸出的m是100。