当前位置: 首页 > 知识库问答 >
问题:

在使用内部类时,局部变量是最终的,而外部类字段不是

秋阳旭
2023-03-14

本地风险值背后的想法是最终的,而领域不是。


void test() {
  var a = "a"; // outer local variable 
  class InnerClass {
     void print() {sout(a);} // InnerClass(String a)
  }
}

String a = "a" // outer field
void test() {
  class InnerClass {
    void print() { a = newA;} // OuterClass.this.a = newA
  }
  sout(a) // newA
}

共有1个答案

仲孙超
2023-03-14

内部类有一个引用外部类的隐藏的未命名字段。为了回答这个问题,我们将其命名为$outer

第一个版本:

public class OuterClass {
  void test() {
    var a = "a"; // Local variable
    class InnerClass {
      void print() { sout(a); } // sout("a")
    }
    new InnerClass().print();
  }
}

它实际上被编译为:

public class OuterClass {
  void test() {
    final String a = "a";
    new OuterClass$0$InnerClass(this, a).print();
  }
}
final class OuterClass$0$InnerClass {
  private final OuterClass $outer;
  private final String a;
  OuterClass$0$InnerClass(OuterClass $outer, String a) {
    this.$outer = $outer;
    this.a = a;
  }
  void print() { sout(this.a); } // sout("a")
}
public class OuterClass {
  String a = "a"; // Outer field
  void test() {
    class InnerClass {
      void setA(String newA) { a = newA; }
    }
    new InnerClass().setA("b");
    sout(a); // sout("b")
  }
}
public class OuterClass {
  String a = "a"; // Outer field
  void test() {
    new OuterClass$0$InnerClass(this).setA("b");
    sout(a); // sout("b")
  }
}
class OuterClass$0$InnerClass {
  private final OuterClass $outer;
  OuterClass$0$InnerClass(OuterClass $outer) {
    this.$outer = $outer;
  }
  void setA(String newA) { this.$outer.a = newA; }
}
 类似资料:
  • 问题内容: 关于编译器错误,有一些关于Stack Overflow的主题,解决方案是“将其声明为最终的,您就完成了”,但是对于这个 理论性的 问题,我想检查一下该代码无法编译的逻辑原因是什么: (解决方案:声明为final),而这一点却做到了: 我真的很困惑 不是最终值,它可以多次更改,而的可怜参数只能在其方法体内更改,而是由编译器负责;) 甚至编译器错误也误导了我。: 与什么不同?与内部类不是在

  • 这个程序是我的类的最终赋值,我在弄清楚为什么我收到错误“从内部类引用的局部变量必须是最终的或实际上是最终的”时遇到了问题。该程序正在运行并发线程来对#的数组进行排序,然后找到该数组的高值和低值。当我在没有并发的情况下创建它时,我没有这个错误。我正在努力确定在哪里最终确定高变量和低变量。 这是产生错误的代码块。如果我使int高=数字[0];或int-low=数字[0];final,然后我得到一个错误

  • 问题内容: 为什么我需要声明一个方法,好像我在方法中定义的需要使用它一样? 范例: } 为什么String 需要是最终常量?它如何影响? 问题答案: 答案是两者在不同的范围内。因此该变量可以在内部类访问它之前更改。将其最终确定可以防止这种情况。

  • 但是,如果我在内部类中声明了一个同名的variabe呢?有什么方法可以显式引用外部变量吗? 顺便说一句,这和这个问题不同,因为它考虑的是局部堆栈变量。

  • 问题内容: 如何在我的匿名内部子类中获取传递给此方法的值? 我收到此错误: 无法在以其他方法定义的内部类中引用非最终变量userID 我很确定我不能将其赋值为final,因为它是一个未知值的变量。我听说这种语法确实以某种方式保留了作用域,所以我认为必须有一个我不太了解的语法技巧。 问题答案: 当然,您可以将其分配为final-只需将该关键字放入参数的声明中即可: 我不确定这是一个未知值的变量是什么