参考链接:Java内部类详解
1. 为什么成员内部类可以无条件访问外部类的成员
查看参考文章后总结出:
原因在于java编译器,虽然我们在源码中定义的内部类的构造器是无参构造器,但是编译器还是会默认添加一个参数,该参数的类型为指向外部类对象的一个引用,因此可以在成员内部类中随意访问外部类的成员。
2. 为什么局部内部类和匿名内部类只能访问外部类中的final变量
查看参考文章后总结出:
原因
内部类中访问外部类的变量会存在声明周期的影响
java的解决方案
为了解决该问题java使用复制的手段,说明如下:
- 局部变量在编译期时就可以确认的,则会在内部类中有一份copy;
- 局部变量在编译期无法确认的,则通过构造器传参方式来对copy进行初始化赋值
通过copy解决了声明周期影响变量使用的问题,但是引入一个新的问题,如下:
既然在内部类的变量和外部类中的变量虽然名称相同,但实际上是不同的变量,当在内部类中改变该变量的值的话实际上并不影响外部类中的变量,但是在程序的角度来说这两者是同一变量,改变其中一个另一个也会改变,这样就造成了数据不一致性问题。为了解决这个问题,java编译器限定将内部类引用外部类的变量必须被final修饰,也就是不允许对该变量进行更改(对于引用类型的变量,是不允许指向新的对象),这样就避免数据不一致性问题的产生。