Должен ли я использовать ключевое слово "this", когда я хочу ссылаться на переменные экземпляра в методе?

Мой учитель говорит, что когда я пытаюсь получить доступ к переменной экземпляра в методе, я всегда должен использовать this ключевое слово, иначе я бы выполнил двойной поиск. Поиск в локальной области, а затем поиск в области экземпляра.

Пример:

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

Я надеюсь, что он не прав, но я не могу найти никаких аргументов.

8 ответов

Решение

Нет, только использовать this когда у вас есть конфликт имен, например, когда параметр метода имеет то же имя, что и поле экземпляра, которое он устанавливает.

Это может быть использовано в другое время, но многие из нас считают, что это просто добавляет ненужные слова в код.

Вы должны использовать this при необходимости из-за конфликта имен, хотя лучше избегать их полностью.

Вы можете использовать this если хочешь. Это чисто вопрос вкуса.

Вы должны использовать this в вашей школьной работе, если ваш учитель этого требует.

Ваш учитель прав, что это приведет к двойному поиску компилятора, если вы не используете this ключевое слово. Сначала компилятор будет искать в локальной области, а затем в области экземпляра, если компилятор не может найти переменную в локальной области.

Кроме того, пока компилятор преобразует ваш код в байт-код, он префикс всех переменных экземпляра префикс this ключевое слово. Так что, если вы сами используете this Ключевое слово, вы фактически снижаете нагрузку на компилятор, и код будет компилироваться быстрее.

this является псевдонимом или именем текущего экземпляра внутри экземпляра. Это полезно для устранения неоднозначности переменных экземпляра из локальных переменных (включая параметры), но может использоваться само по себе, чтобы просто ссылаться на переменные и методы-члены, вызывать другие перегрузки конструктора или просто ссылаться на экземпляр.
См. Java - когда использовать ключевое слово this
Также это относится к текущему объекту. Если у вас есть класс с переменными int A, а у метода xyz часть класса имеет int 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

Поскольку все приводили примеры устранения неоднозначности имен, я приведу пример при использовании 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);
    }

}

Я иногда использую this из-за автозаполнения (облегчает жизнь), но потом я убираю их.

Помните, ясность - это ключ. В этом случае очевидно, что cont переменная класса, но если вы писали огромный класс с кучами переменных экземпляра, вы можете рассмотреть возможность использования this для ясности.

Вам также нужно только использовать this когда происходит столкновение имени, например

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

В этом примере, хотя num = num вызовет коллизию, "this" избегает этого. Это единственный раз, когда это абсолютно необходимо, но, опять же, часто ясность является более высоким приоритетом.

Другое место, которое this часто используется для удобства чтения, когда внутренний объект класса ссылается на поле содержащего его объекта.

public class Foo {

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

Компилятору это не нужно, но оно создает ситуацию, в которой нужно искать foostring яснее. Кроме этого (!), Я только полностью определяю имена полей в конструкторе, где они могут быть скрыты именами параметров, как это продемонстрировали многие другие постеры.

[Edit: Теперь, когда я думаю об этом, есть места, где это нужно компилятору, например, если Foohelper.toString() хочет позвонить Foo.toString().]

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
   }
}
Другие вопросы по тегам