Java外部類可以訪問內部類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函數.......

嗯,反正這條記住就好。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM