2012-01-28 29 views
16

最近、私はhereと書いたアンドロイドプロジェクトで不思議な問題に遭遇しました。私は何とか問題を解決しましたが、その背後にある正確な理由はまだ分かりません。Java:匿名の内部クラスで外部クラスメソッドを呼び出す

ここで、内部クラスの関数foo()を呼び出したいとしましょう。問題は、誰もがこれに関連する私の最後のquestionを確認することができれば、直接

foo(); 

または他に

OuterClass.this.foo(); 

外部クラスのインスタンスでそれを呼び出すようにそれを呼び出すの違い何、私は、感謝します、ですなぜエラーが発生するのかという手がかりを教えてください。どうもありがとう。

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

+0

この文脈にはありません。あなたのソースに関する質問と、それを解決した変更が説明できないという事実を見ました。それはまったく影響してはいけません。これを行うことは、純粋にあなたが何を指しているかのあいまいさを解決することです... –

+0

あなたは右です。私はそこで間違いを犯した。啓発に感謝します! – Selkie

関連する問題