Порядок вызова методов в Java

208
21 февраля 2019, 00:30

Вывод на консоль в данном случае получается FileNotFoundException. Как именно осуществляется выбор нужного метода для вызова?

public class Overload {
    public void method(Object o) {
        System.out.println("Object");
    }
    public void method(java.io.FileNotFoundException f) {
        System.out.println("FileNotFoundException");
    }
    public void method(java.io.IOException i) {
        System.out.println("IOException");
    }
    public static void main(String[] args) {
        Overload test = new Overload();
        test.method(null);
    }
}
Answer 1

If more than one member method is both accessible and applicable to a method invocation, it is necessary to choose one to provide the descriptor for the run-time method dispatch. The Java programming language uses the rule that the most specific method is chosen.

JLS 15.12.2.5

Answer 2

Компилятор выбирает метод, у которого тип параметра, вызывающего неоднозначность, наиболее конкретный (дальше от корня иерархии). В вашем примере FileNotFoundException -- потомок IOException, а IOException потомок Object (непрямой, через Exception и Throwable), т. е. крайний в дереве наследования -- FileNotFoundException -- он и будет выбран. Если классы находятся в разных ветвях иерархии наследования, будет ошибка компиляции. Попробуйте в своем примере заменить IOException на EOFException (тоже прямой потомок IOException), или FileNotFoundException на String, например -- компилятор вас не поймет.

READ ALSO
Как работает ключевое слово final?

Как работает ключевое слово final?

А ещё есть специальное ключевое слово final, и если оно присутствует в объявлении переменной, вам будет разрешено присвоить значение этой переменной...

258
java и XDTO пакет

java и XDTO пакет

Есть мобильное приложение на android с одной стороны и веб-сервис от 1с с другой стороныУже реализована передача данных из 1с в приложение

211
JPA Criteria - like запрос не работает

JPA Criteria - like запрос не работает

Получается запрос вида:

202
Почему я не могу найти конкретное выражения Java

Почему я не могу найти конкретное выражения Java

Без Pattern данные выводятся такие: USD 27827 28

160