Доступ к полю родительского класса "this.field" VS "super.field" - PullRequest
0 голосов
/ 14 февраля 2019

Я хочу узнать разницу между доступом к полям родительского класса с использованием this и super.

У нас есть следующий абстрактный класс с именем ListItem, который расширяет класс Node.

public abstract class ListItem {
        protected ListItem rightLink=null;
        abstract ListItem next();
    }

И следующий код внутри класса Node:

public class Node extends ListItem {
@Override
    ListItem next() {
        return this.rightLink;
    }

Но если мы используем код super.rightLink, я не получаю никаких ошибок во время компиляции или выполнения.Я просто хочу знать, в чем разница между обоими, и есть ли лучшая практика для выполнения задачи?

Ответы [ 2 ]

0 голосов
/ 14 февраля 2019

Объяснение

Неважно , в этом случае , разницы нет.

Поле объявлено в родительском классе.Так что технически 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текущего объекта, но с текущим объектом , рассматриваемым как экземпляр суперкласса текущего класса.

0 голосов
/ 14 февраля 2019

Если rightLink не помечено как частное, оно будет доступно во всех классах, производных от ListItem.Таким образом, вызовы super.rightLing и this.rightLink будут эквивалентны.

Как правило, super относится к базовому классу, а this относится к классу, в котором вы находитесь. Используйте их приблизительно.

Обычно используется при переопределении методов, например

@Override
public void DoSomething(){
  // Execute base imlpementation of a method
  super.DoSomething();
  // some additional code to add extra functionality to base class
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...