1. 程式人生 > >震驚!外部類可以訪問內部類private變數

震驚!外部類可以訪問內部類private變數

在講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函式.......

嗯,反正這條記住就好。