0

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

public abstract class Foo {

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

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

有什么意义

Foo.this.doSomething();

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

4

4 回答 4

4

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

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

  • thisFooBar实例本身;
  • Foo.this指外部Foo实例。

请参阅如何从内部类访问外部类的“this”?

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

于 2013-08-11T15:47:55.210 回答
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 );
    }
}
于 2013-08-11T15:49:06.660 回答
2

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

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

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

于 2013-08-11T15:48:33.410 回答
1

Foo.this指外部类对象,其中 asthis指当前类对象。
根据java docs 。它也被称为Shadowing

于 2013-08-11T15:54:42.393 回答