【问题标题】:Method local inner class can access final local variable only.Why? [duplicate]方法局部内部类只能访问最终局部变量。为什么? [复制]
【发布时间】:2011-10-09 12:03:00
【问题描述】:

可能重复:
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.


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

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

即使方法完成和局部变量超出范围?

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

【问题讨论】:

    标签: java inner-classes


    【解决方案1】:

    他们可以使用函数的局部变量和参数,但只能使用声明为final的,因为局部类实例必须维护一个单独的 变量的副本,因为它可能会超出函数的寿命。这样 不要混淆两个可修改的变量 在同一个作用域同名,该变量被强制 不可修改。

    【讨论】:

    • “因为它可能会超出功能”,我是 java 新手,无法理解这部分,您能否解释一下可能发生这种情况的场景?谢谢
    • 假设内部类实例作为方法参数传递,并作为另一个对象的实例变量存储。所以虽然方法变量在 METHOD 完成时死亡,但内部类对象比方法寿命更长跨度>
    • “因为本地类实例必须维护变量的单独副本” - 本地类实例是否维护对该范围内所有变量的访问?文档中是否有任何支持这一点的内容,或任何测试程序?我的意思是我们怎么知道本地内部类获得了这些本地变量的副本?
    【解决方案2】:

    将局部变量 z 标记为 final 可以解决问题: 谁能解释一下发生了什么?

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

    即使方法完成并且局部变量超出范围,制作局部变量 final 是否允许它保持活动状态?

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

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

    所有变量都分配在栈上,不管是不是final的。

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

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

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

    【讨论】:

    • :但这里的问题是,为什么将方法局部变量标记为 final 使其可访问?
    • @Anu11 我会再读一遍最后一段。 ;)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多