每一次記錄,都是對自己的一次負責。
首先討論一個包含普通成員變量、靜態變量、構造方法、普通代碼塊、靜態代碼塊的類,關於這幾個的加載順序。
public class A {
public int a = 1;
public static int b = 22;
{
System.out.println("普通代碼塊");
System.out.println("此時 a = " + a);
a = 2;
System.out.println("此時 b = " + b);
}
static {
System.out.println("靜態代碼塊");
System.out.println("此時 b = " + b);
b = 33;
}
public A(){
System.out.println("構造器方法");
}
public static void main(String[] args) {
new A();
}
}
結果:
靜態代碼塊
此時 b = 22
普通代碼塊
此時 a = 1
此時 b = 33
構造器方法
結果分析:
1.從代碼的執行結果來看,首先初始化的一概是靜態變量b,然後是靜態代碼塊,從b的值可以看出;
2.靜態代碼塊執行完畢後,接着便是普通成員變量的初始化了,然後便是普通代碼塊。
3.最後的最後纔是一個類的構造函數。
不過這裏有個不嚴謹的地方,我沒有證明普通成員變量是否一定是在靜態代碼塊之後執行初始化的,想一想也就明白了,普通成員變量需要new一個對象才能被使用,而靜態變量不用創建對象便可以被直接使用,所以也就沒有證明。