Ответ
Для перегруженных (overloaded) методов в Java используется статическое связывание (static binding или early binding).
Почему? Компилятор определяет, какой именно перегруженный метод вызвать, на этапе компиляции. Решение принимается на основе:
- Имени метода.
- Типов и количества аргументов, указанных в вызове.
- Типа ссылки (но не фактического типа объекта в runtime).
Пример:
class Printer {
void print(int number) { // Перегрузка 1
System.out.println("Целое число: " + number);
}
void print(String text) { // Перегрузка 2
System.out.println("Строка: " + text);
}
}
public class Main {
public static void main(String[] args) {
Printer printer = new Printer();
printer.print(100); // Статическое связывание: вызов print(int)
printer.print("Текст"); // Статическое связывание: вызов print(String)
}
}
Ключевой момент: Если бы print(Object obj) был перегружен с print(String text), вызов print("Текст") все равно привязался бы к print(String) на этапе компиляции, так как это наиболее специфичный тип.