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

问题描述:

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

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

你忘了调用该方法:'new Object(){...} .bar();' – shmosel

+0

我不确定你为什么期望它恢复为“foo”。 – shmosel

+0

你写的是打印“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 

输出实际上是:

巴尔

巴尔

如果你正确地调用了吧()函数创建匿名类后:

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

有匿名对象的方法bar()没有呼叫类。这就是为什么它内部的print语句从不执行的原因。 您可以更新的代码如下:

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

      } 
     }.bar(); 

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