局部内部类访问局部变量的问题

class Outer {
    public void fun(){
        int num = 90;
        
        class Inner {
            public void printNum(){
                // num++;
                System.out.println(num);
            }
        }
        
        Inner in = new Inner();
        in.printNum();
    }
    
    public static void main(String[] a){
        Outer out = new Outer();
        out.fun();
    }
}

局部内部类在访问局部变量的时候,被访问的局部变量必须是 final 的,可是上面的代码却没有报错,并打印出了90。
当我把里面的注释代码去掉,试图修改局部变量值的时候才编译错误,提示需要加上final。
这是语法糖么,还是存在什么奥秘?

运行环境:jdk 1.8

阅读 2.7k
2 个回答

JAVA 8 新特性,如果只是访问,未做修改,是不需要显性的声明final了,只是JVM编译源码的时候,还是会自动加上final

java8 要求是final或effectively final,即等效final的代码也是被允许的,如果发生了修改就不等效了,编译当然会报错。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题