30

我的老师说,当我尝试访问方法中的实例变量时,我应该始终使用this关键字,否则我会执行双重搜索。本地范围搜索,然后是实例范围搜索。

例子:

public class Test(){
    int cont=0;
    public void Method(){
        System.out.println(cont);//Should I use This.cont instead?
    }
}

我希望他是错的,但我找不到任何论据。

4

8 回答 8

40

不,仅this在您有名称冲突时使用,例如当方法参数与其设置的实例字段具有相同名称时。

它可以在其他时候使用,但我们中的许多人认为它只是在代码中添加了不必要的冗长。

于 2013-04-05T03:51:31.003 回答
25

由于名称冲突,您必须在需要时使用this,但最好完全避免使用这些名称。

如果你愿意,你可以使用。this这纯粹是口味问题。

如果你的老师要求,你应该在你的功课中使用它。this

于 2013-04-05T03:55:55.653 回答
2

this是实例中当前实例的别名或名称。它对于区分实例变量和局部变量(包括参数)很有用,但它本身可以用来简单地引用成员变量和方法,调用其他构造函数重载,或者简单地引用实例。
请参阅Java - 何时使用“this”关键字
也指当前对象。如果您的类具有变量 int A,并且该类的方法 xyz 部分具有 int A,则只是为了区分您指的是哪个“A”,您将使用 this.A。这只是一个示例案例。

public class Test
{
int a;

public void testMethod(int a)
{
this.a = a;
//Here this.a is variable 'a' of this instance. parameter 'a' is parameter.
}
}

所以你可能会说
这个关键字可以用于(它不能与静态方法一起使用):

        1)To get reference of an object through which that method is 
        called within it(instance method).
        2)To avoid field shadowed by a method or constructor parameter.
        3)To invoke constructor of same class.
        4)In case of method overridden, this is used to invoke method of current class.
        5)To make reference to an inner class. e.g ClassName.this
于 2013-04-05T03:53:33.657 回答
2

您的老师是正确的,如果您不使用this关键字,它将导致对编译器的双重搜索。首先,如果编译器无法在本地范围内找到变量,编译器将在本地范围内搜索,然后在实例范围内搜索。

此外,当编译器将您的代码转换为字节码时,编译器将为所有实例变量添加this关键字前缀。所以,如果你自己使用this关键字,你实际上是在减轻编译器的负担,并且代码编译得更快。

于 2013-04-05T05:02:39.030 回答
1

既然大家都给出了名字消歧的例子,我就在使用this帮助的时候举个例子:

public class Person {
    private final firstName;
    private final lastName;
    private final Date birthdate;
    private final Address address;

    @Override
    public boolean equals(Object otherObject) {
        if (!(otherObject instanceof Person) {
            return false;
        }

        Person otherPerson = (Person) otherObject;

        // Using this here help distinguishing the current instance and the other.
        return this.firstName.equals(otherPerson.firstName)
            && this.lastName.equals(otherPerson.lastName)
            && this.birthdate.equals(otherPerson.birthDate)
            && this.address.equals(otherPerson.address);
    }

}
于 2013-04-05T04:00:04.987 回答
0

this仅适用于参数与类属性同名的情况。

public class Dog {
   String name;
   public Dog(String name) {
      name = name; //but which name? Are we just assigning a variable to itself?
      // here you could say this.name = name. Or you could rename one of the variables to resolve ambiguity
   }
}
于 2013-04-05T03:52:06.210 回答
0

由于自动完成(让生活更轻松),我偶尔会使用this它们,但之后我会清理它们。

请记住,清晰是关键。在这种情况下,很明显它cont是一个类变量,但如果你正在编写一个包含大量实例变量的巨大类,你可能会考虑使用它this以清楚起见。

您也只需要this在名称冲突时使用,例如

public class Ex {
    int num;
    public Ex(int num) {
        this.num = num; 
    }
}

在此示例中,虽然 num = num 会导致冲突,但 "this" 避免了它。这是唯一绝对必要的时候,但同样,清晰度通常是更高的优先级。

于 2013-04-05T03:52:14.633 回答
0

另一个this经常用于可读性的地方是当内部类对象引用其包含对象的字段时。

public class Foo {

    String foostring;
    /* snip lots of code */
    private class Foohelper {
        void helperMethod(String bazstring) {
             Foo.this.foostring = bazstring;
             // etc.
        }
    }
}

编译器不需要这个,但它使寻找的情况foostring更加清晰。除了这个(!),我只完全限定了构造函数中的字段名称,它们可能被参数名称隐藏,正如许多其他海报在这里所说明的那样。

[编辑:现在我考虑了一下,编译器在某些地方需要这个,例如,如果Foohelper.toString()想调用Foo.toString().]

于 2013-04-05T05:31:10.273 回答