Вопрос-ответ

What is the meaning of "this" in Java?

Что означает "это" в Java?

Обычно я использую this только в конструкторах.

Я понимаю, что он используется для идентификации переменной параметра (с помощью this.something), если у нее одно имя с глобальной переменной.

Однако я не знаю, каково реальное значение this в Java и что произойдет, если я использую this без точки (.).

Переведено автоматически
Ответ 1

this относится к текущему объекту.

Каждый нестатический метод выполняется в контексте объекта. Итак, если у вас есть класс, подобный этому:

public class MyThisTest {
private int a;

public MyThisTest() {
this(42); // calls the other constructor
}

public MyThisTest(int a) {
this.a = a; // assigns the value of the parameter a to the field of the same name
}

public void frobnicate() {
int a = 1;

System.out.println(a); // refers to the local variable a
System.out.println(this.a); // refers to the field a
System.out.println(this); // refers to this entire object
}

public String toString() {
return "MyThisTest a=" + a; // refers to the field a
}
}

Затем вызов frobnicate() on new MyThisTest() выведет

1
42
MyThisTest a=42

Настолько эффективно вы используете его для множества целей:


  • уточните, что вы говорите о поле, когда есть также что-то еще с тем же именем, что и поле

  • относится к текущему объекту в целом

  • вызовите другие конструкторы текущего класса в вашем конструкторе

Ответ 2

Следующее является копией и вставкой из здесь, но очень хорошо объясняет все различные варианты использования this ключевого слова:

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

Ниже приведены способы использования этого:


  1. Специально для обозначения того, что переменная экземпляра используется вместо статической или локальной переменной. То есть,


    private String javaFAQ;
    void methodName(String javaFAQ) {
    this.javaFAQ = javaFAQ;
    }

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



  2. this используется для ссылки на конструкторы


     public JavaQuestions(String javapapers) {
    this(javapapers, true);
    }

    Это вызывает конструктор того же класса java, который имеет два параметра.



  3. this используется для передачи текущего экземпляра java в качестве параметра


    obj.itIsMe(this);


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


    CurrentClassName startMethod() {
    return this;
    }

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



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


    Class className = this.getClass(); // this methodology is preferable in java


Хотя это можно сделать с помощью

    Class className = ABC.class; // here ABC refers to the class name and you need to know that!

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

Ответ 3

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

class Outer {
class Inner {
void foo() {
Outer o = Outer.this;
}
}
}
Ответ 4

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

public Object getMe() {
return this;
}

Распространенным вариантом использования this является предотвращение затенения. Возьмем следующий пример:

public class Person {
private final String name;

public Person(String name) {
// how would we initialize the field using parameter?
// we can't do: name = name;
}
}

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

public class Person {
private final String name;

public Person(String name) {
this.name = name;
}
}
java