我知道这是指一个当前对象。但是我不知道什么时候我真的需要使用它。例如,如果我用x代替这个,会有什么不同吗。X在某些方法中?可能x将是指一个变量,这是局部的考虑方法?我指的是只有在这个方法中才能看到的变量。
那么this.method()呢?我能用吗?我应该用它吗?如果我只是使用方法(),它不是,默认情况下,应用到当前对象?
我知道这是指一个当前对象。但是我不知道什么时候我真的需要使用它。例如,如果我用x代替这个,会有什么不同吗。X在某些方法中?可能x将是指一个变量,这是局部的考虑方法?我指的是只有在这个方法中才能看到的变量。
那么this.method()呢?我能用吗?我应该用它吗?如果我只是使用方法(),它不是,默认情况下,应用到当前对象?
当前回答
@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
}
}
我还见过这种情况,用来强调实例变量被引用(不需要消除歧义),但在我看来,这种情况很少见。
谷歌在太阳网站上有一个页面讨论了这个问题。
关于变量你是对的;这确实可以用来区分方法变量和类字段。 私有int x; setX(int x) { this.x = x; }
然而,我真的很讨厌这种惯例。给两个不同的变量取完全相同的名字是产生错误的原因。我更喜欢这样的东西: 私有int x; setX(int newX) { x = newX; }
相同的结果,但不会出现错误,即您不小心引用了x,而实际上应该引用x。
至于用一种方法来使用它,你说的效果是对的;不管有没有它,你都会得到相同的结果。你会用吗?确定。你应该使用它吗?由您决定,但考虑到我个人认为这是毫无意义的冗长,不会增加任何清晰度(除非代码充满了静态导入语句),我自己不倾向于使用它。
以下是在java中使用' this '关键字的方法:
使用此关键字引用当前类实例变量 使用this()调用当前类构造函数 使用此关键字返回当前类实例 使用此关键字作为方法参数
https://docs.oracle.com/javase/tutorial/java/javaOO/thiskey.html
以确保使用了当前对象的成员。在考虑线程安全的情况下,一些应用程序可能会更改错误的对象成员值,因此应该将此应用于成员,以便使用正确的对象成员值。
如果你的对象不关心线程安全,那么就没有理由指定使用哪个对象成员的值。
如果我用“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()会澄清调用是由这个对象进行的。