我怀疑 JVM 为匿名块维护了所有外部类全局变量的单独副本。这是真的吗?谢谢你帮助我。
问问题
99 次
3 回答
2
你的意思是匿名类?
如果在非静态上下文中创建匿名类的实例,那么它将包含对创建它的外部类实例的隐式引用。匿名实例将有权访问外部类的私有字段和方法。尽管名称冲突将有利于匿名类的解决。
要访问存在名称冲突的字段和方法,请使用以下语法:
OuterClass.this.methodCall();
例子:
public class Outer {
public static void main(String[] args) {
Outer o1 = new Outer(1);
Outer o2 = new Outer(2);
o1.doSomething();
o2.doSomething();
}
private int i;
private int j = 10;
public Outer(int i) {
this.i = i;
}
public void doSomething() {
new Runnable() {
private int i = 0;
public void run() {
System.out.println("Inner i = " + i);
System.out.println("Outer i = " + Outer.this.i);
System.out.println("Outer j = " + j);
}
}.run();
}
}
于 2013-02-18T15:38:48.337 回答
0
如果对象是可变的,您可以修改匿名内部类之外的对象。但是,您不能重新分配它们,因为它们必须被声明为 final。
于 2013-02-18T15:24:23.193 回答
0
我将您的问题解释为要问:“当匿名块更改在块外声明的变量时,变量会在块结束后保留这些更改吗?”
我创建了一个小测试程序来演示结果:
public class AnonymousTest {
private static int i = 0;
public static void main(String[] args) {
int j = 0;
System.out.println("Before anonymous block: i=" + i + " j=" + j);
//begin anonymous block
{
i = 5; j = 5;
System.out.println("Inside anonymous block: i=" + i + " j=" + j);
}
//end anonymous block
System.out.println("After anonymous block: i=" + i + " j=" + j);
}
}
输出是:
Before anonymous block: i=0 j=0
Inside anonymous block: i=5 j=5
After anonymous block: i=5 j=5
如您所见,在匿名块内修改的任何变量都保持修改状态,因此 JVM 不会为匿名块创建变量的副本。但是,在匿名块内声明的变量仅属于该块,并在块的末尾被销毁。
于 2013-02-18T15:38:42.610 回答