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

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


当前回答

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");
    }
  }

}

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

这不会影响结果代码——它是编译时操作符,有或没有它生成的代码都是一样的。当你必须使用它时,取决于上下文。例如,你必须使用它,当你有一个局部变量,它掩盖了类变量你想引用类变量而不是局部变量。

edit:“生成的代码将是相同的”,我的意思当然是,当局部作用域中的某个变量没有隐藏属于类的变量时。因此

class POJO {
   protected int i;

   public void modify() {
      i = 9;
   }

   public void thisModify() {
      this.i = 9;
   }
}

两个方法的结果代码将是相同的。如果某个方法声明了同名的局部变量,区别就会显现出来

  public void m() {
      int i;
      i = 9;  // i refers to variable in method's scope
      this.i = 9; // i refers to class variable
  }

谷歌在太阳网站上有一个页面讨论了这个问题。

关于变量你是对的;这确实可以用来区分方法变量和类字段。 私有int x; setX(int x) { this.x = x; }

然而,我真的很讨厌这种惯例。给两个不同的变量取完全相同的名字是产生错误的原因。我更喜欢这样的东西: 私有int x; setX(int newX) { x = newX; }

相同的结果,但不会出现错误,即您不小心引用了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;
    }
  }
}