我应该什么时候在课堂上使用“这个”?
我知道this
是指一个当前的对象。 但是我不知道什么时候我真的需要使用它。 例如,如果我在某些方法中使用x
而不是this.x
,会有什么区别吗? 可能是x
将引用一个variables是所考虑的方法的本地? 我的意思是只有在这个方法中才能看到的variables。
那么this.method()
呢? 我可以使用它吗? 我应该使用它。 如果我只是使用method()
,它会不会,默认情况下,应用到当前对象?
this
关键字主要用于三种情况。 第一个也是最常见的是在setter方法中消除variables引用的歧义。 第二个是当需要将当前类实例作为parameter passing给另一个对象的方法时。 第三个是从构造函数中调用备用构造函数的方法。
情况1:使用this
来消除variables引用的歧义。 在Java setter方法中,我们通常传入一个与我们试图设置的私有成员variables同名的参数。 然后我们将参数x
分配给this.x
这就清楚地表明你将参数“name”的值赋给实例variables“name”。
public class Foo { private String name; public void setName(String name) { this.name = name; } }
情况2: this
作为parameter passing给另一个对象。
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, ...)
来调用你select的另一个构造函数,只要你在构造函数的第一行中这样做。
class Foo { public Foo() { this("Some default value for bar"); //optional other lines } public Foo(String bar) { // Do something with bar } }
我也看到this
用来强调一个实例variables被引用的事实(不需要消除歧义),但在我看来这是一个罕见的情况。
第二个重要的用法(除了用一个局部variables来隐藏多个答案之外)就是从嵌套的非静态类访问一个外部实例的时候:
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; } } }
你只需要使用this
– 大多数人只使用它 – 当有一个重叠的局部variables具有相同的名称。 (例如Setter方法。)
当然,使用this
另一个好的理由是,它会导致intellisense在IDE中popup:)
只需要使用this.
限定符是当前范围内的另一个variables共享相同的名称,并且您想要引用实例成员(如William所描述的)。 除此之外, x
和this.x
之间的行为没有区别。
从另一个构造函数中调用“this”也是很有用的:
public class MyClass { public MyClass(String foo) { this(foo, null); } public MyClass(String foo, String bar) { ... } }
this
在构build器模式中很有用。
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(); }
}
除非你有重叠的variables名,否则当你阅读代码的时候,这只是为了清晰起见。
Google在Sun网站上发布了一个讨论这个问题的页面。
你对这个variables是正确的。 this
确实可以用来区分类字段的方法variables。
private int x; public void setX(int x){ this.x = X; }
不过,我真的讨厌这个惯例。 给两个不同的variables字面上相同的名称是一个错误的秘诀。 我更喜欢以下几点:
private int x; public void setX(int newX){ X =下一页末; }
同样的结果,但是当你真正意图指向x
而不是意外地指向x
的错误。
至于使用它的方法,你是正确的影响; 你会得到相同的结果有或没有它。 你可以用它吗? 当然。 你应该使用它吗? 由你自己决定,但鉴于我个人认为这是毫无意义的冗长,并没有增加任何清晰度(除非代码中塞满了静态导入语句),我并不倾向于自己使用它。
@William Brendel的答案以不错的方式提供了三种不同的用例。
用例1:
官方java文档页面上提供了相同的用例。
在实例方法或构造函数中,这是对当前对象的引用 – 即其方法或构造函数被调用的对象。 您可以通过使用此方法从实例方法或构造函数中引用当前对象的任何成员。
它包括两个例子:
在一个字段中 使用这个和在构造函数中使用这个
用例2:
其他在本文中没有引用的用例: this
可以用来同步multithreading应用程序中的当前对象,以保护数据和方法的关键部分。
synchronized(this){ // Do some thing. }
用例3:
Builder模式的实现依赖于使用this
来返回修改后的对象。
参考这篇文章
保持build设者在单独的类(stream畅的界面)
当有两个variables一个实例variables和其他同名的局部variables时,我们使用这个。 引用当前执行的对象来避免名称之间的冲突。
this
是对当前对象的引用。 在构造函数中使用它来区分具有相同名称的本地类和当前类variables。 例如:
public class circle { int x; circle(int x){ this.x =x; //class variable =local variable } }
this
也可以用来从另一个构造函数调用一个构造函数。 例如:
public class circle { int x; circle() { this(1); } circle(int x) { this.x = x; } }
以下是在java中使用“this”关键字的方法:
- 使用
this
关键字来引用当前类实例variables - 使用
this()
来调用当前的类构造函数 - 使用
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()
说明调用是由这个对象产生的。
this
不会影响结果代码 – 这是编译时间运算符,并且使用或不使用它生成的代码将是相同的。 当你必须使用它,取决于上下文。 例如,你必须使用它,如你所说,当你有局部variables,阴影类variables,你想引用类variables,而不是本地的。
编辑:由“生成的代码将是相同的”我的意思,当然,当局部范围内的某些variables不隐藏属于类的一个。 从而
class POJO { protected int i; public void modify() { i = 9; } public void thisModify() { this.i = 9; } }
两种方法的结果码都是一样的。 区别在于某些方法声明局部variables具有相同的名称
public void m() { int i; i = 9; // i refers to variable in method's scope this.i = 9; // i refers to class variable }
确保使用当前对象的成员。 在线程安全的情况下,某些应用程序可能会更改错误的对象成员值,因此应将其应用于成员,以便使用正确的对象成员值。
如果你的对象不关心线程安全性,那么没有理由指定使用哪个对象成员的值。