Не вдаваясь в подробности (которые вы можете прочитать так же хорошо в спецификации, как и здесь), введение дает хорошее резюме:
Если более одного метода-члена доступны и применимы к вызову метода, необходимо выбрать один, чтобы предоставить дескриптор для отправки метода во время выполнения. Язык программирования Java использует правило, согласно которому выбирается наиболее конкретный метод.
Неформальная интуиция заключается в том, что один метод более специфичен, чем другой, если любой вызов, обработанный первым методом, может быть передан другому без ошибки типа во время компиляции.
Ответ 2
В вашем конкретном случае будет вызван более конкретный метод. В целом, однако, есть некоторые случаи, когда сигнатура метода может быть неоднозначной. Рассмотрим следующее:
privatevoidtestNullArgument( Object o ) { System.out.println("An Object was passed..."); }
privatevoidtestNullArgument( Integer i ) { System.out.println("An Integer was passed..."); }
privatevoidtestNullArgument( String s ) { System.out.println("A String was passed..."); } }
В этом случае компилятор не может выбрать между методом, который принимает целое число, и методом, который принимает строку. Когда я пытаюсь это скомпилировать, я получаю
reference to testNullArgument is ambiguous, both method testNullArgument(java.lang.Integer) in testnullargument.Main and method testNullArgument(java.lang.String) in testnullargument.Main match
Ответ 3
Ни то, ни другое. Вы получите сообщение об ошибке компилятора с просьбой уточнить, какой метод вы хотите вызвать. Вы можете сделать это, явно приведя первый аргумент.:
Обновление Я должен был знать - никогда не сомневайтесь в Джоне Ските. Проблема, о которой я упоминал выше, возникает только тогда, когда невозможно определить, какой метод более специфичен. Вот тестовый пример.: