内部类、静态内部类-延迟加载

外部类加载顺序:
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万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章