方法本地内部类只能访问最终的局部变量。为什么?

时间:2011-10-09 12:03:01

标签: java inner-classes

  

可能重复:
  Why inner classes require “final” outer instance variables [Java]?
  Why are only final variables accessible in anonymous class?

class Outer{
   private String x = "instance variable";
   void doStuff(){
      String z = "local variable";
      class Inner{
          public void seeOuter(){
          System.out.println("Outer x is : "+ x);  
          System.out.println("Local variable z is : " + z); //won't compile
         }
      } 
  }
}

将局部变量z标记为final可解决问题:

final String z = "local variable"; //Now inner object can use it.


有谁能解释一下发生了什么?

我确切地知道为什么在我试图访问非最终局部变量的情况下它无法编译。

即使方法完成且局部变量超出范围,制作局部变量fi​​nal也能保持活着吗?

最终的局部变量是存储在堆而不是堆栈上吗?

2 个答案:

答案 0 :(得分:12)

他们可以使用函数的局部变量和参数,但只能使用声明为final的函数,因为本地类实例必须保持单独的 变量的副本,因为它可能超出函数。这样 不要混淆两个可修改的变量 在同一范围内的同名,该变量被强制使用 是不可修改的。

答案 1 :(得分:3)

  

将局部变量z标记为最终修复问题:   有谁能解释一下发生了什么?

你有一个方法本地类,允许在它创建的范围内访问最终的局部变量。

  

即使方法完成且局部变量超出范围,创建局部变量fi​​nal也能保持活着吗?

final表示无法更改。没别了。

  

最终的局部变量是否存储在堆而不是堆栈上?

所有变量都在堆栈上分配,最终与否。

  

我确切地知道为什么在我尝试访问非最终局部变量时它无法编译。

也许你应该考虑这一点,因为我不清楚这是否属实。

嵌套类可以“访问”最终变量,因为它们会自动复制为对象的字段。它不支持非final字段,因为它们可以通过方法或类进行更改,但这不受支持,因为实际上有两个不同的字段/变量。