内部类和局部变量

NIN*_*OOP 14 java local-variables inner-classes

为什么我需要声明local variablefinal,如果我的Inner class方法中定义需要使用它?

示例:

class MyOuter2 {

private String x = "Outer2";

void doStuff() {
    final String y = "Hello World";

    final class MyInner {

        String z = y;

        public void seeOuter() {
            System.out.println("Outer x is "+x);
            System.out.println("Local variable is "+y);
            MyInner mi = new MyInner();
            mi.seeOuter();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

}

为什么String y需要是最终常量?它是如何影响的?

mpr*_*hat 16

局部变量总是存在于堆栈中,当时方法已经超过所有局部变量都消失了.

但是即使在方法结束之后你的内部类对象也可能在堆上(假设一个实例变量保留在引用上),所以在这种情况下它不能访问你的局部变量,因为它们已经消失了,除非你把它们标记为final


Con*_*Del 13

答案是两者在不同的范围内.因此,在内部类访问它之前,该变量可能会发生变化.使其成为最终阻止.

  • 这在Java 8中有所改变:http://docs.oracle.com/javase/tutorial/java/javaOO/localclasses.html#accessing-members-of-an-enclosing-class (2认同)

cha*_*_ma 7

这是因为函数内部的类实际上是复制局部变量,因为在本地类的实例仍然存在的情况下,函数调用之后可能会销毁局部变量.要使局部变量的两个副本始终具有相同的值(使它们看起来相同),您必须将变量声明为final.