Основы перегрузки методов
Часть раздела Объектно-ориентированное программирование путешествия по 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; } // Ошибка!Вы уже сталкивались с перегрузкой ранее на примере перегрузки конструкторов. Перегрузка методов следует тем же правилам и обеспечивает гибкость, позволяя одному имени метода обрабатывать различные сценарии входных данных.
Задание
ЛегкоДавайте создадим форматировщик сообщений, который демонстрирует перегрузку методов, предоставляя несколько способов форматирования сообщений. Вы создадите вспомогательный класс с несколькими перегруженными методами 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 и выведите результат
}
}
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Объектно-ориентированное программирование
1Основы ООП
Внешние файлыВведение в ООПКлассы и объектыКлючевое слово thisМетодыПоля (атрибуты)Метод-конструкторПерегрузка конструкторовИтоги — Простой калькулятор4Наследование
Основы наследования (extends)Ключевое слово superПереопределение методов (@Override)Цепочка конструкторовКласс ObjectОдиночное и многоуровневое наследованиеПочему нет множественного наследования классовИтоги — Иерархия сотрудников7Специальные методы и класс Object
Метод toString()equals() и hashCode()Метод clone()compareTo() и ComparableИнтерфейс ComparatorПовторение — Кастомная сортировка2Модификаторы доступа и инкапсуляция
Обзор уровней доступаМетоды геттеры и сеттерыСокрытие данныхКлючевое слово finalИтоги — Менеджер банковского счета5Полиморфизм
Основы перегрузки методовПереопределение методов (Run-Time)Upcasting и DowncastingОператор instanceofАбстрактные классы и методыИтоги: Калькулятор фигур8Продвинутые концепции ООП
Композиция против наследованияАгрегация против композицииВнутренние, вложенные и анонимные классыEnums и методы перечисленийRecords (Java 16+)Sealed-классы (Java 17+)11Паттерны проектирования. Часть 1
Введение в паттерны проектированияПаттерн SingletonПаттерн FactoryПаттерн BuilderПаттерн ObserverПаттерн Strategy3Свойства класса и статические члены
Переменные экземпляра и статические переменныеСтатические методыСтатические блокиКонстанты (static final)Итоги: Счетчик и утилиты6Интерфейсы и абстрактные классы
Введение в интерфейсыРеализация интерфейсовРеализация нескольких интерфейсовDefault и Static методы в интерфейсахАбстрактные классы vs ИнтерфейсыФункциональные интерфейсыИтоги — Платежная система9Обобщения
Введение в обобщенияОбобщенные классыОбобщенные методыОграниченные параметры типаСимволы подстановки (Wildcards: ?, extends, super)Итоги — Обобщенный контейнер12Паттерны проектирования. Часть 2
Паттерн «Команда»Паттерн «Адаптер»Паттерн «Декоратор»Паттерн «Шаблонный метод»Паттерн «Состояние»Паттерн «Компоновщик»Паттерн «Итератор»