有人能详细解释一下“这个”的用法吗?
我真的不明白在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很新。 我为无聊的专家道歉。
如果定义了一个与object的属性同名的变量/参数,它将“重叠”该属性的名称,并且应该使用this.var_name。
所以是的,它可以写成this.x = a
,但有些多余。
在第二个示例中,其中一个参数名为x。 通过引用this.x,您指的是该方法所属的类的x字段/属性。 它可以读作:Point.x =参数x
这用于区分两者,使代码的含义清晰。
这不是this.x = a,因为第二个例子中没有’a’。 关键是你可以重用相同的变量名,这样可以减少混淆: – |
我们的想法是明确表示您在构造函数中为x
和y
提供值。
现在的问题是,由于范围规则,构造函数x
是指传递的值,而不是字段x
。 因此, x = x
导致参数被赋予其自己的值并且阴影字段未被触及。 这通常不是想要的。
因此,需要一种机制来说“我需要另一个 x,而不是在这里立即可见的那个”。 这里指的是当前对象 – 所以this.x
指的是当前对象中的一个字段,而super
指的是该对象扩展的对象,这样你就可以到达“更高”的字段。
this
是对当前对象的引用,因此您可以像访问任何其他对象一样访问它 – this.x
是此属性的x
属性。 所以x
是传入的参数,你赋予this.x
这是命名空间 – 一个变量名称仅适用于给定代码块的想法。 在java中,您在属于该类的函数中工作,您在该类的名称空间内,但是,如果您有另一个与参数同名的变量,它将优先,您可以访问该属性通过this
。
this
也可以用于其他方式。 例如,假设我想将当前对象绘制到虚构库中的屏幕上,从类中,我可以这样做:
window.draw(this)
你也可以调用函数
this
允许我们引用当前“内部”的对象,因此我们可以将当前对象作为参数传递。 这非常有用。 (没有双关语)。
“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”有更多用法。
“this”是一个隐藏的“参数”,它会为您传递,以便对该对象进行操作的方法知道它们要操作的对象。
现在假设您传递了名为“x”的参数,但该类确实已经定义了var名称。 怎么了 ? 那么,“属于”对象的名称x和参数x不是相同的数据对象,但它们共享名称。
为了消除歧义,你需要明确地说明“this.x”,它告诉编译器你正在谈论已经属于“this”对象的x。 (也就是说,您尝试操作的当前对象。)
在第二个例子中,构造函数的参数不是a
和b
; 它们被改为x
和y
,而this.x = x;
表示“将此Point类实例的成员变量x
传递给构造函数的值为x
”。
这实际上与java编译器如何通过名称识别变量有关。 函数(格式)参数名称在类成员变量之前。 在第一个例子中,forms参数名称是a和b,它们不会与成员变量x和y发生冲突,因此写入
x = a;
是逻辑的,因为x只能表示成员变量类Point。
在第二个示例中,x指的是forms参数名称和成员变量。 在函数体内编写x指的是参数,所以如果你需要一些其他的方式来引用成员变量x。 这是通过’this’关键字明确访问成员来完成的。