2012-01-28 6 views
16

Недавно я столкнулся с загадочной проблемой в проекте андроида, который я описал 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

+0

Не в этом контексте. Я посмотрел на вопрос ваших источников и тот факт, что сделанное вами изменение решило его необъяснимым. Это не должно было произойти вообще. Выполнение этого - это просто очистить любые двусмысленности в том, что вы имеете в виду ... –

+0

вы правы. Я допустил ошибку. Спасибо за просветление! – Selkie

Смежные вопросы