2012-01-28 375 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