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

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


当前回答

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

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

}

其他回答

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

用例1:

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

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

它包括两个例子:

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

用例2:

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

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

用例3:

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

参考这篇文章

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

this关键字主要用于三种情况。第一种也是最常见的方法是在setter方法中消除变量引用的歧义。第二种情况是需要将当前类实例作为参数传递给另一个对象的方法。第三种方法是从构造函数内部调用备用构造函数。

案例1:使用this来消除变量引用的歧义。在Java setter方法中,我们通常传递一个与我们试图设置的私有成员变量同名的参数。然后我们将参数x赋值给this。x。这清楚地表明,您正在将参数“name”的值分配给实例变量“name”。

public class Foo
{
    private String name;

    public void setName(String name) {
        this.name = name;
    }
}

情况2:使用this作为传递给另一个对象的参数。

public class Foo
{
    public String useBarMethod() {
        Bar theBar = new Bar();
        return theBar.barMethod(this);
    }

    public String getName() {
        return "Foo";
    }
}

public class Bar
{
    public void barMethod(Foo obj) {
        obj.getName();
    }
}

案例3:使用this调用备用构造函数。在评论中,trinithis正确地指出了this的另一种常用用法。当一个类有多个构造函数时,可以使用this(arg0, arg1,…)来调用您选择的另一个构造函数,前提是在构造函数的第一行中这样做。

class Foo
{
    public Foo() {
        this("Some default value for bar");

        //optional other lines
    }

    public Foo(String bar) {
        // Do something with bar
    }
}

我还见过这种情况,用来强调实例变量被引用(不需要消除歧义),但在我看来,这种情况很少见。

如果我用“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 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();
    }

}

这是对当前对象的引用。它在构造函数中用于区分具有相同名称的局部类变量和当前类变量。例如:

public class circle {
    int x;
    circle(int x){
        this.x =x;
        //class variable =local variable 
    }
} 

这也可以用于从另一个构造函数调用一个构造函数。例如:

public class circle {
    int x;

    circle() { 
        this(1);
    }

    circle(int x) {
        this.x = x; 
    }
}