在抽象上下文中使用此关键字

时间:2013-08-11 15:46:28

标签: java

我在一些源代码中遇到了这种模式:

public abstract class Foo {

    void doSomething(){
        System.out.println("...");
    }

    private class FooBar extends Foo{
        void doAnything(){
            Foo.this.doSomething();
        }
    }
}

是什么意思

Foo.this.doSomething();

还是只是一些货物崇拜的做法?

4 个答案:

答案 0 :(得分:4)

Foo.thisthis指的是两个不同的对象。

由于FooBarFoo中定义的内部类,因此FooBar的每个实例都有一个Foo实例与之关联。

  • this指的是FooBar实例本身;
  • Foo.this指的是外部Foo实例。

请参阅How can "this" of the outer class be accessed from an inner class?

也就是说,您展示的示例中的Foo.this.是多余的,可以省略(除非FooFooBar都有一个名为doSomething()的方法。

答案 1 :(得分:2)

在您给出的示例中,这相当于直接调用doSomething();

但是,如果您在void doSomething()类中声明了相同的方法FooBar,那么您将使用此表示法来表示您调用外部类的方法而不是内部类。

在后一种情况下this.doSomething()是不够的,这仍然会指向this的{​​{1}}成员变量,这就是为什么要专门指定要调用的类的原因方法。

答案 2 :(得分:2)

Foo.this引用外部类Foo的对象实例,它始终绑定在内部类的对象中。

当Foo被实例化时,你可以认为Foo和FooBar总是在一起实例化。

在你的情况下没有必要,但如果你需要将Foo对象实例传递给内部Foo.Bar中需要它的任何方法,你可以用:

// some method of some other class (OtherClass.java)
void someFunction( Foo foo )...

// ...
private class FooBar extends Foo{
    void doAnything(){
        otherClass.someFunction( Foo.this );
    }
}

答案 3 :(得分:1)

Foo.this引用外部类对象,其中this引用当前类对象 根据java docs。它也被称为阴影