Подтвердить что ты не робот

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

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

Пример:

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

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

Ответ 3

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

Ответ 4

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

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

Ответ 5

Поскольку все приводили примеры неоднозначных имен, я приведу пример при использовании this help:

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);
    }

}

Ответ 6

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
   }
}

Ответ 7

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

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

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

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

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

Ответ 8

Другое место, которое 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().]