我知道这是指一个当前对象。但是我不知道什么时候我真的需要使用它。例如,如果我用x代替这个,会有什么不同吗。X在某些方法中?可能x将是指一个变量,这是局部的考虑方法?我指的是只有在这个方法中才能看到的变量。
那么this.method()呢?我能用吗?我应该用它吗?如果我只是使用方法(),它不是,默认情况下,应用到当前对象?
我知道这是指一个当前对象。但是我不知道什么时候我真的需要使用它。例如,如果我用x代替这个,会有什么不同吗。X在某些方法中?可能x将是指一个变量,这是局部的考虑方法?我指的是只有在这个方法中才能看到的变量。
那么this.method()呢?我能用吗?我应该用它吗?如果我只是使用方法(),它不是,默认情况下,应用到当前对象?
当前回答
"this"在从一个构造函数调用另一个构造函数时也很有用:
public class MyClass {
public MyClass(String foo) {
this(foo, null);
}
public MyClass(String foo, String bar) {
...
}
}
其他回答
这不会影响结果代码——它是编译时操作符,有或没有它生成的代码都是一样的。当你必须使用它时,取决于上下文。例如,你必须使用它,当你有一个局部变量,它掩盖了类变量你想引用类变量而不是局部变量。
edit:“生成的代码将是相同的”,我的意思当然是,当局部作用域中的某个变量没有隐藏属于类的变量时。因此
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
}
谷歌在太阳网站上有一个页面讨论了这个问题。
关于变量你是对的;这确实可以用来区分方法变量和类字段。 私有int x; setX(int x) { this.x = x; }
然而,我真的很讨厌这种惯例。给两个不同的变量取完全相同的名字是产生错误的原因。我更喜欢这样的东西: 私有int x; setX(int newX) { x = newX; }
相同的结果,但不会出现错误,即您不小心引用了x,而实际上应该引用x。
至于用一种方法来使用它,你说的效果是对的;不管有没有它,你都会得到相同的结果。你会用吗?确定。你应该使用它吗?由您决定,但考虑到我个人认为这是毫无意义的冗长,不会增加任何清晰度(除非代码充满了静态导入语句),我自己不倾向于使用它。
以确保使用了当前对象的成员。在考虑线程安全的情况下,一些应用程序可能会更改错误的对象成员值,因此应该将此应用于成员,以便使用正确的对象成员值。
如果你的对象不关心线程安全,那么就没有理由指定使用哪个对象成员的值。
有很多很好的答案,但还有一个非常次要的原因到处都是。如果你尝试过从普通的文本编辑器(如记事本等)打开源代码,使用这个将使它更清晰地阅读。
想象一下:
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或项目时,如果你的规则包括“如果有人用记事本打开所有这些源代码,他或她应该朝自己的头开枪”,那么你完全可以不这样做。
关于威廉·布伦德尔的帖子和坦白问题,关于案例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");
}
}
}
我曾在与对象建立父子关系时看到过这种用法。但是,请注意,为了简洁起见,这里进行了简化。