this
и super
- это не ключевые слова; то как я могу использовать их для передачи аргументов конструкторам так же, как с помощью метода? Вкратце, как получается, что оба могут проявлять такое четкое поведение?это и супер в java
ответ
Вы считаете, что оба слова this
и super
являются ключевыми словами. Java language specification четко определяет, как они должны себя вести. Короткий ответ заключается в том, что эти ключевые слова ведут себя специально, потому что спецификация говорит, что они должны.
В соответствии со спецификацией this
может использоваться primary expression (только в определенных местах) или в explicit constructor invocation.
Ключевое слово 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
спецификация также ставит restrictions on how super can be used:
Специальные формы с использованием ключевого слова super действительны только в методе экземпляра, инициализаторе экземпляра или конструкторе или в инициализаторе переменной экземпляра класса; это точно такие же ситуации, когда ключевое слово это может быть использовано (§15.8.3).
+1 для упоминания про передачу этого аргумента и того же, что не применимо для супер – Sandeep
Я не совсем уверен, что вы просите здесь, но это так, как язык разработан. Компилятор знает, что когда вы делаете это в конструкторе:
super("I'm a string!", 32);
он должен найти конструктор суперкласса, который принимает строку и Int в качестве параметров.
Язык Java обеспечивает определенную обработку этих двух ключевых слов, и они разрешены в ограниченных контекстах.
Вызов этого (...) приведет к байт-коду, который вызовет соответствующий конструктор текущего класса, в то время как вызов super (...) приведет к байт-коду, который вызовет соответствующий конструктор в супертипе.
Java обеспечивает специальную обработку для них, потому что их привязка отличается от привязки обычных методов (т., вы хотите избежать динамического вызова, или вам никогда не удастся получить конструктор над супертипом).
Каждый язык должен решить эту проблему. Например, в C++ вы явно указываете имя родительского метода вместо использования супер.
Из вашего подкласса вы можете передать переменные, предоставленные вашему родителю. Примерами могут служить лучше, чем длинные объяснения, так вот довольно общий пример расширения класса Exception для собственного использования:
public class MyException extends Exception {
public MyException()
{
}
public MyException(String message)
{
super(message);
}
public MyException(String string, Throwable e)
{
super(string, e);
}
}
как получается, что они могут показать такие различные модели поведения
вопрос не имеет смысла. Все ключевые слова имеют четкое поведение. Для этого они нужны.
Я не уверен, в чем сомнения. Это this
относится к ссылке на текущий экземпляр, также при вызове как this(arg)
он вызывает соответствующий constructor
в текущем class
. Аналогично, когда super()
называется, он называет соответствующий номер constructor
в классе super
. Их можно назвать только от constructor
.
- 1. это и супер-слова в конструкторах Java
- 2. взаимозаменяемости супер и это
- 3. «это» и «супер» использование ключевых слов в Java
- 4. "Супер" и "это" на DefaultTableModel
- 5. Java равно супер и подклассов
- 6. JAVA - класс и объект, супер
- 7. Супер конструктор в Java
- 8. Java GetClass и супер классы
- 9. конструкторы между супер и подклассами в java
- 10. Супер ключевое слово в java и многопоточность
- 11. Использование этого и супер в Java
- 12. Java дженериков: коллекция супер супер некоторого типа
- 13. Java, скрывая методы супер супер класса
- 14. Это и использование супер ключевых слов в android
- 15. неявный супер-интерфейс в Java?
- 16. как понять супер в Java
- 17. Работа с супер в Java
- 18. Почему это не печатает «супер»?
- 19. Как использовать это перед супер?
- 20. Generic супер класс в Java
- 21. Как супер реализовано в Java?
- 22. Супер конструктор в подклассе - Java
- 23. Использование "супер" с "?" в Java
- 24. Вызов супер метода в Java
- 25. «Супер» ключевое слово в Java
- 26. Java наследование супер
- 27. Вызов супер в конструкторах Java
- 28. супер защищенной Java
- 29. Рекурсивные и супер простые числа Java
- 30. Наследование Java супер класс и тип литья
надеюсь, что я смогу переложить его на ... – abson