#java #oop #polymorphism #overloading #overriding
#java #ооп #полиморфизм #перегрузка #переопределение
Вопрос:
Я написал несколько примеров перегрузки метода и переопределения метода. Перегрузка метода — это статический полиморфизм, а переопределение — динамический полиморфизм.
Таким образом, любая ошибка, связанная с перегрузкой, будет обнаружена во время компиляции..Правильно? или существуют ли какие-либо сценарии, когда исключение во время выполнения генерируется из-за неправильной перегрузки — я сомневаюсь
Любые ошибки, связанные с переопределением метода (— в том случае, когда метод дочернего класса имеет то же имя, что и базовый класс, и те же аргументы, что и у базового класса —- ), будут выдаваться во время компиляции.
Существуют ли какие-либо сценарии в обоих вышеуказанных случаях, когда во время выполнения возникает исключение?
Ответ №1:
Таким образом, любая ошибка, связанная с перегрузкой, будет обнаружена во время компиляции..Правильно? или существуют ли какие-либо сценарии, когда исключение во время выполнения генерируется из-за неправильной перегрузки — я сомневаюсь
Нет, этого не должно быть, если ваш код из метода не выдает никаких исключений во время выполнения.
Любые ошибки, связанные с переопределением метода (— в том случае, когда метод дочернего класса имеет то же имя, что и базовый класс, и те же аргументы, что и у базового класса —- ), будут выдаваться во время компиляции.
Это то, что называется переопределением. если его там нет, то это может выдать ошибку во время компиляции, если вы используете @Override
Комментарии:
1. хорошо, если мой код в любом случае выдает исключение, которое не связано с перегрузкой .. kooll … Я принимаю .. Тем не менее, мой вопрос для переопределения заключается в том, есть ли у нас какая-либо вероятность исключения во время выполнения..
Ответ №2:
Я не могу представить, как перегрузка метода может вызвать исключение во время выполнения.
Некоторые сценарии, когда переопределение неправильного / неполного метода может вызвать исключения во время выполнения:
- Базовый метод является абстрактным, пока он не был реализован дочерним классом — это может произойти, когда родительский класс был перекомпилирован с добавлением нового метода, в то время как дочерний класс не был перекомпилирован (глючная отложенная компиляция или классы, расположенные в разных jar и т.д.)
- Переопределенный метод вызывается из конструктора базового класса.
- Связано с 1: базовый метод не является абстрактным, но сигнатура была изменена, в то время как дочерний класс не был перекомпилирован. Таким образом, это не вызвало ошибку компиляции и будет выполняться во время выполнения.
Комментарии:
1. @Tarlog ….. kool .. два сценария действительно имеют смысл .. Но проблемы такого рода при компиляции могут также вызывать те же проблемы с перегрузкой .. где я перегружаю дочерний класс. Теперь, когда я меняю базовый класс, скомпилируйте его, и я не скомпилирую дочерний класс — > что вы скажете?
2. Нет. Вы не можете вызвать перегруженный дочерний метод из родительского, если у вас нет абстрактного метода, но тогда он называется переопределяющим.
3. Не могу ли я перегрузить метод базового класса в дочернем классе?
4. Ну, да, вы можете. Допустим, у вас есть Base.foo (строка) и Child.foo(int), поэтому Child.foo (int) перегружен. Но что тогда? Если вы измените Base.foo(String) на Base.foo(int), они станут переопределенными. Если вы измените что-то другое, они останутся переопределенными… Ну, может быть, можно подумать о каком-то случае, когда это вызовет ошибку во время выполнения… но я не могу представить это прямо сейчас.
5. Технически переопределение метода класса называется «скрытием», и его семантика отличается от переопределения метода экземпляра.