匿名内部 class 不影响外部 class 成员

anonymous inner class not affect outer class member

输出是

   foo
   foo

但我期待它是

    foo 
    bar
    foo

我不明白为什么内部 class 不起作用

class Test {

    private String foo = "foo";

    public void method() {
        System.out.println(foo);
        new Object() {
            public void bar() {
                foo = "barr"; 
                System.out.println(foo); //not work

            }
        };

        System.out.println(foo);
    }

}


    public class Main {
        public static void main(String[] args){
        Test t=new Test();
        t.method();
      }
   }

实际输出为:

foo

巴尔

巴尔

如果在创建匿名后正确调用 bar() 函数 class:

class Test {

    private String foo = "foo";

    public void method() {
        System.out.println(foo);
        new Object() {
            public void bar() {
                foo = "barr";
                System.out.println(foo); 
            }
        }.bar();  // Added invocation here

        System.out.println(foo);
    }

}

public class Main {

    public static void main(String[] args) {
        Test t = new Test();
        t.method();
    }
}

没有调用匿名对象class的方法bar()。这就是为什么其中的 print 语句永远不会执行的原因。 您可以按如下方式更新代码:

new Object() {
            public void bar() {
                foo = "barr"; 
                System.out.println(foo); //not work

            }
        }.bar();

调用bar方法。 现在您已经执行了此方法,您将实例变量 foo 分配给了值 "barr" ,方法 () 中的最后一个打印语句将打印更新后的值 "barr".

它会影响外部成员但是改变成员变量的代码必须执行所以你的代码应该是这样的:

public class Main {

    private String foo = "foo";

    public void method() {
        System.out.println(foo);
        new Object() {
            public void bar() {
                foo = "bar";
                System.out.println(foo);

            }
        }.bar();

        System.out.println(foo);
    }

    public static void main(String[] args) {
        Main t = new Main();
        t.method();
    }
}

并输出:

foo
bar
bar