Какой тип связывания (binding) используется для перегруженных методов в Java?

«Какой тип связывания (binding) используется для перегруженных методов в Java?» — вопрос из категории Java Core, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Для перегруженных (overloaded) методов в Java используется статическое связывание (static binding или early binding).

Почему? Компилятор определяет, какой именно перегруженный метод вызвать, на этапе компиляции. Решение принимается на основе:

  1. Имени метода.
  2. Типов и количества аргументов, указанных в вызове.
  3. Типа ссылки (но не фактического типа объекта в 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) на этапе компиляции, так как это наиболее специфичный тип.