Java内部类问题总结

参考链接:Java内部类详解

1. 为什么成员内部类可以无条件访问外部类的成员

查看参考文章后总结出:
原因在于java编译器,虽然我们在源码中定义的内部类的构造器是无参构造器,但是编译器还是会默认添加一个参数,该参数的类型为指向外部类对象的一个引用,因此可以在成员内部类中随意访问外部类的成员。

2. 为什么局部内部类和匿名内部类只能访问外部类中的final变量

查看参考文章后总结出:

原因

内部类中访问外部类的变量会存在声明周期的影响

java的解决方案

为了解决该问题java使用复制的手段,说明如下:

  • 局部变量在编译期时就可以确认的,则会在内部类中有一份copy;
  • 局部变量在编译期无法确认的,则通过构造器传参方式来对copy进行初始化赋值

通过copy解决了声明周期影响变量使用的问题,但是引入一个新的问题,如下:

既然在内部类的变量和外部类中的变量虽然名称相同,但实际上是不同的变量,当在内部类中改变该变量的值的话实际上并不影响外部类中的变量,但是在程序的角度来说这两者是同一变量,改变其中一个另一个也会改变,这样就造成了数据不一致性问题。为了解决这个问题,java编译器限定将内部类引用外部类的变量必须被final修饰,也就是不允许对该变量进行更改(对于引用类型的变量,是不允许指向新的对象),这样就避免数据不一致性问题的产生。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值