我真的不明白在Java中使用'this'。如果有人能帮我澄清,我会非常感激。
在这个网站上说:http://docs.oracle.com/javase/tutorial/java/javaOO/thiskey.html
“在实例方法或构造函数中,这是对当前对象的引用 - 正在调用其方法或构造函数的对象。您可以在实例方法或构造函数中引用当前对象的任何成员用这个。“
它给出了以下示例:
例如,Point类就是这样编写的
public class Point {
public int x = 0;
public int y = 0;
//constructor
public Point(int a, int b) {
x = a;
y = b;
}
}
但它可能是这样写的:
public class Point {
public int x = 0;
public int y = 0;
//constructor
public Point(int x, int y) {
this.x = x;
this.y = y;
}
}
然而,我仍然不完全理解为什么x = a可以写成this.x = x?为什么不是这个。= =?为什么x在左侧?
对不起,我对Java很新。我为无聊的专家道歉。
答案 0 :(得分:3)
如果定义了与object属性同名的变量/参数,则它“重叠”该属性的名称,并且应该使用this.var_name。
是的,它可以写成this.x = a
,但有些多余。
答案 1 :(得分:2)
在第二个例子中,其中一个参数名为x。通过引用this.x,您指的是该方法所属的类的x字段/属性。它可以读作: Point.x =参数x
这用于区分两者,使代码的含义清晰。
答案 2 :(得分:1)
这不是.x = a因为没有' a'在第二个例子中。关键是你可以重用相同的变量名,这样可以减少混淆: - |
答案 3 :(得分:1)
“this”是对您正在使用的当前对象的引用。当字段和参数之间存在名称冲突时,可以使用它。参数优先于字段。
没有冲突,不需要这个:
public Point(int a, int b) {
x = a;
y = b;
}
但这也有效:
public Point(int a, int b) {
this.x = a;
this.y = b;
}
名称冲突,需要使用“this”:
public Point(int x, int y) {
this.x = x;
this.y = y;
}
如果你只做了
public Point(int x, int y) {
x = x;
y = y;
}
然后你只需要为自己的值赋值,这实际上没有任何效果。
关键字“this”还有更多用法。
答案 4 :(得分:1)
我们的想法是让非常明确表示您在构造函数中为x
和y
提供了值。
现在的问题是,由于范围规则,构造函数x
中的内容引用了传递的值,而不是字段x
。因此x = x
导致为参数分配自己的值,并且阴影字段不变。这通常不是想要的。
因此,需要一种机制来说"我需要另一个 x,而不是在这里立即看到的那个"。这里this
引用当前对象 - 因此this.x
引用当前对象中的字段,super
引用此对象扩展的对象,以便您可以访问字段&#34 ;更高的"。
答案 5 :(得分:1)
this
是对当前对象的引用,因此您可以像访问任何其他对象一样访问它 - this.x
是x
的{{1}}属性。因此this
是传入的参数,您将其分配给x
。
这是命名空间 - 一个变量名称仅适用于给定代码块的想法。在java中,您在属于该类的函数中工作,您在该类的命名空间内,但是,如果您有另一个与参数同名的变量,它将优先,并且您改为访问该属性通过this.x
。
this
也可以用于其他方式。例如,假设我想在一个虚构的库中将当前对象绘制到屏幕上,从类中,我可以这样做:
this
您也可以调用函数
window.draw(this)
允许我们引用当前“内部”的对象,因此我们可以将当前对象作为参数传递。这非常有用。 (没有双关语)。
答案 6 :(得分:0)
"这"是一个隐藏的"论证"为你传递的,以便对象操作的方法知道它们要操作的对象。
现在想象你传递了名字" x"但是这个类确实已经定义了var名称。怎么了 ?嗯,"属于"对象和参数x不是相同的数据对象,但它们共享名称。
为了消除歧义,你需要明确说明" this.x",它告诉编译器你正在谈论已经属于"这个"宾语。 (也就是说,您尝试操作的当前对象。)
答案 7 :(得分:0)
在第二个示例中,构造函数的参数不是a
和b
;它们已更改为x
和y
,而this.x = x;
表示"为此Point类实例的成员变量x
分配传递给构造函数的值x
"
答案 8 :(得分:0)
这实际上与java编译器如何通过名称识别变量有关。函数(格式)参数名称在类成员变量之前。在第一个例子中,形式参数名称是a和b,它们不会与成员变量x和y冲突,所以写
x = a;
是合乎逻辑的,因为x只能表示成员变量类Point。
在第二个示例中,x指的是形式参数名称和成员变量。在函数体内编写x指的是参数,所以如果你需要一些其他的方式来引用成员变量x。这是通过'this'关键字明确访问成员来完成的。