0

以下代码同时运行 var = putVar; & this.var = putVar;

我理解:“this”用于识别 - “将此值仅用于 '我的' 对象”。当两者都起作用时,为什么人们通常在设置器中使用“this”?

代码:

public class PlayingWithObjects
{
    public static void main(String[] args)
    {
        SomeClass classObj = new SomeClass(10);

        System.out.println("classObj.getVar: " + classObj.getVar() );

        classObj.setVar(20);

        System.out.println("classObj.getVar: " + classObj.getVar() );

        classObj = new SomeClass(30);

        System.out.println("classObj.getVar: " + classObj.getVar() );
    }
}

class SomeClass
{
    private int var;

    public SomeClass(int putVar)
    {
        var = putVar;
    }

    public int getVar()
    {
        return var;
    }

    public void setVar(int putVar)
    {
//      var = putVar;           // also works
        this.var = putVar;
    }
}

我是否正确理解“这个”?“this”在哪里使用&无法替换。请发布一些代码。

4

5 回答 5

7

因为人们喜欢对方法参数和实例变量使用相同的变量名——在这种情况下你需要this区分。

public void setX(int x) {
    this.x = x;
}
于 2013-03-30T05:18:07.160 回答
2

如果您使用与字段相同的方法参数标识符,则可以this使用,但如果您只是不使用相同的名称,则可以避免使用。

不使用相同的名称是一种更常见的做法,以避免混淆和遮蔽。因此,setter 中的任何引用this都可以替换为更好的命名标准: inParameter例如。

public void setX(int inX) {
    x = inX;
}

的另一个用途this显式调用构造函数。这是一种不能用更简单的命名约定代替的形式:

public class Foo {

    private String name;

    public Foo() {
        this("");
    }

    public Foo(String inName) {
        name = inName;
    }
}

在某些情况下,您可能希望返回正在使用的实例。这也是this允许您执行的操作:

return this;
于 2013-03-30T05:26:21.517 回答
1

除了提到的案例 ktm 之外,我知道有 2 个案例(我认为这是显而易见的,你已经知道了):

  1. 只是为了清楚地表明它们指的是当前对象的成员。

    void foo(int x) {
        this.y = x; // No mistaking that y belongs to the object
    }
    
  2. 如果您在另一个对象的匿名内部类中(例如:ClassName 类),您可以使用 ClassName.this 来获取封闭对象的实例。这样做的原因(不是双关语)是在内部类内部,这将引用内部类。

    SomeInnerClass myObj = new SomeInnerClass() {
        void bar() {
            this.y = 0; // this refers to the SomeInnerClass object
            OuterClass.this.y = 0; // OuterClass.this refers to the enclosing class OuterClass object
        }
    };
    
于 2013-03-30T05:27:23.787 回答
0

就像提到的 ktm 一样,setter 倾向于使用与参数字段相同的名称。在这种情况下,参数会隐藏字段名称,因此

public void setX(int x) {
    x = x;
}

只会将参数设置为自身,而不是将字段设置为参数。

于 2013-03-30T05:21:24.780 回答
0

如果一个类有一个具有某个名称的实例变量(比如myVar),并且一个方法有一个具有完全相同名称的 LOCAL 变量(myVar),那么对该变量的任何引用都将引用 LOCAL 变量。在这种情况下,如果我们想指定类的实例变量,我们需要说this.myVar. 如前所述,当我们希望设置参数名称与其设置的实例变量相同的设置器时,这特别有用:

public void setMyVar(int myVar) {
    this.myVar = myVar; // If we said myVar = myVar;, we'd just set the local
                        // variable to itself, which would NOT be what we want.
}
于 2013-03-30T05:23:54.190 回答