引言:
這兩天在學習設計模式, 其中單例模式有種實作是通過靜态内部類方式實作, 有些不可思議, 故在此做個小實驗驗證一下靜态内部類的加載時機
代碼:
public class TestStatic {
private static long OUTER_TIME = System.currentTimeMillis();
static {
System.out.println("外部靜态代碼塊執行了:" + System.currentTimeMillis());
}
public TestStatic() {
System.out.println("外部構造方法執行了:" + System.currentTimeMillis());
}
// 内部類
class InnerClass{
public InnerClass() {
System.out.println("非靜态内部類構造方法執行了:" + System.currentTimeMillis());
}
}
// 靜态内部類
static class StaticInnerClass{
public static long STATIC_INNER_TIME = System.currentTimeMillis();
static {
System.out.println("靜态内部類靜态代碼塊執行了:" + System.currentTimeMillis());
}
}
public static void main(String[] args) {
/*
* 執行此行代碼, 調用外部成員變量
* 輸出結果:
* 外部靜态代碼塊執行了:1574749944398
*/
long t1 = TestStatic.OUTER_TIME;
/*
* 執行此行, 調用外部類構造
* 輸出結果:
* 外部靜态代碼塊執行了:1574750008319
* 外部構造方法執行了:1574750008319
*/
//new TestStatic();
/*
* 執行此行, 調用非靜态内部類構造
* 輸出結果:
* 外部靜态代碼塊執行了:1574750048601
* 外部構造方法執行了:1574750048602
* 非靜态内部類構造方法執行了:1574750048602
*/
//InnerClass innerClass = new TestStatic().new InnerClass();
/*
* 執行此行, 調用靜态内部類
* 輸出結果:
* 外部靜态代碼塊執行了:1574750082207
* 靜态内部類靜态代碼塊執行了:1574750082208
*/
//long sTATIC_INNER_TIME = StaticInnerClass.STATIC_INNER_TIME;
}
}
誤區:
一直以為隻要是static修飾的靜态資源隻要在類加載時就會執行, 是以靜态内部類在外部類加載時也會執行, 其實是 錯誤 的.
總結:
不管是靜态内部類還是非靜态内部類, 不會因為外部類的加載而加載; 靜态内部類的加載也會使外部類加載完成, 但外部類的構造方法不會執行