Вопрос в том, как компилятор может узнать, какой метод вызывать во время компиляции, в случае переопределения. Вы должны это понять,
List list = list.getAList();
list.add(whatever);
Теперь предположим, что метод getAList()
может возвращать любую из нескольких реализаций List
на основе некоторых критериев. Таким образом, как компилятор может знать, что возвращена какая реализация? и какой add()
метод вызывать. Как видите, это может быть решено только во время выполнения. Принимая во внимание, что при перегрузке это не так, и все ясно во время компиляции. Я надеюсь, вы понимаете это сейчас.
[Изменено]
Приведение обсуждения в комментариях к фактическому ответу.
Это не может быть известно до времени выполнения. Поймите это следующим образом: создание экземпляра определенного класса зависит от аргумента, предоставленного пользователем. Теперь скажите мне, как компилятор будет знать, какой аргумент передается пользователем и, по-видимому, какой класс создавать. Или, проще, ответьте на этот вопрос: как компилятор узнает, будет ли поток передан в блок if
или else
? Или почему вы думаете, что мы проверили и исключения во время выполнения? Возьмите случай divide-by-zero
; например n/m
, где m
становится 0
в результате некоторого вычисления. В этом случае очевидно, что компилятор не сможет сказать, что будет ArithmeticException
, потому что m
не известен сразу. Поскольку вся эта информация недоступна во время компиляции, таким образом, компилятор, точно так же, не знает, какой метод заменит какой.