震惊!外部类可以访问内部类private变量
2017-04-01 13:38
225 查看
在讲Singleton时我举例时用过这样一段代码:
相信你一定发现了一个问题:外部类中的getInstance()方法调用了内部类SingletonHolder中的private变量instance。
这就像是:
老师可以检查教室中的学生书包里有没有卫生巾。
坑爹啊!
开始时候博主想,会不会是因为静态类在编译时结构特殊,才可以访问,然后做了个测试.......
然后跑起来了.......输出了5........
坑爹啊!
然后查了下,Java规范里确实规定了外部类可以访问内部类的private/protected变量,就像访问自己的private/protected变量一样.........实际上,编译器实现的时候是这样的:
Outer类和Inner类不再是嵌套结构,而是变为一个包中的两个类,然后,对于private变量的访问,编译器会生成一个accessor函数.......
嗯,反正这条记住就好。
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函数.......
嗯,反正这条记住就好。
相关文章推荐
- 为什么内部类可以访问外部类的变量
- 震惊!外部类可以访问内部类private变量
- 外部类可以自由访问内部类的private方法
- 外部类是否可以访问内部类private元素
- 为什么内部类访问的外部变量需要使用final修饰
- 内部类之设计模式-内部类可以访问外部类的私有成员
- 深入理解Java中为什么内部类可以访问外部类的成员
- 在我的上一篇博客 深入理解Java中为什么内部类可以访问外部类的成员
- 内部类访问外部类变量的问题
- 深入理解Java中为什么内部类可以访问外部类的成员
- # 深入理解Java中为什么内部类可以访问外部类的成员#
- 内部类访问的外部变量需要使用final修饰解释原因
- 内部类之设计模式-内部类可以访问外部类的私有成员
- 为什么内部类访问的外部变量需要使用final修饰
- 为什么内部类访问的外部变量需要使用final修饰
- Java基础-内部类-为什么成员内部类可以无条件访问外部类
- 深入理解Java中为什么内部类可以访问外部类的成员
- 深入理解Java中为什么内部类可以访问外部类的成员
- 内部类可以访问外部类的属性
- 【Java】内部类访问的外部变量定义成final (数据保持一致,外部修改后无法通知内部,编译的时候会通过构造方法传进来) Java内部类一般访问不了外部变量