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

EMM*_*EMM 9 java inner-classes

可能重复:
为什么内部类需要"最终"外部实例变量[Java]?
为什么在匿名类中只能访问最终变量?

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
         }
      } 
  }
}
Run Code Online (Sandbox Code Playgroud)

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

final String z = "local variable"; //Now inner object can use it.
Run Code Online (Sandbox Code Playgroud)


有人可以解释一下发生了什么吗?

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

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

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

Tar*_*rek 12

它们可以使用函数的局部变量和参数,但只能使用声明的函数,final因为本地类实例必须维护变量的单独副本,因为它可能会超出函数的范围.为了不在同一范围内混淆两个具有相同名称的可修改变量,该变量被强制为不可修改.

  • “由于它可能会使功能失效”,这是Java的新手,无法理解此部分,请您说明一下可能发生这种情况的情况吗? (2认同)
  • 支持内部类实例作为方法参数传递,并存储为另一个Object的实例变量.虽然方法变量在完成METHOD时死亡,但INNER类对象比方法更长 (2认同)

Pet*_*rey 4

将局部变量 z 标记为 Final 可以解决问题:任何人都可以解释一下发生了什么吗?

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

即使方法完成并且局部变量超出范围,创建局部变量fi​​nal是否允许它保持活动状态?

Final意味着它不能被改变。没有其他的。

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

所有变量都在堆栈上分配,无论是否为最终变量。

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

也许你应该考虑一下这一点,因为我根本不清楚情况是否如此。

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