我知道这是指一个当前对象。但是我不知道什么时候我真的需要使用它。例如,如果我用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;
    }
  }
}

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

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
  }

如果我用“x”而不是“this”会有什么不同吗?X "在某些方法中?

通常不会。但有时也会有所不同:

  class A {
     private int i;
     public A(int i) {
        this.i = i; // this.i can be used to disambiguate the i being referred to
     }
  }

如果我只是使用“method()”,它会不会被默认应用到当前对象?

是的。但是如果需要的话,this.method()会澄清调用是由这个对象进行的。

有很多很好的答案,但还有一个非常次要的原因到处都是。如果你尝试过从普通的文本编辑器(如记事本等)打开源代码,使用这个将使它更清晰地阅读。

想象一下:

public class Hello {
    private String foo;

    // Some 10k lines of codes

    private String getStringFromSomewhere() {
        // ....
    }

    // More codes

    public class World {
        private String bar;

        // Another 10k lines of codes

        public void doSomething() {
            // More codes
            foo = "FOO";
            // More codes
            String s = getStringFromSomewhere();
            // More codes
            bar = s;
        }
    }
}

这对于任何现代IDE来说都是非常清晰的,但是如果使用常规的文本编辑器,这将是一场噩梦。

在使用编辑器的“find”函数之前,您将很难找到foo所在的位置。然后你会因为同样的原因对getStringFromSomewhere()大喊大叫。最后,当你忘记s是什么时,bar = s会给你最后一击。

将其与以下内容进行比较:

public void doSomething() {
    // More codes
    Hello.this.foo = "FOO";
    // More codes
    String s = Hello.this.getStringFromSomewhere();
    // More codes
    this.bar = s;
}

foo是在外部类Hello中声明的变量。 你知道getStringFromSomewhere()也是一个在外部类中声明的方法。 您知道bar属于World class, s是在该方法中声明的局部变量。

当然,无论何时你设计什么东西,你都在创造规则。因此,在设计API或项目时,如果你的规则包括“如果有人用记事本打开所有这些源代码,他或她应该朝自己的头开枪”,那么你完全可以不这样做。

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