有人能详细解释一下“这个”的使用吗?

时间:2012-04-15 22:53:21

标签: java object methods this

我真的不明白在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很新。我为无聊的专家道歉。

9 个答案:

答案 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)

我们的想法是让非常明确表示您在构造函数中为xy提供了值。

现在的问题是,由于范围规则,构造函数x中的内容引用了传递的值,而不是字段x。因此x = x导致为参数分配自己的值,并且阴影字段不变。这通常不是想要的。

因此,需要一种机制来说"我需要另一个 x,而不是在这里立即看到的那个"。这里this引用当前对象 - 因此this.x引用当前对象中的字段,super引用此对象扩展的对象,以便您可以访问字段&#34 ;更高的"。

答案 5 :(得分:1)

this是对当前对象的引用,因此您可以像访问任何其他对象一样访问它 - this.xx的{​​{1}}属性。因此this是传入的参数,您将其分配给x

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

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

this

您也可以调用函数

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

答案 6 :(得分:0)

"这"是一个隐藏的"论证"为你传递的,以便对象操作的方法知道它们要操作的对象。

现在想象你传递了名字" x"但是这个类确实已经定义了var名称。怎么了 ?嗯,"属于"对象和参数x不是相同的数据对象,但它们共享名称。

为了消除歧义,你需要明确说明" this.x",它告诉编译器你正在谈论已经属于"这个"宾语。 (也就是说,您尝试操作的当前对象。)

答案 7 :(得分:0)

在第二个示例中,构造函数的参数不是ab;它们已更改为xy,而this.x = x;表示"为此Point类实例的成员变量x分配传递给构造函数的值x"

答案 8 :(得分:0)

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

x = a;

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

在第二个示例中,x指的是形式参数名称和成员变量。在函数体内编写x指的是参数,所以如果你需要一些其他的方式来引用成员变量x。这是通过'this'关键字明确访问成员来完成的。