Java 類的加載過程(阿里面試題)


問以下程序打印出什么內容:

  問題及解析如下:

/**
 * 加載方法不等於執行方法,初始化變量則會賦值
 *             類加載順序應為 加載靜態方法-初始化靜態變量-執行靜態代碼塊
 *             實例化時 先加載非靜態方法-實例化非靜態變量-執行構造代碼塊-執行構造函數
 * @author panteng
 *
 */
public class StaticTest {
    /**第一個加載*/
    public static int k = 0;
    /**第二個加載,因為是new一個實例,
     * 首先初始化j 打印出  1:j i=0 n=0
     * 執行構造塊     打印出  2:構造快 i=1 n=1
     * 執行構造方法 打印出  3:t1 i=2 n=2
     * 實例化完成
     */
    public static StaticTest t1 = new StaticTest("t1");
    /**第三個加載 過程同上
     * 首先初始化j 打印出  4:j i=3 n=3
     * 執行構造塊     打印出  5:構造快 i=4 n=4
     * 執行構造方法 打印出  6:t2 i=5 n=5
     */
    public static StaticTest t2 = new StaticTest("t2");
    /**第四個加載
     * 打印出  7:i i=6 n=6
     */
    public static int i = print("i");
    /**
     * 第五個加載
     */
    public static int n = 99;
    /**
     * 此變量在類加載的時候並不初始化,在實例化類的時候初始化
     */
    public int j = print("j");
     
    {
        print("構造快");
    }
    /**
     * 第六個加載 此時,n已經被初始化  所以打印出
     * 8:靜態塊 i=7 n=99
     */
    static{
        print("靜態塊");
    }
    //-----------以上屬於類加載---------------------
    /**
     * 實例化過程:
     *         首先加載非靜態方法集;
     *         初始化非靜態變量:9:j i=8 n=100
     *         執行構造塊:10:構造快 i=9 n=101
     *         執行構造方法:11:init i=10 n=102
     * 實例化完成
     */
    
    /**
     * 執行構造函數  實例化完成
     * @param str
     */
    public StaticTest(String str) {
        System.out.println((++k) + ":" + str + " i=" + i + " n=" + n);
        ++n;
        ++i;
    }
    /**
     * 這個應該是最先加載 但是,加載不等於執行
     * 因為如果不加載此函數,靜態變量是無法初始化的
     * @param str
     * @return
     */
    public static int print(String str) {
        System.out.println((++k) + ":" + str + " i=" + i + " n=" + n);
        ++i;
        return ++n;
    }
    
    public static void main(String[] args) {
        /**首先加載類,然后實例化:
         * 類加載過程:
         *         首先加載所有的靜態方法,但不執行;
         *         然后按照靜態變量的順序開始初始化
         *         靜態變量初始化完畢后執行靜態構造塊(不執行構造塊)
         *         此時類加載完畢
         * 實例化過程:
         *         加載非靜態方法
         *         初始化非靜態變量
         *         執行構造代碼塊
         *         執行構造函數
         *         此時實例化完畢
         */
        StaticTest t = new StaticTest("init");
    }
 
}
 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM