震惊!外部类可以访问内部类private变量
2017-03-20 20:31
134 查看
在讲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变量
- 深入理解Java中为什么内部类可以访问外部类的成员
- Java中为什么内部类可以访问外部类的成员
- Java基础-内部类-为什么成员内部类可以无条件访问外部类
- 在内部类中可以访问其外部类的所有域,即使是私有域
- 内部类之设计模式-内部类可以访问外部类的私有成员
- # 深入理解Java中为什么内部类可以访问外部类的成员#
- 在我的上一篇博客 深入理解Java中为什么内部类可以访问外部类的成员
- 深入理解Java中为什么内部类可以访问外部类的成员
- Java匿名内部类可以访问外部类的成员;若访问所在方法的成员,那个成员必须具有final属性
- 深入理解Java中为什么内部类可以访问外部类的成员
- 深入理解Java中为什么内部类可以访问外部类的成员
- 深入理解Java中为什么内部类可以访问外部类的成员
- 外部类是否可以访问内部类private元素
- 内部类之设计模式-内部类可以访问外部类的私有成员
- 深入理解Java中为什么内部类可以访问外部类的成员
- 外部类可以访问内部类的私有成员
- 深入理解Java中为什么内部类可以访问外部类的成员
- * 编写一个内部类,外部类为药品类,内部类为药架类,包括一个放置药品的方法,要求: * 1.外部其他类不能直接访问内部类 * 2.但外部其他类可以访问内部类的放置药品方法
- 深入理解Java中为什么内部类可以访问外部类的成员