天天看點

Java自主學習(三):類的加載順序

 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類