外部類可以訪問內部類private變數
阿新 • • 發佈:2018-12-23
在講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 newInner().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函式.......
嗯,反正這條記住就好。