注意:
在內部類構造的時候,會將外部類的引用傳遞進來,並且作為內部類的一個屬性,所以內部類會持有一個其外部類的引用。
當內部類調用外部類的私有屬性時,其真正的執行是調用了編譯器生成的屬性的靜態方法(即acess$0,access$1等)來獲取這些屬性值。這一切都是編譯器的特殊處理。
外部類可以通過內部類的實例獲取私有屬性x的操作.
如何讓內部類私有成員不被外部訪問
相信看完上面兩部分,你會覺得,內部類的私有成員想不被外部類訪問都很困難吧,誰讓編譯器“愛管閑事”呢,其實也是可以做到的。那就是使用匿名內部類。
由於mRunnable對象的類型為Runnable,而不是匿名內部類的類型(我們無法正常拿到),而Runanble中沒有x這個屬性,所以mRunnable.x是不被允許的。
1 內部類對象的創建依賴於外部類對象;
2 內部類對象持有指向外部類對象的引用。
關於內部類如何訪問外部類的成員, 分析之后其實也很簡單, 主要是通過以下幾步做到的:
1 編譯器自動為內部類添加一個成員變量, 這個成員變量的類型和外部類的類型相同, 這個成員變量就是指向外部類對象的引用;
2 編譯器自動為內部類的構造方法添加一個參數, 參數的類型是外部類的類型, 在構造方法內部使用這個參數為1中添加的成員變量賦值;
3 在調用內部類的構造函數初始化內部類對象時, 會默認傳入外部類的引用。
java中,匿名內部類可以使用外部類的成員變量嗎
https://segmentfault.com/q/1010000002796833
細話Java:"失效"的private修飾符
http://droidyue.com/blog/2014/10/02/the-private-modifier-in-java/
深入理解Java中為什么內部類可以訪問外部類的成員
http://blog.csdn.net/zhangjg_blog/article/details/20000769