Объяснение
Неважно , в этом случае , разницы нет.
Поле объявлено в родительском классе.Так что технически super.rightLink
имеет смысл.Однако super
и this
имеют отношение только к разрешению неоднозначных ситуаций с изменением затенения.
Лучшим в этом случае будет исключить любой префикс и просто набрать rightLink
,Но это немного основано на мнениях.
Пример
Предположим, у нас есть следующее
public class Parent {
int variable = 1; // Field
}
public class Child extends Parent {
int variable = 2; // Field
public void foo() {
int variable = 3; // Local variable
System.out.println(variable); // 3
System.out.println(this.variable); // 2
System.out.println(super.variable); // 1
}
}
Углубленное
Таким образом, у нас есть ситуация с 3 разными переменными, которые все живут в разных областях, но имеют одинаковое имя.Когда вы просто наберете variable
, Java будет ссылаться на переменную с самой низкой областью действия.Который будет локальной переменной в методе.Если вы хотите получить доступ к своему полю, вам нужно сделать this.variable
.Если вы хотите получить доступ к полю вашего родителя, вам нужно сделать super.variable
.
Итак, у нас есть три разные переменные.
- без префикса : самая низкая область
this
: поле с самой низкой областью super
: поле с самой низкой областью, начиная с прямого родителя
В вашемконкретный пример, однако, у нас вообще нет теневого имени.Существует только одна переменная с именем rightLink
.Таким образом, все три варианта относятся к одной и той же переменной.
Лучше всего в этом случае вообще не использовать префикс, просто rightLink
.
JLS
Давайте посмотрим, как спецификация языка Java определяет this.
и super.
.
Для this.
см. JLS§15.8.3 :
При использовании в качестве основного выражения ключевое слово this
обозначает значение, которое является ссылкой на объект , для которого был вызван метод экземпляра или метод по умолчанию ( §15.12 ) или объекту, который строится.Значение, обозначаемое этим в лямбда-теле, совпадает со значением, обозначенным этим в окружающем контексте.
Для super.
см. JLS§15.11.2 :
Форма super.Identifier
относится к полю с именем Identifier
текущего объекта, но с текущим объектом , рассматриваемым как экземпляр суперкласса текущего класса.