你真的會(huì)寫單例模式嗎——Java實(shí)現(xiàn)
Android設(shè)計(jì)模式源碼解析之單例模式
深度分析 Java 的枚舉類型:枚舉的線程安全性及序列化問題
[轉(zhuǎn)+注]單例模式的七種寫法
其中提到靜態(tài)內(nèi)部類方法:
Java內(nèi)部類詳解
關(guān)于java內(nèi)部類加載順序的問題
順序是:父類靜態(tài)屬性-》父類靜態(tài)代碼塊-》子類靜態(tài)變量-》子類靜態(tài)代碼塊-》父類非靜態(tài)變量-》父類非靜態(tài)代碼塊-》父類構(gòu)造函數(shù)-》子類非靜態(tài)變量-》子類非靜態(tài)代碼塊-》-》子類構(gòu)造函數(shù)
這樣的加載順序不是絕對(duì)的 因?yàn)殪o態(tài)變量和靜態(tài)代碼塊跟聲明順序有關(guān)樟插。
對(duì)于如果靜態(tài)代碼塊中調(diào)用靜態(tài)變量睛竣,那么靜態(tài)變量必須在靜態(tài)代碼塊前面聲明;如果靜態(tài)代碼塊中沒有調(diào)用靜態(tài)變量,那么就跟順序有關(guān)了曲尸,誰先聲明誰先被加載液茎。說白了還是順序加載票彪,之所以會(huì)出現(xiàn)“如果靜態(tài)代碼塊中調(diào)用靜態(tài)變量援所,那么靜態(tài)變量必須在靜態(tài)代碼塊前面聲明”,是因?yàn)樽兞渴锹暶鞫蛹猿霈F(xiàn)編譯錯(cuò)誤色冀。
應(yīng)用到內(nèi)部類中 靜態(tài)變量和靜態(tài)代碼塊跟聲明順序有關(guān)。 這樣就可以解釋你的問題了柱嫌。內(nèi)部類也是類锋恬。
測(cè)試所用jdk版本1.8.0_20
類靜態(tài)塊-類靜態(tài)屬性這個(gè)跟順序有關(guān)系 如果類靜態(tài)屬性在類靜態(tài)代碼塊之前 那么類靜態(tài)屬性先初始化
package cn.canon.Single;
public class StaticInnerClassLoaderTime {
public static class Inner {
static {
System.out.println("TestInner Static!");
}
public final static StaticInnerClassLoaderTime testInstance =
new StaticInnerClassLoaderTime(3);
}
public static StaticInnerClassLoaderTime getInstance() {
return Inner.testInstance;
}
public StaticInnerClassLoaderTime(int i) {
System.out.println("Test " + i + " Construct! ");
}
// 類靜態(tài)屬性
public static StaticInnerClassLoaderTime testOut =
new StaticInnerClassLoaderTime(1);
public static int value = 3;
// 類靜態(tài)塊
static {
System.out.println("Test Static" + value);
}
public static void main(String args[]) {
StaticInnerClassLoaderTime t = new StaticInnerClassLoaderTime(2);
StaticInnerClassLoaderTime.getInstance();
}
}
Test 1 Construct!
Test Static3
Test 2 Construct!
TestInner Static!
Test 3 Construct!