Можно ли использовать «это», что означает «супер», чтобы использовать поле - PullRequest
0 голосов
/ 26 марта 2020

У меня есть класс A , который расширяет абстрактный класс B .

Пусть B имеет защищенное поле значение

Я хочу использовать это поле в A. Если A не имеет значение , я могу написать this.value чтобы получить его у Б.

Есть ли разница с super.value?

1 Ответ

3 голосов
/ 26 марта 2020

Это зависит ...

Если только класс B объявляет поле value, это не имеет значения. Но если класс A также объявит поле value, это будет иметь значение:

Посмотрите на этот пример:

public class A extends B {

  private Object value = "A";

  public void printValue() {
    System.out.println(super.value);
    System.out.println(this.value);
  }

  public static void main(String[] args) {
    A a = new A();
    a.printValue();
  }

}

Если вы запустите этот код, результат будет :

B
A

JLS говорит

Форма super. Идентификатор относится к полю с именем Идентификатор текущего объекта, но текущий объект рассматривается как экземпляр суперкласса текущего класса

Таким образом, поскольку суперкласс B объявляет поле value, на него ссылается super.value.

Относительно ключевого слова this JLS говорит :

... ключевое слово this обозначает значение, которое является ссылкой к объекту, для которого был вызван метод экземпляра или метод по умолчанию ... Тип this является классом или типом интерфейса T, в котором встречается ключевое слово this.

In В вашем случае тип this равен A. Таким образом, this.value относится к унаследованному полю value, объявленному в классе B. Но если класс A объявит поле value, то this.value будет ссылаться на поле в классе A.

...