本地风险值背后的想法是最终的,而领域不是。
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
}
内部类有一个引用外部类的隐藏的未命名字段。为了回答这个问题,我们将其命名为$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,然后我得到一个错误
为什么<code>test
问题内容: 为什么我需要声明一个方法,好像我在方法中定义的需要使用它一样? 范例: } 为什么String 需要是最终常量?它如何影响? 问题答案: 答案是两者在不同的范围内。因此该变量可以在内部类访问它之前更改。将其最终确定可以防止这种情况。
但是,如果我在内部类中声明了一个同名的variabe呢?有什么方法可以显式引用外部变量吗? 顺便说一句,这和这个问题不同,因为它考虑的是局部堆栈变量。
问题内容: 如何在我的匿名内部子类中获取传递给此方法的值? 我收到此错误: 无法在以其他方法定义的内部类中引用非最终变量userID 我很确定我不能将其赋值为final,因为它是一个未知值的变量。我听说这种语法确实以某种方式保留了作用域,所以我认为必须有一个我不太了解的语法技巧。 问题答案: 当然,您可以将其分配为final-只需将该关键字放入参数的声明中即可: 我不确定这是一个未知值的变量是什么