在講Singleton時我舉例時用過這樣一段代碼:
public class SingletonDemo { private static class SingletonHolder{ private static SingletonDemo instance=new SingletonDemo(); } private SingletonDemo(){ System.out.println("Singleton has loaded"); } public static SingletonDemo getInstance(){ return SingletonHolder.instance; } }
相信你一定發現了一個問題:外部類中的getInstance()方法調用了內部類SingletonHolder中的private變量instance。
這就像是:
老師可以檢查教室中的學生書包里有沒有衛生巾。
坑爹啊!
開始時候博主想,會不會是因為靜態類在編譯時結構特殊,才可以訪問,然后做了個測試.......
class Outer{ class Inner{ private int number=5; } public int getNumber(){ return new Inner().number; } } public class Hello { public static void main(String[] args){ System.out.println(new Outer().getNumber()); } }
然后跑起來了.......輸出了5........
坑爹啊!
然后查了下,Java規范里確實規定了外部類可以訪問內部類的private/protected變量,就像訪問自己的private/protected變量一樣.........實際上,編譯器實現的時候是這樣的:
Outer類和Inner類不再是嵌套結構,而是變為一個包中的兩個類,然后,對於private變量的訪問,編譯器會生成一個accessor函數.......
嗯,反正這條記住就好。
