Я знаю это this
относится к текущему объекту. Но я не знаю, когда я действительно должен использовать его. Например, будет ли любое различие, если я буду использовать x
вместо this.x
в некоторых методах? Может быть x
будет относиться к переменной, которая локальна для продуманного метода? Я имею в виду переменную, которая замечена только в этом методе.
Что относительно this.method()
? Я могу использовать его? Если я использую его. Если я просто использую method()
, разве к этому не будут, по умолчанию, относиться текущий объект?
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
.
Что касается использования его с методом, вы правы насчет эффектов; вы получите те же результаты с ним или без него. Вы можете это использовать? Конечно. Стоит ли его использовать? На ваше усмотрение, но, учитывая то, что я лично считаю это бессмысленным многословием, которое не добавляет ясности (если код не забит статическими операторами импорта), я не склонен использовать его сам.
Ключевое слово 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
}
}
Я также видел это
, используемое, чтобы подчеркнуть тот факт, что на переменную экземпляра ссылаются (без необходимости устранения неоднозначности), но, на мой взгляд, это редкий случай.
Чтобы убедиться, что используются элементы текущего объекта. В случаях, когда безопасность потоков является проблемой, некоторые приложения могут изменять неправильные значения членов объекта, по этой причине это должно быть применено к члену, чтобы использовалось правильное значение члена объекта.
Если ваш объект не заботится о безопасности потоков, то нет причин указывать, какое значение члена объекта используется.
Если у вас нет перекрывающихся имен переменных, это просто для ясности при чтении кода.
когда есть две переменные, одна переменная экземпляра и другая локальная переменная с тем же именем, мы используем это. для ссылки на текущий исполняемый объект, чтобы избежать конфликта между именами.
Второе важное использование 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;
}
}
}
«это» также полезно при вызове одного конструктора из другого:
public class MyClass {
public MyClass(String foo) {
this(foo, null);
}
public MyClass(String foo, String bar) {
...
}
}
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
}
Единственное, что нужно , , чтобы использовать this. Квалификатор
- это когда другая переменная в текущей области имеет то же имя, и вы хотите сослаться на член экземпляра (как описывает Уильям). Кроме того, нет никакой разницы в поведении между x
и this.x
.
Будет ли разница, если я использую «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 ()
уточняет, что вызов сделан этим объектом.
Вам нужно использовать только this
- и большинство людей используют его только - когда есть перекрывающаяся локальная переменная с тем же именем. (Например, методы установки.)
Конечно, еще одна веская причина для использования this
заключается в том, что он вызывает всплывающее окно intellisense в среде IDE:)