我知道这是指一个当前对象。但是我不知道什么时候我真的需要使用它。例如,如果我用x代替这个,会有什么不同吗。X在某些方法中?可能x将是指一个变量,这是局部的考虑方法?我指的是只有在这个方法中才能看到的变量。

那么this.method()呢?我能用吗?我应该用它吗?如果我只是使用方法(),它不是,默认情况下,应用到当前对象?


当前回答

唯一需要用的就是这个。当当前作用域内的另一个变量具有相同的名称并且您希望引用实例成员时(如William所描述的那样),则使用qualifier。除此之外,x和这个。x在行为上没有区别。

其他回答

this的第二个重要用途(除了用局部变量隐藏之外,很多人已经说过了)是在从嵌套的非静态类访问外部实例时:

public class Outer {
  protected int a;

  public class Inner {
    protected int a;

    public int foo(){
      return Outer.this.a;
    }

    public Outer getOuter(){
      return Outer.this;
    }
  }
}

关于威廉·布伦德尔的帖子和坦白问题,关于案例2。这里有一个例子:

public class Window {

  private Window parent;

  public Window (Window parent) {
    this.parent = parent;
  }

  public void addSubWindow() {
    Window child = new Window(this);
    list.add(child);
  }

  public void printInfo() {
    if (parent == null) {
      System.out.println("root");
    } else {
      System.out.println("child");
    }
  }

}

我曾在与对象建立父子关系时看到过这种用法。但是,请注意,为了简洁起见,这里进行了简化。

@William Brendel的回答很好地提供了三种不同的用例。

用例1:

官方java文档页面提供了相同的用例。

在实例方法或构造函数中,这是对当前对象(其方法或构造函数正在被调用的对象)的引用。可以使用this从实例方法或构造函数中引用当前对象的任何成员。

它包括两个例子:

与字段一起使用this,与构造函数一起使用this

用例2:

这篇文章中没有引用的其他用例:这可以用来同步多线程应用程序中的当前对象,以保护数据和方法的关键部分。

synchronized(this){
    // Do some thing. 
}

用例3:

Builder模式的实现依赖于使用它来返回修改后的对象。

参考这篇文章

保持构建器在单独的类中(流畅的接口)

当有两个变量一个实例变量和另一个同名的局部变量时,我们使用这个。引用当前执行对象,以避免名称之间的冲突。

唯一需要用的就是这个。当当前作用域内的另一个变量具有相同的名称并且您希望引用实例成员时(如William所描述的那样),则使用qualifier。除此之外,x和这个。x在行为上没有区别。