Как супер реализовано в Java? - PullRequest
8 голосов
/ 23 февраля 2012

Где на самом деле определяется "супер"? Когда мы используем super.someMethod (). Определено ли оно как поле в классе java.lang.Object или в классе java.lang.Class?

Когда мы вызываем из подкласса, super содержит ссылку на свой суперкласс. Таким же образом супер в самом суперклассе имеет ссылку на свой суперкласс [Таким образом, вплоть до java.lang.Object]. Итак, как java внедряет ссылки на суперкласс в поле «super», что позволяет нам вызывать методы суперкласса?

Есть ли под капотом реализации, подобные следующим:

    Class current = this.getClass();
    Class parent = current.getSuperclass();
    System.out.println("name is =" + parent);

Ответы [ 5 ]

15 голосов
/ 23 февраля 2012

super как this является ключевым словом. Это имеет значение в Java, которое не отражено в байт-коде Java. Это означает реализацию моих родительских классов (которые могут быть унаследованы)

На уровне байтового кода он явно вызывает метод для своего родительского класса.

2 голосов
/ 23 февраля 2012

Это не поле - это ключевое слово языка .

Конечно, существует ссылка на суперкласс на уровне JVM, но на уровне Java вы можете получить к нему доступ только через ключевое слово. Разница в том, что вы на самом деле не можете получить доступ к методу суперкласса через ссылку - это требует специальной поддержки от компилятора. И конечно нет super.super

2 голосов
/ 23 февраля 2012

super - это ключевое слово, специфичное для ссылки на объект, которое поднимается по иерархии объектов, начиная с вызывающего объекта, до тех пор, пока не найдет объект-предок, имеющий соответствующую сигнатуру метода или свойство / поле. Обратитесь к документации Java .

1 голос
/ 23 февраля 2012

Определено ли оно как поле в классе java.lang.Object или в классе java.lang.Class?

Это вовсе не поле.

super.someMethod() - это синтаксический элемент Java, который говорит "вызовите метод, как определено в моем суперклассе".


Хорошо, предположим, что гипотетически это было полем.Каким будет его тип?К чему бы это относится?Если он был объявлен как:

Class<ParentClass> super = ... // the relevant class object.

, тогда super.someMethod() не будет работать, потому что:

  • Class не имеет пользовательских методов и
  • super.someMethod() должен быть вызовом метода экземпляра, и мы не предоставляем подходящий экземпляр.

С другой стороны, если он был объявлен как:

ParentClass super = this;

тогда super.someMethod() будет эквивалентно this.someMethod() и вызовет метод в этом классе, а не переопределенный.

0 голосов
/ 23 февраля 2012

Полагаю, он начнет карабкаться по цепочке предков, пока не найдет первый класс, в котором есть метод, который вы добавили после super. Кажется, самый простой способ. Это делается во время компиляции, если вы думаете об этом. В конце метод является просто указателем на функцию с методом вызова, который принимает рассматриваемый экземпляр (в вашем случае это this). Посмотрите Method.invoke документацию

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

...