Java – 何时使用“this”关键字

在Java中使用this关键字的最佳做法是什么? 例如,我有以下类:

 class Foo { Bar bar; public Foo(Bar bar) { this.bar = bar; } } 

这很好,但是Java是足够聪明的,知道发生了什么,如果我改变构造函数中的语句

  bar = bar; 

那么为什么使用this关键字? (我认识到在某些情况下,完全有必要使用它,我只是要求这样的情况)。 实际上,我倾向于纯粹为了可读性而使用关键字,但常见的做法是什么? 例如,在整个商店中使用它使我的代码看起来有点乱

 boolean baz; int someIndex = 5; this.baz = this.bar.getSomeNumber() == this.someBarArray[this.someIndex].getSomeNumber(); 

很明显,代码很less,但它说明了我的例子。 在这些情况下是否只是个人偏好?

但是如果我将构造函数中的语句更改为Java,则Java足够聪明以知道发生了什么

  bar = bar; 

假! 它编译,但它不会做你认为它的作用!

至于何时使用它,很多是个人喜好。 我喜欢在我的公共方法中使用this ,即使是没有必要的,因为这是接口发生的地方,很高兴声明什么是我的,什么不是。

作为参考,您可以查看关于this.subject的Oracle Java教程:-)

http://docs.oracle.com/javase/tutorial/java/javaOO/thiskey.html

其实

 baz = baz 

会提出这个警告

对variablesbaz的赋值没有效果

所以你认为是错误的,本地范围覆盖类属性,所以你必须明确地使用this关键字来指定variables的类属性。

否则,分配给variables的variables只是作为parameter passing的variables,而类别被忽略。 这就是为什么this是有用的,这不是一个可读性的事实,这是明确地决定你在说什么baz的事实。

我会说

在不使用它的地方使用它会引起歧义(或编译器警告,这是更重要的),否则就把它留下。 既然其目的正是为了解决默认假设(首先检查本地,然后检查类属性)是否不明确。

当你有一个与字段同名的参数时,你应该使用它,否则你会遇到问题。 它会编译,但不一定会做你想要的。

至于其他地方,除非为了可读性的缘故,否则不要使用它。 如果你在任何地方都使用它,你的代码中的20%将由“this”组成。

this关键字引用了某个方法被调用的类的Object。
例如:

 public class Xyz { public Xyz(Abc ob) { ob.show(); } } public class Abc { int a = 10; public Abc() { new Xyz(this); } public void show() { System.out.println("Value of a " + a); } public static void main(String s[]) { new Abc(); } } 

Abc()我们调用需要Abc Class对象的Xyz() 。所以我们可以通过this而不是新的Abc() ,因为如果我们在这里传递新的Abc() ,它会一次又一次地调用自己。

我们也用这个来区分方法的类和局部variables的variables。 例如

 class Abc { int a; void setValue(int a) { this.a = a; } } 

这里this.a是指Abc类的variablesa。 因此,与使用新的Abc().a;具有相同的效果Abc().a;

所以你可以说this是指当前课程的对象。

显式的构造函数调用中使用这个关键字是很常见的。 你可以从文档中看到一个例子。

 public class Rectangle { private int x, y; private int width, height; public Rectangle() { this(0, 0, 1, 1); } public Rectangle(int width, int height) { this(0, 0, width, height); } public Rectangle(int x, int y, int width, int height) { this.x = x; this.y = y; this.width = width; this.height = height; } ... } 
 public Foo(Bar bar) { this.bar = bar; } 

是不一样的

 public Foo(Bar bar) { bar = bar; } 

在第二种情况下,作用域中的bar是参数,所以将其分配给自己。 this.bar保持为null

这是一种个人喜好 – select一种风格,坚持下去。 我个人使用this但其他人认为这是多余的。

根据惯例,您可以使用它来提高可读性。 它强调这是一个对象variables的事实。

我也喜欢使用与variables同名的setter参数(在方法签名中看起来更好)。 在这种情况下你需要this

我总是尝试在本地类对象上使用this关键字。

我用它在视觉上提醒我,如果一个对象是静态对象或类对象。

它帮助我和编译器区分方法参数和本地类对象。

 public void setValue(int value){ this.value = value; } 

它可以帮助我在视觉上提醒我内部/嵌套/匿名类中是否存在这样一个局部对象,以区分它与封装类对象。 因为如果没有this前缀,我的约定会提醒我这是封装类的一个对象

 public class Hello{ public int value = 0; public boolean modal = false; public class Hellee{ public int value = 1; public getValue(){ if (modal) return 0; return this.value; } } } 
 void set(int real) { this.real = real; } 

这里有一个关键字,当有实例variables和本地variables相同时。
另一个用途是构造函数重载。 它可以在重载的构造函数中调用构造函数。

个人喜好,但我用它来解决歧义,我想在极less数情况下,很明显,指定的variables是一个字段。 有一些项目在人们使用“this.field”每一个字段的参考。 我发现这种做法在视觉上分散注意力,让人讨厌,但是你应该准备好偶尔看看这样的代码。

我偷偷地以为地狱里有一个特别的地方,那些编写500行的,有275个这个关键字的人,但是这个风格是在一些开源项目中find的,所以我猜也是这样。

将其用于克隆对象(通过将自身的引用传递给复制构造函数)。

对inheritanceCloneable对象有用。

 public Foo implements Cloneable { private String bar; public Foo(Foo who) { bar = who.bar; } public Object getClone() { return new Foo(this); //Return new copy of self. } }