Answers:
该this
关键字在三种情况下,主要使用。第一种也是最常见的是使用setter方法消除变量引用的歧义。第二种是当需要将当前类实例作为参数传递给另一个对象的方法时。第三种是从构造函数内部调用备用构造函数的方法。
案例1:使用this
来消除歧义变量引用。在Java setter方法中,我们通常传入与要设置的私有成员变量同名的参数。然后,将参数分配x
给this.x
。这清楚表明您正在将参数“名称”的值分配给实例变量“名称”。
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
}
}
我还曾经看到this
过强调一个事实,即引用了实例变量(无需歧义化),但是在我看来,这是一种罕见的情况。
this(arg1, arg2, ...)
内部也有构造函数。
this
我忘记的另一种常用用法,因此我将其添加到了答案中。我认为这没有什么错,因为最终结果总体上是一个更好的答案,而这正是SO的目的。我也尽一切可能给予赞誉,就像在trinithis案中一样。
this
使用的大多数Java代码库中,仅在确实需要消除歧义的情况下才使用@AStar ,例如上面的setter示例。当然,编码样式和“最佳做法”可能会因您要求的人而有很大差异,但总的来说,我建议选择合理的样式并坚持使用。一致性,甚至只是在单个代码库内部的一致性,都对可读性和可维护性大有帮助。
第二个重要用途this
(除了使用已回答的许多答案隐藏局部变量之外)是从嵌套的非静态类访问外部实例时:
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
当存在具有相同名称的重叠局部变量时,您只需要使用-并且大多数人只使用它。(例如,设置方法。)
当然,另一个使用的好理由this
是它会导致intellisense在IDE中弹出:)
唯一需要使用this.
限定符的条件是,当前范围内的另一个变量共享相同的名称,并且您要引用实例成员(如William描述的那样)。除此之外,x
和之间的行为没有区别this.x
。
this.x
来使代码更清晰地阅读,代码的可维护性/可读性也是您应考虑的一个因素...
this
在构建器模式中很有用。
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
任何地方。如果您尝试从普通的文本编辑器(例如记事本等)打开源代码,则使用this
会使阅读起来更加清晰。
想象一下:
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读取都非常清楚,但是使用常规文本编辑器进行读取将完全是噩梦。
在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
类,并且s
是在该方法中声明的局部变量。当然,无论何时设计,都将创建规则。所以在设计你的API或项目,如果你的规则包括:“如果有人打开一个记事本这些源代码,他或她应该拍他/她的头,”那么你是完全罚款不去做这个。
除非您有重叠的变量名,否则在阅读代码时实际上只是为了清楚起见。
this
在不需要时不断看到关键字时,它只是样板代码,使代码难以阅读。
this
不会使代码更难读lmao。
@William Brendel的回答很好地提供了三种不同的用例。
用例1:
在官方Java文档页面此提供同样的使用情况。
在实例方法或构造函数中,这是对当前对象的引用-当前对象正在调用其方法或构造函数。您可以使用实例方法或构造函数来引用当前对象的任何成员。
它涵盖了两个示例:
将其与字段一起使用,并将其与构造函数一起使用
用例2:
这篇文章中未引用的其他用例:this
可用于在多线程应用程序中同步当前对象,以保护数据和方法的关键部分。
synchronized(this){
// Do some thing.
}
用例3:
Builder模式的实现取决于使用this
来返回修改后的对象。
请参阅这篇文章
Google在Sun网站上打开了一个页面,对此进行了一些讨论。
您对变量是正确的;this
确实可以用来区分方法变量和类字段。
private int x;
public void setX(int x) {
this.x=x;
}
但是,我真的很讨厌那个约定。给两个不同的变量从字面上相同的名称是错误的秘诀。我更喜欢以下方面的东西:
private int x;
public void setX(int newX) {
x=newX;
}
结果相同,但是x
当您确实要引用时,您不会偶然地引用错误x
。
至于将其与一种方法配合使用,您对效果的看法是正确的。使用或不使用它,您都会得到相同的结果。可以使用吗?当然。你应该使用它吗?由您决定,但是鉴于我个人认为毫无意义的冗长性不会增加任何清晰度(除非代码充满了静态导入语句),所以我不打算自己使用它。
以下是在Java中使用'this'关键字的方法:
this
关键字来引用当前的类实例变量this()
调用当前类的构造函数this
关键字返回当前的类实例this
关键字作为方法参数https://docs.oracle.com/javase/tutorial/java/javaOO/thiskey.html
this
不会影响生成的代码-它是编译时间运算符,使用或不使用它生成的代码都相同。当您必须使用它时,取决于上下文。例如,您必须使用它,正如您所说的,当您的局部变量遮盖了类变量,而您想引用类变量而不是局部变量时。
编辑:“结果代码将是相同的”,我的意思是,当局部范围内的某个变量没有隐藏属于类的那个时。从而
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
}
关于William Brendel的帖子和dbconfessions问题,关于案例2。这是一个例子:
public class Window {
private Window parent;
public Window (Window parent) {
this.parent = parent;
}
public void addSubWindow() {
Window child = new Window(this);
list.add(child);
}
public void printInfo() {
if (parent == null) {
System.out.println("root");
} else {
System.out.println("child");
}
}
}
在与对象建立父子关系时,我已经看到了这种用法。但是,请注意,为简洁起见,将其简化。
Java中的“ This”关键字用于引用当前的类对象。
Java中有“ this”关键字的6种用法
确保使用当前对象的成员。在考虑线程安全的情况下,某些应用程序可能会更改错误的对象成员值,因此应将其应用于成员,以便使用正确的对象成员值。
如果您的对象与线程安全无关,则没有理由指定使用哪个对象成员的值。