Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 修改匿名内部类中的外部变量_Java_Anonymous Function_Anonymous Class - Fatal编程技术网

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
不能在方法体或匿名类体中的任何位置修改,假设它正在匿名类中使用。极好的解决方案!非常感谢。极好的解决方案!非常感谢。