內部類、靜態內部類-延遲加載

外部類加載順序:
1、外部類初次加載,會初始化靜態變量、靜態代碼塊、靜態方法,但不會加載內部類和靜態內部類。
2、實例化外部類,調用外部類的靜態方法、靜態變量,則外部類必須先進行加載,但只加載一次。
3、直接調用靜態內部類時,外部類不會加載。

內部類加載順序:
在初次調用的時候加載,且只加載一次

package com.panda;

/**
 * author: ysd
 * Date: 2020/1/9
 * Description:內部類、靜態內部類,延遲加載
 */
public class PandaInnerClass {

    static {
        System.out.println("我是 PandaInnerClass 的靜態代碼塊。。");
    }

    public PandaInnerClass() {
        System.out.println("我是 PandaInnerClass 的無參構造");
    }

    public PandaInnerClass(String flag) {
        System.out.println("我是 PandaInnerClass 的有參構造,參數是" + flag);
    }

    class InnerClass {

        private PandaInnerClass innerClass = new PandaInnerClass("普通內部類。。");
    }

    static class StaticInnerClass {

        private static PandaInnerClass innerClass = new PandaInnerClass("靜態內部類。。");
        static {
            System.out.println("我是靜態內部類的 StaticInnerClass 的靜態代碼塊。。");
        }

        public static void load() {
            System.out.println("靜態load方法。。");
        }
    }

    public static PandaInnerClass getInstance() {
        return StaticInnerClass.innerClass;
    }
    public static void main(String[] args){
        System.out.println("let us  go ..");
        PandaInnerClass.StaticInnerClass.load();
        PandaInnerClass ok = StaticInnerClass.innerClass;
        PandaInnerClass hello = ok.new InnerClass().innerClass;
    }
}

執行結果

我是 PandaInnerClass 的靜態代碼塊。。
let us  go ..
我是 PandaInnerClass 的有參構造,參數是靜態內部類。。
我是靜態內部類的 StaticInnerClass 的靜態代碼塊。。
靜態load方法。。
我是 PandaInnerClass 的有參構造,參數是普通內部類。。

解釋:
1、jvm執行main方法,加載PandaInnerClass 類,加載靜態代碼塊,輸出我是 PandaInnerClass 的靜態代碼塊。。

2、執行 System.out.println(“let us go …”); 控制檯輸出let us go .
.
3、執行PandaInnerClass.StaticInnerClass.load();調用靜態內部類StaticInnerClass,加載StaticInnerClass,
先加載她得靜態屬性,執行PandaInnerClass的有參構造,輸出我是 PandaInnerClass 的有參構造,參數是靜態內部類。。
然後加載靜態代碼塊,輸出我是靜態內部類的 StaticInnerClass 的靜態代碼塊。。,
然後調用load方法,輸出靜態load方法。。

4、執行 PandaInnerClass hello = ok.new InnerClass().innerClass;調用內部類InnerClass,加載內部類InnerClass,調用innerClass屬性,執行PandaInnerClass的構造函數,輸出我是 PandaInnerClass 的有參構造,參數是普通內部類。。

發佈了107 篇原創文章 · 獲贊 22 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章