2017-08-17 143 views
-1

輸出匿名內部類不會影響外部類成員

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」的代碼,但它不會執行。 –

回答

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 
0

輸出實際上是:

巴爾

巴爾

如果你正確地調用了吧()函數創建匿名類後:

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

有匿名對象的方法bar()沒有呼叫類。這就是爲什麼它內部的print語句從不執行的原因。 您可以更新的代碼如下:

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

      } 
     }.bar(); 

調用bar方法。 現在您已經執行了將實例變量foo賦值爲"barr"的方法,方法()中的最後一個打印語句將打印更新值"barr"