題目:
public class StaticTest{
static StaticTest st = new StaticTest();
public static void staticFunction(){
System.out.println("4");
}
static{
System.out.println("1");
}
StaticTest(){
System.out.println("3");
System.out.println("a="+a+" b="+b);
}
int a=100;
static int b=112;
{
System.out.println("2");
}
public static void main(String args[]){
staticFunction();
}
}
執行結果:
分析:
類的生命周期是:加載->驗證->准備->解析->初始化->使用->卸載
准備和初始化階段涉及類變量的初始化和賦值
准備階段:為static類變量分配內存並設置默認值,st = null b = 0
初始化階段:
執行類構造器
先按順序執行靜態變量,static StaticTest st = new StaticTest();
然后會執行StaticTest()方法,執行前先執行構造代碼塊再初始化成員變量,所以先輸出2,a=100,b由於已經初始化完畢,不執行
執行StaticTest()中的輸出3,,a=100,b=0
StaticTest()執行完之后,順序執行static代碼塊,輸出1
main中調用staticfunction 輸出4
|—>執行構造代碼塊->初始化成員變量-|
執行static變量初始化->執行靜態變量->執行方法->繼續執行static代碼塊->main調用方法