Java 修改匿名内部类中的外部变量
据我所知,在内部匿名类中使用的任何变量(但在其外部声明)实际上都会传递其值的副本。还需要将这些外部变量声明为最终变量,这显然意味着这些变量不需要修改Java 修改匿名内部类中的外部变量,java,anonymous-function,anonymous-class,Java,Anonymous Function,Anonymous Class,据我所知,在内部匿名类中使用的任何变量(但在其外部声明)实际上都会传递其值的副本。还需要将这些外部变量声明为最终变量,这显然意味着这些变量不需要修改 但是有什么办法可以解决这个问题吗?我的匿名内部类真的可以修改一些变量或对象吗?我以后可以在代码中使用这些变量或对象(在匿名类之外)?或者在匿名类之外看不到修改吗?引用的对象确实需要是最终的-但是,它们可以是可变的 class Holder<T> { public T held; } public void test() {
但是有什么办法可以解决这个问题吗?我的匿名内部类真的可以修改一些变量或对象吗?我以后可以在代码中使用这些变量或对象(在匿名类之外)?或者在匿名类之外看不到修改吗?引用的对象确实需要是最终的-但是,它们可以是可变的
class Holder<T> {
public T held;
}
public void test() {
final Holder<String> s = new Holder<>();
new Runnable () {
@Override
public void run() {
s.held = "Hello;";
}
}
}
类持有者{
举行公众集会;
}
公开无效测试(){
最终支架s=新支架();
新的可运行(){
@凌驾
公开募捐{
s、 hold=“你好;”;
}
}
}
这大大简化了—您通常会对保留的值使用getter和setter。引用的对象确实需要是final—但是,它们可以是可变的
class Holder<T> {
public T held;
}
public void test() {
final Holder<String> s = new Holder<>();
new Runnable () {
@Override
public void run() {
s.held = "Hello;";
}
}
}
类持有者{
举行公众集会;
}
公开无效测试(){
最终支架s=新支架();
新的可运行(){
@凌驾
公开募捐{
s、 hold=“你好;”;
}
}
}
这大大简化了—您通常会对保留值使用getter和setter。您所指的行为仅适用于局部变量或方法/捕获参数。您可以很好地访问和修改实例成员
public class Example {
public void method() {
String localFoo = "local";
new Object() {
public void bar() {
foo = "bar"; // yup
System.out.println(localFoo); // sure
localFoo = "bar"; // nope
}
};
}
private String foo = "foo";
}
匿名对象
内部类复制localFoo
的值,以便在println(..)
调用中使用。但是,对于foo
,它实际上是在“复制”对Example
实例的引用,并引用其foo
字段
实际上相当于
Example.this.foo = "bar";
您所指的行为仅适用于局部变量或方法/捕获参数。您可以很好地访问和修改实例成员
public class Example {
public void method() {
String localFoo = "local";
new Object() {
public void bar() {
foo = "bar"; // yup
System.out.println(localFoo); // sure
localFoo = "bar"; // nope
}
};
}
private String foo = "foo";
}
匿名对象
内部类复制localFoo
的值,以便在println(..)
调用中使用。但是,对于foo
,它实际上是在“复制”对Example
实例的引用,并引用其foo
字段
实际上相当于
Example.this.foo = "bar";
不,只有局部变量(或参数)有此限制。不,只有局部变量(或参数)有此限制。感谢您的回复。如果您实例化这个示例对象,对其调用method(),然后尝试打印'foo'字段,它似乎仍然是'foo'而不是'bar'。这是为什么?@Decoy你没有调用
bar()
。愚蠢的错误!谢谢。只是想澄清一下,在你的例子中,绝对没有人可以修改匿名类中的localFoo变量?@Decoy没错。在方法
中声明的局部变量localFoo
不能在方法体或匿名类体中的任何位置进行修改,假设它正在匿名类中使用。感谢您的响应。如果您实例化这个示例对象,对其调用method(),然后尝试打印'foo'字段,它似乎仍然是'foo'而不是'bar'。这是为什么?@Decoy你没有调用bar()
。愚蠢的错误!谢谢。只是想澄清一下,在你的例子中,绝对没有人可以修改匿名类中的localFoo变量?@Decoy没错。在method
中声明的局部变量localFoo
不能在方法体或匿名类体中的任何位置修改,假设它正在匿名类中使用。极好的解决方案!非常感谢。极好的解决方案!非常感谢。