內部類可以訪問外部類的屬性和方法嗎?


注意:

在內部類構造的時候,會將外部類的引用傳遞進來,並且作為內部類的一個屬性,所以內部類會持有一個其外部類的引用。

當內部類調用外部類的私有屬性時,其真正的執行是調用了編譯器生成的屬性的靜態方法(即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

 


免責聲明!

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



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