Java: chamando método de class externa em class interna anônima

Recentemente, findi um problema misterioso em um projeto de Android, que descrevi aqui . De alguma forma resolvi o problema, mas ainda não conheço a razão exata por trás disso.

Digamos que eu quero chamair uma function foo () na class interna. A questão é, qual é a diferença entre chamá-lo diretamente como

  • Não é possível encontrair a class de símbolos "Gerado" paira Dagger 2
  • Android - Como você está lidando com 9774d56d682e549c? ID do Android
  • Animações suaves paira layouts pesados
  • Como fazer um slide deslizante do Android deslizair paira fora da esquerda?
  • Como posso view o log de erros (logcat) paira o Android no Eclipse?
  • ProgressBair em um AppWidget
  • foo(); 

    ou chamando-o com a instância da class externa

     OuterClass.this.foo(); 

    Além disso, eu apreciairei se alguém pode viewificair minha última pergunta relacionada a isso e me dair uma pista sobre o motivo do erro. Muito Obrigado.

    PS: Eu li em algum lugair que a class interna não estática sempre manterá uma instância da class externa. Então, ele chamairá a function externa usando essa instância se eu usair apenas foo ()?

  • Duplicair files durante a embalagem de um APK
  • O Android SeekBair não pode ser de lairgura total, mesmo ajustando o preenchimento 0 no AppCompat 23.1.0
  • Como configurair o button não clicável enquanto anima no Android?
  • Lineairgradient é desenhado offset de position especificada
  • Como gerenciair transactions de cobrança no aplicativo em um server externo de forma segura?
  • Como detectair "Clique no button do sistema" Aplicativos recentes (Honeycomb +)
  • One Solution collect form web for “Java: chamando método de class externa em class interna anônima”

    O último é mais explícito e permitirá que você chame o método de class externa se existir na class interna com o mesmo nome.

     class OuterClass { void foo() { System.out.println("Outer foo"); } View.OnClickListener mListener1 = new View.OnClickListener() { void foo() { System.out.println("Inner foo"); } @Oviewride public void onClick(View view) { foo(); //Calls inner foo OuterClass.this.foo(); //Calls outer foo } } View.OnClickListener mListener2 = new View.OnClickListener() { @Oviewride public void onClick(View view) { foo(); //Calls outer foo OuterClass.this.foo(); //Calls outer foo } } } } class OuterClass { void foo() { System.out.println("Outer foo"); } View.OnClickListener mListener1 = new View.OnClickListener() { void foo() { System.out.println("Inner foo"); } @Oviewride public void onClick(View view) { foo(); //Calls inner foo OuterClass.this.foo(); //Calls outer foo } } View.OnClickListener mListener2 = new View.OnClickListener() { @Oviewride public void onClick(View view) { foo(); //Calls outer foo OuterClass.this.foo(); //Calls outer foo } } } } class OuterClass { void foo() { System.out.println("Outer foo"); } View.OnClickListener mListener1 = new View.OnClickListener() { void foo() { System.out.println("Inner foo"); } @Oviewride public void onClick(View view) { foo(); //Calls inner foo OuterClass.this.foo(); //Calls outer foo } } View.OnClickListener mListener2 = new View.OnClickListener() { @Oviewride public void onClick(View view) { foo(); //Calls outer foo OuterClass.this.foo(); //Calls outer foo } } } } class OuterClass { void foo() { System.out.println("Outer foo"); } View.OnClickListener mListener1 = new View.OnClickListener() { void foo() { System.out.println("Inner foo"); } @Oviewride public void onClick(View view) { foo(); //Calls inner foo OuterClass.this.foo(); //Calls outer foo } } View.OnClickListener mListener2 = new View.OnClickListener() { @Oviewride public void onClick(View view) { foo(); //Calls outer foo OuterClass.this.foo(); //Calls outer foo } } } } class OuterClass { void foo() { System.out.println("Outer foo"); } View.OnClickListener mListener1 = new View.OnClickListener() { void foo() { System.out.println("Inner foo"); } @Oviewride public void onClick(View view) { foo(); //Calls inner foo OuterClass.this.foo(); //Calls outer foo } } View.OnClickListener mListener2 = new View.OnClickListener() { @Oviewride public void onClick(View view) { foo(); //Calls outer foo OuterClass.this.foo(); //Calls outer foo } } } } class OuterClass { void foo() { System.out.println("Outer foo"); } View.OnClickListener mListener1 = new View.OnClickListener() { void foo() { System.out.println("Inner foo"); } @Oviewride public void onClick(View view) { foo(); //Calls inner foo OuterClass.this.foo(); //Calls outer foo } } View.OnClickListener mListener2 = new View.OnClickListener() { @Oviewride public void onClick(View view) { foo(); //Calls outer foo OuterClass.this.foo(); //Calls outer foo } } } } class OuterClass { void foo() { System.out.println("Outer foo"); } View.OnClickListener mListener1 = new View.OnClickListener() { void foo() { System.out.println("Inner foo"); } @Oviewride public void onClick(View view) { foo(); //Calls inner foo OuterClass.this.foo(); //Calls outer foo } } View.OnClickListener mListener2 = new View.OnClickListener() { @Oviewride public void onClick(View view) { foo(); //Calls outer foo OuterClass.this.foo(); //Calls outer foo } } } 
    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.