天天看點

靜态内部類加載時機

引言:

這兩天在學習設計模式, 其中單例模式有種實作是通過靜态内部類方式實作, 有些不可思議, 故在此做個小實驗驗證一下靜态内部類的加載時機

代碼:

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修飾的靜态資源隻要在類加載時就會執行, 是以靜态内部類在外部類加載時也會執行, 其實是 錯誤 的.

總結:

不管是靜态内部類還是非靜态内部類, 不會因為外部類的加載而加載; 靜态内部類的加載也會使外部類加載完成, 但外部類的構造方法不會執行