這個(gè)問題我也是從單例設(shè)計(jì)模式中找到的常遂,問題如下
先帖代碼
public class Main {
public Main() {
System.out.println("controut");
}
public static void main(String[] args) {
System.out.println("main");
// InnerMain main2 = new InnerMain();
// Main main = InnerMain.mian;
}
private static class InnerMain {
public static final Main mian = new Main();
}
}
再貼結(jié)果
![
運(yùn)行結(jié)果
]
看到?jīng)]克胳,所謂的靜態(tài)屬性根本沒有執(zhí)行
就是這句
public static final Main mian = new Main();
講道理漠另。跃赚。。满败。
在程序初始化的時(shí)候算墨,所有的靜態(tài)屬性應(yīng)該全部分配內(nèi)存,但是為何唯獨(dú)靜態(tài)內(nèi)部類中的靜態(tài)屬性沒有分配净嘀?
作出以下猜測(cè):
靜態(tài)內(nèi)部類和靜態(tài)方法一致,如果沒有調(diào)用暑刃,則不會(huì)被加載膜眠,當(dāng)被使用時(shí),類加載器進(jìn)行加載然后分配其靜態(tài)屬性的內(nèi)存空間
你看 我將注釋的兩句代碼 任何一句取消注釋婿脸,都會(huì)調(diào)用構(gòu)造方法柄驻。
運(yùn)行結(jié)果
所以單利模式考慮懶漢式和線程安全的情況下 抑钟,采用靜態(tài)內(nèi)部類為最好的解決方案野哭。