匿名内部类不会影响外部类成员

时间:2017-08-17 05:53:00

标签: java anonymous-inner-class

输出

   foo
   foo

但我期待它

    foo 
    bar
    foo

我不知道为什么内部阶级不起作用

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();
      }
   }

3 个答案:

答案 0 :(得分:0)

输出实际上是:

FOO

巴尔

巴尔

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

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();
    }
}

答案 1 :(得分:0)

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

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

            }
        }.bar();

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

答案 2 :(得分:0)

它会影响外部成员,但是必须执行在成员变量中进行更改的代码,因此您的代码应该是这样的:

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