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

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


当前回答

以下是在java中使用' this '关键字的方法:

使用此关键字引用当前类实例变量 使用this()调用当前类构造函数 使用此关键字返回当前类实例 使用此关键字作为方法参数

https://docs.oracle.com/javase/tutorial/java/javaOO/thiskey.html

其他回答

这在构建器模式中很有用。

public class User {

    private String firstName;
    private String surname;

    public User(Builder builder){
        firstName = builder.firstName;
        surname = builder.surname;
    }

    public String getFirstName(){
        return firstName;
    }

    public String getSurname(){
        return surname;
    }

    public static class Builder {
        private String firstName;
        private String surname;

        public Builder setFirstName(String firstName) {
            this.firstName = firstName;
            return this;
        }

        public Builder setSurname(String surname) {
            this.surname = surname;
            return this;
        }

        public User build(){
            return new User(this);
        }

    }

    public static void main(String[] args) {
        User.Builder builder = new User.Builder();
        User user = builder.setFirstName("John").setSurname("Doe").build();
    }

}

如果我用“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()会澄清调用是由这个对象进行的。

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

用例1:

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

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

它包括两个例子:

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

用例2:

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

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

用例3:

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

参考这篇文章

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

以下是在java中使用' this '关键字的方法:

使用此关键字引用当前类实例变量 使用this()调用当前类构造函数 使用此关键字返回当前类实例 使用此关键字作为方法参数

https://docs.oracle.com/javase/tutorial/java/javaOO/thiskey.html

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

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
  }