Java:在匿名内部类中调用外部类方法

2022-09-02 10:12:03

最近,我在一个Android项目中遇到了一个神秘的问题,我在这里描述了这个问题。我以某种方式解决了这个问题,但仍然不知道它背后的确切原因。

假设我想在内部类中调用一个函数 foo()。问题是,直接称呼它有什么区别

foo();

或者使用外部类实例调用它

OuterClass.this.foo();

此外,如果有人可以检查我与此相关的最后一个问题,并给我一个关于为什么会发生错误的线索,我将不胜感激。非常感谢。

PS:我在某处读到,非静态内部类将始终保存外部类的实例。因此,如果我只使用foo(),它将使用该实例调用外部函数?


答案 1

后者更明确,如果内部类中存在具有相同名称的方法,则允许您调用外部类方法。

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
        }
    }
}

答案 2

当您声明匿名类时,内部范围完全更改,尽管它看起来像您正在调用相同的对象,但引用在此处获取更改,因此在处理匿名内部类/方法时,最好像稍后那样显式调用外部类实体


推荐