内部类可以访问外部类的属性和方法吗?

注意:

在内部类构造的时候,会将外部类的引用传递进来,并且作为内部类的一个属性,所以内部类会持有一个其外部类的引用。

当内部类调用外部类的私有属性时,其真正的执行是调用了编译器生成的属性的静态方法(即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

原文地址:https://www.cnblogs.com/bluestorm/p/5867058.html