關於類加載時靜態成員變量的賦默認值和賦初始值問題


/**
 * @author yanwu12138
 * @date 2020-06-03 20:25:33.
 * <p>
 * describe:
 * 類加載時靜態你成員變量的賦值過程:
 * * 一:loadClass(類加載)
 * *    1. 將class對象加載到內存中
 * *    2. 給class對象的靜態成員變量賦默認值
 * *    3. 給class對象的靜態成員變量賦初始值
 * * 二:newObject(創建對象)
 * *    1. 給Object對象申請內存空間
 * *    2. 將Object對象加載到內存
 * *    3. 給Object對象的靜態成員變量賦默認值
 * *    4. 給Object對象的靜態成員變量賦初始值
 */
public class D03ClassLoaderProcedure {

    public static void main(String[] args) {
        // ----- 結果為:3
        System.out.println("count01 -- " + Count_01.count);
        // ----- 結果為:2
        System.out.println("count02 -- " + Count_02.count);
    }

    /**
     * 1. 將 Count_01 對象加載到內存
     * 2. 給 count 屬性賦默認值:0
     * 3. 給 count_01 屬性賦默認值:null
     * 4. 給 count 屬性賦初始值:2
     * 5. 給 count_01 屬性對象賦初始值:new Count_01()
     * 注意:此時的 count 值為:2,在第 5 步給 count_01 屬性賦初始值時會調用 Count_01 的構造方法
     * 所以:count 會 ++,最終 count 值為:3
     */
    private static class Count_01 {
        public static int count = 2;
        public static Count_01 count_01 = new Count_01();

        private Count_01() {
            count++;
        }
    }

    /**
     * 1. 將 Count_02 對象加載到內存
     * 2. 給 count_02 屬性賦默認值:null
     * 3. 給 count 屬性賦默認值:0
     * 4. 給 count_02 屬性賦初始值:new Count_02()
     * 5. 給 count 屬性賦默認值:2
     * 注意:在第 4 步給 count_02 屬性賦初始值時會調用 Count_02 的構造方法,此時的 count 還沒有賦初始值,只有默認值,所以此時 count為:0,count++為:1
     * 在第 5 步給count 屬性賦默認值時會用 2 覆蓋 count++:1 的值,所以 count 最終值為:2
     */
    private static class Count_02 {
        public static Count_02 count_02 = new Count_02();
        public static int count = 2;

        private Count_02() {
            count++;
        }
    }
}


免責聲明!

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



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