对Java中的“this”运算符感到困惑

时间:2011-10-02 18:13:11

标签: java this operator-keyword

虽然我试图理解为什么需要“这个”,但我对它的目的非常困惑。例如,我编写了以下代码:

public static void main (String args[])
{
    SandboxClass1 temp = new SandboxClass1(1,2,3);  
    System.out.println(temp.getX());
    System.out.println(temp.getY());
    System.out.println(temp.getZ());

    System.out.println("----------------------------");

    SandboxClass1 temp2 = new SandboxClass1(4,5,6);
    System.out.println(temp2.getX());
    System.out.println(temp2.getY());
    System.out.println(temp2.getZ());
}

public class SandboxClass1 
{

private int x = 1;
private int y = 1;
private int z = 0;

public SandboxClass1(int x, int y, int zz)
{
    this.x = x;
    this.y = y;
    z = zz;
}

public int getX()
{
    return(this.x);
}

public int getY()
{
    return(this.y);
}

public int getZ()
{
    return(this.z);
}

}

为什么我需要编码“this.z = zz”
当我还能写,“z = zz”?

8 个答案:

答案 0 :(得分:3)

在这种情况下,你没有。当你必须消除歧义时,它只是 required ,就像参数和实例变量共享一个名字一样。

有些人喜欢使用“this”来消除概念歧义,并明确声明代码引用了一个实例变量。

(侧面说明,返回值周围的括号是不必要的,有点吵,IMO。)

答案 1 :(得分:2)

它具有相同的效果。如果有一个局部变量覆盖了该类的一个字段,则需要this;然后你得到局部变量而不是类字段。

您可以更好地指出变量的另一个优势。如果有this;这是一个领域;否则是局部变量。

答案 2 :(得分:2)

在SandboxClass1构造函数中,您有两对变量,分别称为x和y。在对象本身上声明了x和y(“private int x = 1”),以及作为构造函数参数的单独的x和y(“int x”)。

本地(参数)变量阴影类变量。所以,如果你刚刚在构造函数中做了

x = x;

任务无效。

关键字this是对调用方法/构造函数的对象的引用。在声明中

this.x = x;

您正在使用它在类级别分配给其他x。通过限定名称,您可以区分它们。

没有必要将this与z / zz赋值一起使用,因为它们具有不同的名称。

在getX / Y / Z方法中也没有必要,因为这些方法中没有局部变量会影响相关的类变量。它没有坏处。

答案 3 :(得分:2)

SandboxClass1构造函数中,两个参数(xy)隐藏了类变量,因为它们的名称相同。如果要在代码> SandboxClass1构造函数中将类变量x分配给任何值,则必须使用this.x来解决它,以告诉编译器“我想要分配名为x的类范围变量,而不是方法范围变量名为x“。这同样适用于y。

由于参数z没有隐藏名为zz的类范围变量,因此您无需告诉编译器zz变量的范围,类范围zz是唯一可识别的变量,因此是被分配的那个。

答案 4 :(得分:2)

关键字this用于引用类中的属性。创建关键字this是为了区分类属性和方法参数。像这样:

public class human
{
    public void setName(String name)
    {
        // the first name is a reference to the class attribute name
        this.name = name;
        // the second name is a reference to the method parameter name
    }

    // definition of the class attribute name
    private String name;
}

当你使用关键字this时,它引用了类中的name变量,这是一个你不需要使用它的例子:

public class Human
{
    public void setName(String myName)
    {
        name = myName
    }

    private String name;
}

现在看到只有一个名为name的变量,并且只有一个名为myName的变量。在另一个例子中,有两个名为name的变量。一个是类属性,一个是方法参数。

答案 5 :(得分:1)

'this'运算符只是改进了属性/字段属于你正在使用的类。例如,当你有两个同名的变量时,这很有用:

this.zz = zz;

答案 6 :(得分:1)

与Objective-C不同,当方法或变量是本地的时,“this”是可选的,并且没有其他相同名称的冲突使用。

它在冲突名称的情况下派上用场,例如在设置实例变量的方法中,例如void setOnionCount(int onionCount),你想在其中使用“onionCount”作为形式参数,但仍然将“onionCount”作为实例变量名称。在这种情况下,你可以做this.onionCount = onionCount;,每个人都很高兴(除了,我想,花生画廊里的人会反对这种技巧)。

当你需要将对当前对象的引用传递给其他类时,“this”也是绝对必要的。

答案 7 :(得分:1)

嘿,这是用来提供调用对象的引用。那就是说假设你的类是盒子,那么如果你想提供它的对象,那么你可以使用this关键字在类框中提供它。

class Box {
    int x;
    public Box(int x){
        this.x = x;
    }
}

在这种情况下,如果你的对象是ob(即Box ob = new Box(1)),那么引用它将被传递给它自己。 注意:您不能在课外使用此关键字。如果你使用那么它将提供另一个类的参考。 有关此关键字的完整详细信息,请参阅以下链 http://download.oracle.com/javase/tutorial/java/javaOO/thiskey.html