Menu
Coddy logo textTech

Основы перегрузки методов

Часть раздела Объектно-ориентированное программирование путешествия по Java на Coddy — урок 28 из 87.

Полиморфизм означает «много форм». В Java он позволяет объектам вести себя по-разному в зависимости от контекста. Одной из форм полиморфизма является перегрузка методов, также называемая полиморфизмом времени компиляции, поскольку Java определяет, какой метод вызывать, во время компиляции.

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

public class Calculator {
    public int add(int a, int b) {
        return a + b;
    }
    
    public int add(int a, int b, int c) {
        return a + b + c;
    }
    
    public double add(double a, double b) {
        return a + b;
    }
}

Когда вы вызываете add(5, 3), Java использует первый метод. Вызов add(5, 3, 2) запускает второй, а add(5.0, 3.0) вызывает третий. Компилятор выбирает нужную версию на основе предоставленных вами аргументов.

Обратите внимание, что изменение только типа возвращаемого значения не является допустимой перегрузкой. Список параметров должен отличаться:

// НЕ является допустимой перегрузкой - не скомпилируется
public int getValue() { return 1; }
public double getValue() { return 1.0; }  // Ошибка!

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

challenge icon

Задание

Легко

Давайте создадим форматировщик сообщений, который демонстрирует перегрузку методов, предоставляя несколько способов форматирования сообщений. Вы создадите вспомогательный класс с несколькими перегруженными методами format, которые обрабатывают различные сценарии ввода.

Вы организуете свой код в двух файлах:

  • MessageFormatter.java: Создайте класс, который обеспечивает гибкое форматирование сообщений с помощью перегруженных методов. Ваш форматировщик должен иметь:
    • Метод format(String message), который возвращает сообщение, заключенное в квадратные скобки: [message]
    • Метод format(String message, int repeatCount), который возвращает сообщение, повторенное указанное количество раз и разделенное пробелами
    • Метод format(String message, String prefix), который возвращает сообщение с прикрепленным префиксом: prefix: message
    • Метод format(String message, String prefix, String suffix), который возвращает: prefix: message (suffix)
    Компилятор выберет правильный метод на основе передаваемых вами аргументов — это полиморфизм времени компиляции в действии!
  • Main.java: Продемонстрируйте совместную работу всех четырех перегруженных методов. Вы получите четыре входных значения: сообщение (String), количество повторений (int), префикс (String) и суффикс (String). Создайте MessageFormatter и вызовите каждую версию метода format, выводя каждый результат на отдельной строке:
    • Во-первых, отформатируйте только с сообщением
    • Во-вторых, отформатируйте с сообщением и количеством повторений
    • В-третьих, отформатируйте с сообщением и префиксом
    • В-четвертых, отформатируйте с сообщением, префиксом и суффиксом

Вы получите четыре входных значения: текст сообщения, количество повторений, строку префикса и строку суффикса.

Например, если сообщение — "Hello", количество повторений — 3, префикс — "INFO", а суффикс — "done", ваш вывод должен показать четыре различных отформатированных версии одного и того же сообщения, каждая из которых использует свой перегруженный метод!

Шпаргалка

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

Компилятор различает перегруженные методы на основе количества, типа или порядка параметров:

public class Calculator {
    public int add(int a, int b) {
        return a + b;
    }
    
    public int add(int a, int b, int c) {
        return a + b + c;
    }
    
    public double add(double a, double b) {
        return a + b;
    }
}

При вызове add(5, 3) Java использует первый метод. Вызов add(5, 3, 2) запускает второй, а add(5.0, 3.0) вызывает третий.

Важно: Изменение только типа возвращаемого значения не является допустимой перегрузкой. Список параметров должен отличаться:

// НЕ является допустимой перегрузкой
public int getValue() { return 1; }
public double getValue() { return 1.0; }  // Error!

Попробуйте сами

import java.util.Scanner;

class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        
        // Чтение входных данных
        String message = scanner.nextLine();
        int repeatCount = Integer.parseInt(scanner.nextLine());
        String prefix = scanner.nextLine();
        String suffix = scanner.nextLine();
        
        // TODO: Создайте объект MessageFormatter
        
        // TODO: Вызовите format только с message и выведите результат
        
        // TODO: Вызовите format с message и repeatCount и выведите результат
        
        // TODO: Вызовите format с message и prefix и выведите результат
        
        // TODO: Вызовите format с message, prefix и suffix и выведите результат
        
    }
}
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Объектно-ориентированное программирование