外部類加載順序:
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 的有參構造,參數是普通內部類。。