java - 局部内部类能访问非final修饰的局部变量;
怪我咯
怪我咯 2017-04-18 09:40:29
[Java讨论组]
怪我咯
怪我咯

走同样的路,发现不同的人生

全部回复(3)
阿神

基本同意 @小小码农努力学习 ,但其实并不能说是去掉了限制,可以说这是一颗语法糖语法糖而已,因为对于 JVM 而言,并没有内部类和外部类的概念,只是两个字节码文件 Outer.classOuter$Inner.class

还原一下语法糖的内幕:

public class Outer{//外部类Outer
    void show(){
        final int num =10;//局部变量num
        //局部内部类Inner
        class Inner{
            private final int val$num;
            private final Outer this$0;
            public Inner(Outer outer,int num){
                val$num = num;
                this$0 = outer;
            }
            void dosomething(){
                System.out.println(num);//局部内部类也能访问非final修饰的局部变量吗?
            }
        }
        new Inner(this,num).dosomething();
    }
}

看懂上面的代码就知道为什么我们可以访问外部类的成员变量方法体的局部变量(当然私有成员还需要在外部类添加相应的类似 get() 方法的语法糖,这里不探讨。)因为方法体的局部变量在内部类中会拷贝成内部类的成员变量,即并不是同一个内存区域(废话,局部变量是在栈中分配的,而类的成员变量是在堆中分配的),为了保持两者一致性,就只能限制他们初始化之后不能修改。

至于 JDK 1.8 加的语法糖就更简单了,就是自动加了一下 final,所以下面的代码还是编译不通过的。

public class Outer{//外部类Outer
    void show(){
        int num =10;//局部变量num
        //局部内部类Inner
        class Inner{
            void dosomething(){
                System.out.println(num);//局部内部类也能访问非final修饰的局部变量吗?
            }
        }
        num = 11;
        new Inner().dosomething();
    }
}
大家讲道理

java 8 去掉了 这里 final 限制

黄舟

可以不写,但默认还是有的

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号