内部类访问局部变量的时候,为什么变量必须加上final修饰
来源:互联网 发布:网络主播行业调查分析 编辑:程序博客网 时间:2024/05/21 07:00
这里的局部变量就是在类方法中的变量,能访问方法中变量的类当然也是局部内部类了。
我们都知道,局部变量在所处的函数执行完之后就释放了,但是内部类对象如果还有引用指向的话它是还存在的。例如下面的代码:
class Outer{ public static void main(String[] args){ Outer out = new Outer(); Object obj = out.method(); } Object method(){ int locvar = 1; class Inner{ void displayLocvar(){ System.out.println("locvar = " + locvar); } } Object in = new Inner(); return in; }}
当out.method()方法执行结束后,局部变量 locvar 就消失了,但是在method()方法中 obj in = new Inner() 产生的 in 对象还存在引用obj,这样对象就访问了一个不存在的变量,是不允许的。这种矛盾是由局部内部类可以访问局部变量但是局部内部类对象和局部变量的生命周期不同而引起的。
局部内部类访问局部变量的机制
在java中,类是封装的,内部类也不例外。我们知道,非静态内部类能够访问外部类成员是因为它持有外部类对象的引用 Outer.this, 就像子类对像能够访问父类成员是持有父类对象引用super一样。局部内部类也和一般内部类一样,只持有了Outer.this,能够访问外部类成员,但是它又是如何访问到局部变量的呢?
实际上java是将局部变量作为参数传给了局部内部类的构造函数,而将其作为内部类的成员属性封装在了类中。我们看到的内部类访问局部变量实际上只是访问了自己的成员属性而已,这和类的封装性是一致的。那么上面的代码实际上是这样:
Object method(){ int locvar = 1; class Inner{ private int obj; public Inner(int obj){ this.obj = obj; } void displayLocvar(){ System.out.println("locvar = " + locvar); } } Object in = new Inner(locvar); //将locvar作为参数传给构造,以初始话成员 return in; }
那么问题又来了,我们写代码的目的是在内部类中直接控制局部变量和引用,但是java这么整我们就不高兴了,我在内部类中整半天想着是在操作外部变量,结果你给整个副本给我,我搞半天丫是整我自己的东西啊?要是java不这么整吧,由破坏了封装性--------你个局部内部类牛啊,啥都没有还能看局部变量呢。这不是java风格,肯定不能这么干。这咋整呢?
想想,类的封装性咱们一定是要遵守的,不能破坏大局啊。但又要保证两个东西是一模一样的,包括对象和普通变量,那就使用final嘛,当传递普通变量的之前我把它变成一个常量给你,当传递引用对象的时候加上final就声明了这个引用就只能指着这一个对象了。这样就保证了内外统一。
- java中内部类访问局部变量的时候,为什么变量必须加上final修饰
- 内部类访问局部变量的时候,为什么变量必须加上final修饰
- 内部类访问局部变量的时候,为什么变量必须加上final修饰(转)
- 内部类访问局部变量的时候,为什么变量必须加上final修饰
- 为什么内部类访问局部变量需要加final修饰?
- JAVA中内部类(匿名内部类)访问的局部变量为什么要用final修饰?
- JAVA中内部类(匿名内部类)访问的局部变量为什么要用final修饰?
- 局部内部类 局部内部类访问局部变量必须用final修饰
- 局部内部类为什么只能访问final修饰的局部变量
- 为什么局部内部类访问外边的局部变量必须为final?
- 局部变量被内部类访问时必须用final修饰的问题
- 为什么局部内部类访问局部变量,局部变量必须声明为final?
- 为什么方法中的内部类只能访问final修饰的局部变量
- 为什么匿名内部类访问当前方法的局部变量必须为final类型
- 为什么匿名内部类只能访问final修饰的变量
- Java--局部内部类在访问他所在方法中的局部变量必须用final修饰
- 在java中, 方法的内部类可以访问方法中的局部变量,但必须用final修饰才能访问。
- 关于局部内部类访问所在方法的参数或局部变量为什么必须是final的
- 【嵌入式开发】树莓派h264实时视频监控
- jQuery 提供了多种遍历 DOM 的方法。 遍历方法中最大的种类是树遍历(tree-traversal)。jQuery 提供了多种遍历 DOM 的方法。 遍历方法中最大的种类是树遍历(tree-t
- 练习场acm 题目663 弟弟的作业
- NOI2016游记
- 杭电 1002-大数相加
- 内部类访问局部变量的时候,为什么变量必须加上final修饰
- Android代码命名规范
- java设计模式_桥接模式
- 牛客网做题学到的知识(一)
- 【嵌入式开发】用 VLC 显示 树莓派摄像头 H264 裸流
- 网络参考模型与TCP/IP协议
- Web即时通讯学习(一)
- 【英语总结】七月
- 解决GridLayout API level小于21时平均分配行列的问题