Вы правы, что и this
, и super
являются ключевыми словами. Спецификация языка Java явно определяет, как они должны вести себя. Короткий ответ: эти ключевые слова ведут себя специально, потому что в спецификации сказано, что они должны.
В соответствии со спецификацией this
может использоваться первичное выражение (только в определенных местах) или явный вызов конструктора .
Ключевое слово this может использоваться только в теле метода экземпляра, инициализатора экземпляра или конструктора или в инициализаторе переменной экземпляра класса. Если он появляется где-то еще, возникает ошибка времени компиляции.
Таким образом, вы можете использовать this
в качестве аргумента функции для передачи ссылки на текущий объект. Однако обратите внимание, что вы не можете использовать super
так же, как это не является основным выражением:
public class Program
{
void test(Program p) {}
void run() { test(super); }
public static void main(String[] args)
{
new Program().run();
}
}
Результат:
Program.java:5: '.' expected
void run() { test(super); }
Вы можете использовать super.foo
, хотя, потому что это определено в 15.11 , чтобы быть действительным:
FieldAccess:
Primary . Identifier
super . Identifier
ClassName .super . Identifier
Спецификация также устанавливает ограничения на использование super * :
Специальные формы, использующие ключевое слово super, действительны только в методе экземпляра, инициализаторе экземпляра или конструкторе или в инициализаторе переменной экземпляра класса; это точно такие же ситуации, в которых ключевое слово может использоваться (§15.8.3).