外部类加载顺序:
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 的有参构造,参数是普通内部类。。