1

我不太了解 Java 中“this”的用法。如果有人可以帮助我澄清,我将不胜感激。

在这个网站上它说:http ://docs.oracle.com/javase/tutorial/java/javaOO/thiskey.html

“在实例方法或构造函数中,this 是对当前对象的引用——调用其方法或构造函数的对象。您可以使用 this 从实例方法或构造函数中引用当前对象的任何成员。 "

它给出了以下示例:

例如,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?为什么不是this.x = a?为什么x在左边?

对不起,我对 Java 很陌生。我很抱歉让专家们感到厌烦。

4

9 回答 9

3

如果定义了一些与对象属性同名的变量/参数,它会“重叠”该属性的名称,并且应该使用 this.var_name。

所以是的,它可以写成this.x = a,但有些多余。

于 2012-04-15T22:55:41.997 回答
2

在第二个示例中,其中一个参数被命名为 x。通过引用 this.x,您的意思是该方法所属的类的 x 字段/属性。它可以读作:Point.x = argument x

这是用来区分两者的,使代码的含义清晰。

于 2012-04-15T22:56:09.043 回答
1

不是 this.x = a 因为在第二个示例中没有“a”。关键是您可以重用相同的变量名,这样不会造成混淆:-|

于 2012-04-15T22:56:20.680 回答
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”的用法更多。

于 2012-04-15T22:58:26.210 回答
1

这样做的目的是非常清楚地表明您正在为构造函数提供值,x并且y在构造函数中提供值。

现在的问题是,由于构造函数中的范围规则是x指传递的值而不是字段x。因此x = x导致参数被分配其自己的值并且阴影字段保持不变。这通常不是我们想要的。

因此,需要一种机制来表示“我需要另一个x 而不是此处立即可见的 x”。这里this指的是当前对象 - 所以this.x指的是当前对象中的一个字段,并且super指的是这个对象扩展的对象,这样你就可以到达一个“更高”的字段。

于 2012-04-15T22:58:48.327 回答
1

this是对当前对象的引用,因此您可以像访问任何其他对象一样访问它-this.xx. 传入的参数也是this如此,您将其分配给.xthis.x

这就是命名空间——变量名称仅适用于给定代码块的想法。在 java 中,您在属于该类的函数中工作,您位于该类的命名空间中,但是,如果您有另一个与参数同名的变量,它将优先,您可以访问属性通过this.

this也可以以其他方式使用。例如,假设我想从类中将当前对象绘制到虚构库中的屏幕上,我可以这样做:

window.draw(this)

你也可以调用函数

this允许我们引用我们当前“内部”的对象,因此我们可以将当前对象作为参数传递。这非常有用。(没有双关语的意思)。

于 2012-04-15T22:59:51.480 回答
0

“this”是一个隐藏的“参数”,它会为您传递,以便对对象进行操作的方法知道它们要对哪个对象进行操作。

现在假设您传递名称“x”的参数,但该类确实已经定义了该 var 名称。发生什么了 ?好吧,“属于”对象的名称 x 和参数 x 不是同一个数据对象,但它们共享名称。

为了消除歧义,您需要明确地说“this.x”,它告诉编译器您正在谈论的 x 已经属于“this”对象。(即,您尝试操作的当前对象。)

于 2012-04-15T22:59:50.393 回答
0

在第二个例子中,构造函数的参数不是aand b; 它们被更改为xand ythis.x = x;意思是“为这个 Point 类实例的成员变量分配x传递给构造函数的值x”。

于 2012-04-15T23:00:36.490 回答
0

这实际上与 java 编译器如何通过名称识别变量有关。函数(正式)参数名称位于类成员变量之前。在第一个示例中,形参名称是 a 和 b,它们不会与成员变量 x 和 y 发生冲突,因此编写

x = a;

是合乎逻辑的,因为 x 只能表示成员变量类 Point。

In the second example x refers both to the formal parameter name and to the member variable. Writing x within the function body refers to the parameter so if you need some other way in order to refer to the member variable x. This is done by explicitly accessing a member via the 'this' keyword.

于 2012-04-15T23:02:13.627 回答