См. ответ для аналогичного вопроса .
См. JLS 15.12.2 :
[...] Может быть более одного такого объявления метода, и в этом случае выбирается наиболее конкретное.
Итак, чтобы ответить на ваш вопрос.Когда несколько перегруженных методов применимы к определенному типу, вызывается наиболее специфический или, если хотите, метод «upcast».
С интуитивной точки зрения это также имеет смысл.Когда вы заявляете:
public void handler(MyException ex) {...}
Вы говорите: «Я знаю, как обращаться с генералом MyException
».
А когда вы заявляете:
public void handler(MyUrgentException ex){...}
Вы говорите: «Я знаю, как обращаться с конкретным случаем MyUrgentException
», и, следовательно, также с общим случаем MyException
.