Java内部类

5

可能的重复问题:
无法在另一个方法中定义的内部类中引用非最终变量
为什么内部类需要“final”外部实例变量[Java]?

class MyOuter {    

    private String x = "Outer";
    void doStuff(){
           final String z = "local variable";
           class MyInner {
                 public void seeOuter(){
                        System.out.println("Outer x is" + x);
                        System.out.println("Local variable z is" + z); // does
                        // not compile if final keyword from String z is removed
                 }
           }
     }
}

上述代码运行正常。 我想知道如果我从字符串z中删除final关键字,编译器为什么会报错。final关键字有什么区别?
2个回答

3

你的类myInner实际上无法“看到”你正在引用的方法作用域变量z。编译器只是给内部类一个私有副本z。因此,如果稍后更改z,则您的程序可能以神秘的方式“中断”,因为代码使其“看起来”像是同一变量。

因此,除非你声明它为final,否则编译器不会让你编写那段代码,以确保你理解z不能稍后更改。


0

1) z 是一个引用,指向当前线程堆栈上的 String。现在,假设在您的内部类中启动了一个线程 (B),并且您想从 B 中访问 z。但是 B 没有访问 A 堆栈的权限。为了允许此访问,Java 会复制此引用。但为了确保两个线程不会更改自己的值,从而使系统处于不一致状态,您必须将其声明为 final。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接