Почему я не могу использовать переменную super из статического контекста, хотя super относится к родительскому классу, а НЕ к экземпляру класса, в отличие от этого?

Я говорю на языке Java.

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

Но «супер» при использовании внутри класса относится к суперклассу этого класса, а не к экземпляру суперкласса, что должно означать, что вы можете использовать «супер» внутри статического метода. Но оказывается, нельзя.

Возможным объяснением было бы сказать, что «супер» также относится к экземпляру суперкласса, но я не понимаю, почему это должно...


person PrashanD    schedule 01.01.2013    source источник
comment
Вам нужно принять ответы на другие ваши вопросы.   -  person Sean Owen    schedule 01.01.2013
comment
@ Шон Не знал этого. Я здесь новенький, сейчас займусь.   -  person PrashanD    schedule 01.01.2013
comment
Э, кстати, как именно я могу принимать ответы?   -  person PrashanD    schedule 01.01.2013
comment
Потому что ты ошибаешься. 'super' относится к экземпляру.   -  person user207421    schedule 02.01.2013


Ответы (5)


Вот раздел в JLS о ключевом слове super:

http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.11.2

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

Форма T.super.Identifier относится к полю с именем Identifier лексически охватывающего экземпляра, соответствующего T, но с этим экземпляром, рассматриваемым как экземпляр суперкласса T.

В обоих случаях ясно, что необходим объект-экземпляр.


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

person Sean Patrick Floyd    schedule 01.01.2013

Нет, super действительно относится к экземпляру -- тому же экземпляру, к которому относится this -- текущему объекту. Это просто способ сослаться на методы и поля, определенные в суперклассе, которые переопределены или скрыты в текущем классе.

person Sean Owen    schedule 01.01.2013
comment
Уверены ли вы? Я думал, что super относится к объекту, из которого расширяется текущий объект, который может быть создан или не создан (именно поэтому вы можете получить доступ к статическим переменным из суперкласса) - person Manidip Sengupta; 01.01.2013
comment
Что ж, кажется, super относится к экземпляру, потому что так говорит JLS. - person PrashanD; 01.01.2013
comment
НО, чтобы ответить на ваше другое беспокойство, ссылка super на экземпляр не препятствует его возможности доступа к статическим переменным суперкласса (по той же причине методы экземпляра могут обращаться к статическим переменным суперкласса - переменные экземпляра не могут быть указаны из статического контекста , но на статические переменные МОЖНО ссылаться из нестатического контекста). - person PrashanD; 01.01.2013

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

В статическом контексте вы всегда можете явно использовать имя суперкласса:

class Sub extends Base {
    static void func() {
        Base.func();
        . . .
    }
}
person Ted Hopp    schedule 01.01.2013

Super — это нестатическая переменная, и к нестатическому объекту нельзя получить доступ из статического контекста.

person Tmc    schedule 23.06.2018
comment
Это на самом деле не виариабельность, а ссылка - person Alexander; 23.06.2018

введите здесь описание изображения

 super & this are build in non-static reference keywords
 these must be accessed with the non-static methods of the childClass
person rohit.khurmi095    schedule 22.07.2021