2012-01-28 377 views
16

最近,我遇到了一個Android項目中的一個神祕問題,我描述了here。我以某種方式解決了這個問題,但仍然不知道背後的確切原因。Java:在匿名內部類中調用外部類方法

假設我想在內部類中調用函數foo()。現在的問題是,什麼是直接像

foo(); 

與外部類的實例

OuterClass.this.foo(); 

除了要求它,我將不勝感激,如果任何人都可以查看調用它的區別還是我有關這最後question,並給我一個關於爲什麼發生錯誤的線索。非常感謝。

PS:我在某處讀到非靜態內部類將永遠持有外部類的實例。那麼如果我只使用foo(),它會使用該實例調用外部函數?

回答

20

後者更加明確,並允許您調用外部類方法,如果內部類中存在具有相同名稱的方法。

class OuterClass { 
    void foo() { System.out.println("Outer foo"); } 

    View.OnClickListener mListener1 = new View.OnClickListener() { 
     void foo() { System.out.println("Inner foo"); } 

     @Override public void onClick(View view) { 
      foo(); //Calls inner foo 
      OuterClass.this.foo(); //Calls outer foo 
     } 
    } 

    View.OnClickListener mListener2 = new View.OnClickListener() { 
     @Override public void onClick(View view) { 
      foo(); //Calls outer foo 
      OuterClass.this.foo(); //Calls outer foo 
     } 
    } 
} 
+0

Thx。但我敢肯定,在我的情況下,內部類沒有同名的函數。除顯式部分之外是否還有其他特定的區別? – Selkie 2012-01-28 06:28:13

+0

不在此範圍內。我看着你的來源問題,以及你做出的改變解決了這個問題,這是莫名其妙的。這應該不會影響它。這樣做純粹是爲了澄清你指的是什麼含糊不清...... – 2012-01-28 06:34:36

+0

你說得對。我在那裏犯了一個錯誤。感謝啓發! – Selkie 2012-01-28 15:15:18