Что такое перегрузка методов в ООП?

Ответ

Перегрузка методов (method overloading) — это возможность языка определять несколько методов в одной области видимости (например, в одном классе) с одинаковым именем, но разными параметрами (сигнатурами). Нужный метод выбирается компилятором на основе количества, типа и порядка аргументов при вызове.

Ключевые принципы:

  • Перегружаемые методы должны отличаться сигнатурой параметров (типы, количество, порядок).
  • Возвращаемый тип не учитывается при перегрузке.
  • Модификаторы доступа могут быть разными.
  • Можно перегружать как обычные методы, так и конструкторы.

Пример на Java:

public class MathUtils {
    // Перегрузка по типу параметров
    public int add(int a, int b) {
        return a + b;
    }
    public double add(double a, double b) {
        return a + b;
    }
    // Перегрузка по количеству параметров
    public int add(int a, int b, int c) {
        return a + b + c;
    }
    // Перегрузка с varargs
    public int sum(int... numbers) {
        int total = 0;
        for (int num : numbers) {
            total += num;
        }
        return total;
    }
}
// Использование:
MathUtils utils = new MathUtils();
System.out.println(utils.add(5, 10));      // Вызовет int-версию
System.out.println(utils.add(5.5, 2.3));   // Вызовет double-версию
System.out.println(utils.sum(1, 2, 3, 4)); // Использует varargs

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

Ответ 18+ 🔞

Смотри, вот эта штука — перегрузка методов — это вообще, блядь, гениальная простота, когда её понимаешь. Представь себе, у тебя есть один чувак-метод, но он, сука, такой разносторонний, как наш Герасим, только не немой и не топит собак. Ему можно давать разную работу, и он справится, потому что у него, блядь, несколько лиц!

Суть, если по-простому, ёпта: Ты пишешь в одном классе кучу методов с одинаковым именем, но, внимание, с разной начинкой в скобках — это и есть сигнатура. Компилятор, хитрая жопа, смотрит, какие аргументы ты ему суёшь при вызове, и сам решает, какую именно версию метода запускать. Красота!

Главные правила, которые надо запомнить, а то будет пиздец:

  • Менять надо ТОЛЬКО параметры (тип, количество, порядок). Всё!
  • Тип возвращаемого значения — похуй. Нельзя перегрузить метод, если разница только в том, что он возвращает int или String. Компилятор тебе сразу: «Иди нахуй, я откуда знаю, какую ты хочешь?».
  • Модификаторы доступа (public, private) могут быть какие угодно, это не ломает перегрузку.
  • Конструкторы — это те же методы, их тоже можно перегружать до овердохуища, чтобы объекты создавать по-разному.

Смотри, как это выглядит в жизни, на примере этого... MathUtils:

public class MathUtils {
    // Версия для целых чисел — классика, два инта
    public int add(int a, int b) {
        return a + b;
    }
    // А это для дробных, чтобы не терять точность, блядь
    public double add(double a, double b) {
        return a + b;
    }
    // Опа, а тут чувак уже на троих работает! Перегрузка по количеству.
    public int add(int a, int b, int c) {
        return a + b + c;
    }
    // А это вообще раздолбай-версия: "Давай сюда сколько угодно чисел, я всё сложу!"
    public int sum(int... numbers) {
        int total = 0;
        for (int num : numbers) {
            total += num;
        }
        return total;
    }
}
// Как этим пользоваться:
MathUtils utils = new MathUtils();
System.out.println(utils.add(5, 10));      // Видит два инта — вызывает первую версию
System.out.println(utils.add(5.5, 2.3));   // Видит два дабла — включает вторую версию
System.out.println(utils.sum(1, 2, 3, 4)); // Видит кучу всего — отдаёт varargs-методу

Зачем это всё, спросишь? Да чтобы не выдумывать, блядь, кучу имён вроде addInts, addDoubles, addThreeInts. Одно имя — add — и всем понятно, что происходит. Код становится чище, как после хорошей уборки. Читаешь utils.add(...) и сразу ясно: тут что-то складывают. А что именно — Java сама разберётся, ей, блять, за это деньги платят!