Когда я должен использовать «это» в классе? - PullRequest
235 голосов
/ 09 марта 2010

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

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

Ответы [ 17 ]

2 голосов
/ 09 марта 2010

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

Вы правы насчет переменной;this действительно может использоваться для дифференциации переменной метода от поля класса. private int x; public void setX(int x) { this.x=x; }

Однако я действительно ненавижу это соглашение.Давать две разные переменные буквально одинаковыми именами - это рецепт ошибок.Я предпочитаю что-то вроде: private int x; public void setX(int newX) { x=newX; }

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

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

1 голос
/ 09 марта 2010

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

1 голос
/ 28 июня 2015

this является ссылкой на текущий объект. Он используется в конструкторе, чтобы различать локальную и текущую переменную класса с одинаковым именем e.g.:

public class circle {
    int x;
    circle(int x){
        this.x =x;
        //class variable =local variable 
    }
} 

this также можно использовать для вызова одного конструктора из другого конструктора. например:

public class circle {
    int x;

    circle() { 
        this(1);
    }

    circle(int x) {
        this.x = x; 
    }
}
0 голосов
/ 05 декабря 2017

Относительно сообщений Уильяма Бренделя и dbconfessions вопроса, касающихся дела 2 . Вот пример:

public class Window {

  private Window parent;

  public Window (Window parent) {
    this.parent = parent;
  }

  public void addSubWindow() {
    Window child = new Window(this);
    list.add(child);
  }

  public void printInfo() {
    if (parent == null) {
      System.out.println("root");
    } else {
      System.out.println("child");
    }
  }

}

Я видел, как это использовалось при построении родительско-дочерних отношений с объектами. Тем не менее, обратите внимание, что для краткости это упрощено.

0 голосов
/ 09 марта 2010

Будет ли какая-то разница, если я буду использовать "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 голосов
/ 09 марта 2010

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

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

0 голосов
/ 09 марта 2010

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