Когда я должен использовать “это” в классе?

Я знаю это this относится к текущему объекту. Но я не знаю, когда я действительно должен использовать его. Например, будет ли любое различие, если я буду использовать x вместо this.x в некоторых методах? Может быть x будет относиться к переменной, которая локальна для продуманного метода? Я имею в виду переменную, которая замечена только в этом методе.

Что относительно this.method()? Я могу использовать его? Если я использую его. Если я просто использую method(), разве к этому не будут, по умолчанию, относиться текущий объект?

245
задан Gabriel Ščerbák 26 April 2010 в 21:37
поделиться

11 ответов

Google открыл страницу на сайте Sun, на которой это немного обсуждается.

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

  private int x; 
public void setX (int x) {{{1} } this.x = x; 
} 
 

Однако я действительно ненавижу это соглашение. Присвоение двум разным переменным буквально одинаковых имен - это рецепт для ошибок. Я предпочитаю что-то вроде:

  private int x; 
public void setX (int newX) {
x = newX; 
} { {1}} 

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

Что касается использования его с методом, вы правы насчет эффектов; вы получите те же результаты с ним или без него. Вы можете это использовать? Конечно. Стоит ли его использовать? На ваше усмотрение, но, учитывая то, что я лично считаю это бессмысленным многословием, которое не добавляет ясности (если код не забит статическими операторами импорта), я не склонен использовать его сам.

2
ответ дан 23 November 2019 в 03:05
поделиться

Ключевое слово this в основном используется в трех ситуациях.Первый и самый распространенный - это методы установки для устранения неоднозначности ссылок на переменные. Второй - когда необходимо передать текущий экземпляр класса в качестве аргумента методу другого объекта. Третий - это способ вызова альтернативных конструкторов из конструктора.

Случай 1: Использование this для устранения неоднозначности ссылок на переменные. В методах установки Java мы обычно передаем аргумент с тем же именем, что и закрытая переменная-член, которую мы пытаемся установить. Затем мы присваиваем аргумент x this.x . Это дает понять, что вы присваиваете значение параметра name переменной экземпляра name.

public class Foo
{
    private String name;

    public void setName(String name) {
        this.name = name;
    }
}

Случай 2: Использование this в качестве аргумента, переданного другому объекту.

public class Foo
{
    public String useBarMethod() {
        Bar theBar = new Bar();
        return theBar.barMethod(this);
    }

    public String getName() {
        return "Foo";
    }
}

public class Bar
{
    public void barMethod(Foo obj) {
        obj.getName();
    }
}

Случай 3: Использование this для вызова альтернативных конструкторов. В комментариях trinithis правильно указал на другое распространенное использование this . Когда у вас есть несколько конструкторов для одного класса, вы можете использовать this (arg0, arg1, ...) для вызова другого конструктора по вашему выбору, при условии, что вы делаете это в первой строке вашего конструктора.

class Foo
{
    public Foo() {
        this("Some default value for bar");

        //optional other lines
    }

    public Foo(String bar) {
        // Do something with bar
    }
}

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

323
ответ дан 23 November 2019 в 03:05
поделиться

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

Если ваш объект не заботится о безопасности потоков, то нет причин указывать, какое значение члена объекта используется.

-8
ответ дан 23 November 2019 в 03:05
поделиться

Если у вас нет перекрывающихся имен переменных, это просто для ясности при чтении кода.

7
ответ дан 23 November 2019 в 03:05
поделиться

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

1
ответ дан 23 November 2019 в 03:05
поделиться

Второе важное использование this (помимо скрытия локальной переменной, как уже говорят многие ответы) — при доступе к внешнему экземпляру из вложенного нестатического класса:

public class Outer {
  protected int a;

  public class Inner {
    protected int a;

    public int foo(){
      return Outer.this.a;
    }

    public Outer getOuter(){
      return Outer.this;
    }
  }
}
68
ответ дан 23 November 2019 в 03:05
поделиться

«это» также полезно при вызове одного конструктора из другого:

public class MyClass {
    public MyClass(String foo) {
        this(foo, null);
    }
    public MyClass(String foo, String bar) {
        ...
    }
}
15
ответ дан 23 November 2019 в 03:05
поделиться

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

edit: под «результирующий код будет таким же» я имею в виду, конечно, когда некоторая переменная в локальной области видимости не скрывает принадлежность к классу. Таким образом

class POJO {
   protected int i;

   public void modify() {
      i = 9;
   }

   public void thisModify() {
      this.i = 9;
   }
}

результирующий код обоих методов будет одинаковым. Разница будет в том, что какой-либо метод объявляет локальную переменную с тем же именем

  public void m() {
      int i;
      i = 9;  // i refers to variable in method's scope
      this.i = 9; // i refers to class variable
  }
0
ответ дан 23 November 2019 в 03:05
поделиться

Единственное, что нужно , , чтобы использовать this. Квалификатор - это когда другая переменная в текущей области имеет то же имя, и вы хотите сослаться на член экземпляра (как описывает Уильям). Кроме того, нет никакой разницы в поведении между x и this.x .

23
ответ дан 23 November 2019 в 03:05
поделиться

Будет ли разница, если я использую «x» вместо «this.x» в некоторых методах?

Обычно нет. Но иногда это имеет значение:

  class A {
     private int i;
     public A(int i) {
        this.i = i; // this.i can be used to disambiguate the i being referred to
     }
  }

Если я просто использую "method ()", не будет ли он по умолчанию применен к текущему объекту?

Да. Но при необходимости this.method () уточняет, что вызов сделан этим объектом.

0
ответ дан 23 November 2019 в 03:05
поделиться

Вам нужно использовать только this - и большинство людей используют его только - когда есть перекрывающаяся локальная переменная с тем же именем. (Например, методы установки.)

Конечно, еще одна веская причина для использования this заключается в том, что он вызывает всплывающее окно intellisense в среде IDE:)

45
ответ дан 23 November 2019 в 03:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: