我知道这是指一个当前对象。但是我不知道什么时候我真的需要使用它。例如,如果我用x代替这个,会有什么不同吗。X在某些方法中?可能x将是指一个变量,这是局部的考虑方法?我指的是只有在这个方法中才能看到的变量。
那么this.method()呢?我能用吗?我应该用它吗?如果我只是使用方法(),它不是,默认情况下,应用到当前对象?
我知道这是指一个当前对象。但是我不知道什么时候我真的需要使用它。例如,如果我用x代替这个,会有什么不同吗。X在某些方法中?可能x将是指一个变量,这是局部的考虑方法?我指的是只有在这个方法中才能看到的变量。
那么this.method()呢?我能用吗?我应该用它吗?如果我只是使用方法(),它不是,默认情况下,应用到当前对象?
当前回答
唯一需要用的就是这个。当当前作用域内的另一个变量具有相同的名称并且您希望引用实例成员时(如William所描述的那样),则使用qualifier。除此之外,x和这个。x在行为上没有区别。
其他回答
@William Brendel的回答很好地提供了三种不同的用例。
用例1:
官方java文档页面提供了相同的用例。
在实例方法或构造函数中,这是对当前对象(其方法或构造函数正在被调用的对象)的引用。可以使用this从实例方法或构造函数中引用当前对象的任何成员。
它包括两个例子:
与字段一起使用this,与构造函数一起使用this
用例2:
这篇文章中没有引用的其他用例:这可以用来同步多线程应用程序中的当前对象,以保护数据和方法的关键部分。
synchronized(this){
// Do some thing.
}
用例3:
Builder模式的实现依赖于使用它来返回修改后的对象。
参考这篇文章
保持构建器在单独的类中(流畅的接口)
有很多很好的答案,但还有一个非常次要的原因到处都是。如果你尝试过从普通的文本编辑器(如记事本等)打开源代码,使用这个将使它更清晰地阅读。
想象一下:
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或项目时,如果你的规则包括“如果有人用记事本打开所有这些源代码,他或她应该朝自己的头开枪”,那么你完全可以不这样做。
如果我用“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();
}
}
"this"在从一个构造函数调用另一个构造函数时也很有用:
public class MyClass {
public MyClass(String foo) {
this(foo, null);
}
public MyClass(String foo, String bar) {
...
}
}