1.主方法在加載類外時
public class Test05 {
public static void main(String[] args) {
System.out.println("main start");
new StaticInit();
System.out.println("main end");
}
}
class StaticInit {
public static StaticInit si = new StaticInit();
public StaticInit() {
System.out.println("constructor");
m1();
System.out.println(si);}
public static void m1() {System.out.println("static method"); }
{ System.out.println("instance block"); }
static { System.out.println("static"); }
}
/*結果為
main start
instance block
constructor
static method
null
static
instance block
constructor
static method
[email protected]
main end
*/
注:
1.主方法中 想要new StaticInit(); 先要加載類
2.加載類:
再按順序加載靜态成員
a.先加載si = new StaticInit(); (代碼塊是在所有構造器執行之前調用)
在構造方法内部輸出si, 此時si還沒有指派成功 是以是null
b.加載靜态方法 - 不會主動執行
c.加載代碼塊
3.new對象: 調用構造器(代碼塊是在所有構造器執行之前調用)
在構造方法内部輸出si, 此時si已經加載并指派成功, 是以輸入位址
2.主方法在加載類内時
public class Test06 {
static { System.out.println("static"); }
public static Test06 si = new Test06();
public Test06() {
System.out.println("constructor");
m1();
System.out.println(si);
}
public static void m1() {
System.out.println("static method");
}
{ System.out.println("instance block"); }
public static void main(String[] args) {
System.out.println("main start");
new Test06();
System.out.println("main end");
}
}
/*結果為
static
instance block
constructor
static method
null
main start
instance block
constructor
static method
[email protected]
main end
*/
注:主方法要執行, 先要加載Test06類