Является ли перегрузка методов (overloading) частью полиморфизма в ООП?

Ответ

Да, перегрузка методов (method overloading) является формой статического (compile-time) полиморфизма.

Что такое перегрузка? Это возможность определять несколько методов в одной области видимости с одинаковым именем, но разными параметрами (тип, количество или порядок).

Пример:

class MathUtil {
    // Перегруженные методы add
    static int add(int a, int b) {
        return a + b;
    }
    static double add(double a, double b) {
        return a + b;
    }
    static int add(int a, int b, int c) {
        return a + b + c;
    }
}
// Использование:
int sum1 = MathUtil.add(5, 10);       // Вызовется add(int, int)
double sum2 = MathUtil.add(5.5, 2.3); // Вызовется add(double, double)

Ключевые характеристики статического полиморфизма через перегрузку:

  • Разрешение на этапе компиляции: Компилятор однозначно определяет, какой метод вызвать, на основе сигнатуры (имя + аргументы).
  • Не зависит от типа объекта времени выполнения.
  • Возвращаемый тип не учитывается при перегрузке (два метода с одинаковыми параметрами, но разным возвращаемым типом, приведут к ошибке компиляции).

Контраст с динамическим полиморфизмом:

  • Перегрузка (Static Polymorphism): Решение принимает компилятор. Один класс, много методов с одним именем.
  • Переопределение (Dynamic Polymorphism / Overriding): Решение принимает JVM во время выполнения (runtime). Родительский класс и подклассы, один метод, разная реализация.

Ответ 18+ 🔞

Вот, блядь, смотри, что за магия случается, когда ты пишешь код. Есть такая штука — перегрузка методов. Это, по сути, статический полиморфизм, ёпта. Компиляторный, на этапе сборки.

А че это вообще такое? Ну, представь, ты можешь наделать кучу методов с одним и тем же именем в одном классе. И ничего, не взорвётся! Главное, чтобы у них были разные параметры — либо типы другие, либо количество, либо порядок. Вот и вся хитрость, хитрая жопа.

Смотри, как это выглядит вживую:

class MathUtil {
    // Три одинаковых имени, но внутри — разное говно
    static int add(int a, int b) {
        return a + b;
    }
    static double add(double a, double b) {
        return a + b;
    }
    static int add(int a, int b, int c) {
        return a + b + c;
    }
}
// А вот как это юзать:
int sum1 = MathUtil.add(5, 10);       // Сработает add(int, int)
double sum2 = MathUtil.add(5.5, 2.3); // А вот тут уже add(double, double)

Что тут важно понять, чтобы не облажаться:

  • Всё решается на этапе компиляции: Компилятор, этот дотошный зануда, смотрит на то, какие аргументы ты суёшь в метод, и сам решает, какую именно версию запускать. Это и есть статический полиморфизм, блядь.
  • Тип объекта в рантайме — похуй. Ему главное — что в скобках написано прямо сейчас.
  • Возвращаемый тип — нихуя не решает! Нельзя сделать два метода с абсолютно одинаковыми параметрами, но разными return. Компилятор тебе мозги выест ошибкой, вот и весь сказ, в рот меня чих-пых.

А чем это не переопределение? Вот тут, блядь, часто путаница, овердохуища!

  • Перегрузка (Статика): Один класс, много методов с одним именем. Компилятор разбирается. "Я сам знаю, что ты хотел!" — говорит он.
  • Переопределение (Динамика, Overriding): Тут уже родительский класс и его детишки. Один метод объявлен у родителя, а реализация — у каждого своя, в подклассах. А кто конкретно вызовется — JVM решает уже во время работы программы, в рантайме. Вот это уже настоящие гонки, ёперный театр!