【Thinking in Java】類和對象的初始化過程

  在Java中,測試

  當一個類被調用的時候,它的初始化過程是怎麼樣的呢?spa

  當一個類被實例化的時候,它的初始化過程又是怎樣的呢?code

  爲何static方法不能未經對象就調用非static方法?對象

  下面咱們經過例子來找出答案。blog

 

當該類沒有父類時

  測試代碼:  

public class ClassLoadingTest {
    static String staticString=getStaticString();    //靜態成員變量
    private String privateString=getPrivateString();//普通成員變量
    public ClassLoadingTest() {
        System.out.println("Loading ClassLoadingTest()");
    }

    public static void loadStaticMethod() {
        System.out.println("Loading static method");
    }
    
    private void loadNotStaticMethed(){
        System.out.println("Loading NotStaticMethed");
    }
    
    private String getPrivateString() {
        String string=new String("Loading private variable");
        System.out.println(string);
        return string;
    }

    private static String getStaticString() {
        String string=new String("Loading static variable");
        System.out.println(string);
        return string;
    }
    
    public static void main(String[] args) {
        loadStaticMethod();    //加載靜態方法
        System.out.println("try to new ClassLoadingTest()");
        ClassLoadingTest test=new ClassLoadingTest();
        test.loadNotStaticMethed();//加載普通方法
    }

}

   打印結果:  

     Loading static variable

   Loading static method

   try to new ClassLoadingTest()

   Loading private variable

   Loading ClassLoadingTest()

   Loading NotStaticMethed          

 

  分析結果:

    1. 當調用該類的某個靜態方法時,首先加載該類的靜態成員變量和靜態方法(此時類尚未實例化)
    2. new該類以後,會加載該類的普通成員變量,而後纔是構造方法。

  得出結論:

    當一個類沒有父類的時候,加載順序爲:get

    靜態成員變量/靜態方法-->開始實例化-->普通成員變量/普通方法-->構造方法-->實例化結束。string

 

當該類有父類的時:

  測試代碼:

    父類:class

public class ClassLoadingTestSuper {
    static String staticString=getSuperStaticString();        //父類的靜態成員變量
    private String privateString=getSuperPrivateString();    //父類的普通成員變量
    public ClassLoadingTestSuper() {
        System.out.println("Loading ClassLoadingTestSuper()");
    }
    
    private String getSuperPrivateString() {
        String string=new String("Loading super class private variable");
        System.out.println(string);
        return string;
    }

    private static String getSuperStaticString() {
        String string=new String("Loading super class static variable");
        System.out.println(string);
        return string;
    }

}

    子類:test

public class ClassLoadingTest extends ClassLoadingTestSuper {

/*內容與ClassLoadingTest相同*/

}

  打印結果:

Loading super class static variable

Loading static variable

Loading static method

try to new ClassLoadingTest()

Loading super class private variable

Loading ClassLoadingTestSuper()

Loading private variable

Loading ClassLoadingTest()

Loading NotStaticMethed

  分析結果:

    1. 首先加載的是父類的static變量和方法;
    2. 而後加載的是該類的static變量和方法;
    3. 將該類實例化;
    4. 而後加載的是父類的普通成員變量和方法;
    5. 而後加載的是父類的構造方法;
    6. 而後加載的是該類的成員變量和方法;
    7. 而後加載的纔是該類的構造方法;
    8. 最後實例化結束,外部才能夠操做該對象。

 

  得出結論:

    當該類有父類的時候,類的實例化的加載過程是:變量

      父類的static成員變量和方法-->該類的static變量和方法-->開始實例化-->父類的普通成員變量和方法-->父類的構造方法-->該類的普通成員變量和方法-->該類的構造方法-->實例化結束

相關文章
相關標籤/搜索