Перегрузка в Java
Положите в один класс два метода с именем paint. Один заголовок — static void paint(String word). Другой — static void paint(int n). Тела короткие: первое печатает word, второе печатает n. Из main вызовите paint("ok");, затем paint(3);. Экран должен показать две строки: сначала ok, потом 3. Java не считает второй paint конфликтом. Она видит два заголовка как разные методы, потому что списки параметров различаются. Общее имя с разными списками — то, чему учит эта страница.
Одно имя, разные списки
До сих пор каждая новая идея брала свежее имя метода: ring, greet, twice. Здесь имя специально остаётся paint. Меняется то, что стоит между скобками. Один список держит String. Другой держит int. Компилятор сохраняет оба, потому что списки не одинаковы.
Создайте небольшой файл программы Sign.java. Строка public class в начале должна совпадать с именем файла: public class Sign. Не оставляйте старое имя класса Box или Tip в этом файле; компилятор ждёт совпадения имени класса и имени файла.
Вне main, но всё ещё внутри фигурных скобок класса, напишите оба заголовка paint. На этой странице оставьте void: каждое тело печатает, и ничего не нужно возвращать в main через return. Первое тело использует System.out.println(word);. Второе — System.out.println(n);. Сохраните файл перед компиляцией. Полная первая программа — в следующем блоке.
Sign.java с двумя методами paint
Это версия, которую вы компилируете первой. В main два вызова. В классе два метода paint с одним именем.
public class Sign {
public static void main(String[] args) {
paint("ok");
paint(3);
}
static void paint(String word) {
System.out.println(word);
}
static void paint(int n) {
System.out.println(n);
}
}
Из папки, где лежит Sign.java, выполните javac Sign.java. Когда скобки, фигурные скобки и точки с запятой совпадают, javac не пишет своей строки. Затем выполните java Sign — не java Sign.java. Уберите окончание .java во второй команде. Те же две команды работают в Windows и macOS. Программа должна напечатать две строки и остановиться: ok, затем 3. Она не должна ждать ввода. Если терминал ждёт клавиатуру, в файле ещё остался вызов nextLine из старого упражнения. Удалите его и оставьте два вызова paint плюс два метода paint выше.
Пройдите запуск один раз по порядку. Java начинает с main. Первый вызов — paint("ok"). Аргумент — String, поэтому Java выполняет тело, которое принимает String word, и печатает ok. Второй вызов — paint(3). Аргумент — int, поэтому Java выполняет тело, которое принимает int n, и печатает 3. Имя paint оба раза одно. Список в скобках выбирает тело.
Если обе строки показывают ok, возможно, вы оставили только метод String и печатали фиксированное слово на каждый вызов. Если обе показывают 3, возможно, остался только метод int. Держите оба заголовка. Если javac сообщает, что paint уже определён, проверьте, не одинаковы ли списки у обоих заголовков — например две копии paint(String word). Перегрузке нужна настоящая разница в списке, а не вторая копия того же заголовка только с другим именем параметра.
Второй список с двумя словами
Число параметров тоже может отличаться. Добавьте третью перегрузку, которая принимает два значения String и печатает их в одной строке через пробел. Оставьте первые два метода paint на месте. Вызовите новую форму из main после прежних вызовов или начните свежий main, сосредоточенный на этой форме, пока вы её учите.
public class Sign {
public static void main(String[] args) {
paint("hi", "sam");
}
static void paint(String a, String b) {
System.out.println(a + " " + b);
}
}
После сохранения снова скомпилируйте и запустите: javac Sign.java, затем java Sign. Экран должен показать одну строку: hi sam. В вызове два аргумента. У метода два параметра. Этого совпадения достаточно, чтобы Java выбрала это тело. Если у вас ещё есть прежние paint(String word) и paint(int n) в том же классе, можете их оставить. Вызов с двумя значениями String не выбирает одноаргументный метод String, потому что количества различаются.
Когда для практики вы положите все три перегрузки в один файл, main может вызывать каждую форму в своей строке. Вызов с одним String по-прежнему идёт в paint(String word). Вызов с одним int — в paint(int n). Вызов с двумя String — в paint(String a, String b). Общее имя не стирает эти различия.
Пустой список рядом со списком String
Метод с пустыми скобками тоже другой список. Можно держать paint() без параметров рядом с paint(String word). Пустой вызов paint(); запускает тело с пустым списком. Вызов paint("go"); запускает тело String.
public class Sign {
public static void main(String[] args) {
paint();
paint("go");
}
static void paint() {
System.out.println("ready");
}
static void paint(String word) {
System.out.println(word);
}
}
После javac Sign.java и java Sign экран должен показать ready в первой строке и go во второй. В первом вызове между скобками ничего нет, поэтому он подходит к paint(). Второй передаёт String, поэтому подходит к paint(String word). Переименование одного в paintReady тоже скомпилируется, но это другой навык. Эта страница сохраняет имя paint и даёт спискам нести разницу.
Какой вызов запускает какой заголовок
Читайте вызовы рядом с заголовками. Список аргументов в вызове должен совпадать со списком параметров в заголовке. В этой форме для начинающих важны и тип, и количество.
📊 call beside matching paint
| Вызов в main | Заголовок, который работает | Строка экрана |
|---|---|---|
paint("ok"); |
paint(String word) |
ok |
paint(3); |
paint(int n) |
3 |
paint("hi", "sam"); |
paint(String a, String b) |
hi sam |
paint(); |
paint() |
ready |
Частая путаница — написать два метода, оба с paint(String word), и ждать, что второй станет перегрузкой. Смена только имени параметра на paint(String label) не создаёт новый список для компилятора. Здесь важны тип и количество. Другая путаница — вызвать paint(true), когда вы никогда не писали список параметров boolean. Тогда javac не находит подходящий paint. Добавьте заголовок нужного типа или измените вызов на тип, который уже поддерживаете.
Запись System.out.println("paint"); в main печатает слово paint. Она не вызывает метод. Оставляйте paint("ok");, когда нужна перегрузка с String. Оставшийся twice из старого файла Box в Sign.java может запутать экран, если main всё ещё печатает twice(7). Очистите main до вызовов paint, которые вы проверяете, и оставьте только нужные для этого запуска перегрузки paint.
Не вкладывайте метод paint внутрь фигурных скобок main. Методы живут в классе рядом с main. Две перегрузки — два соседних метода в том же теле класса.
Перед scope
Вы можете держать одно имя метода и несколько списков параметров в одном классе. Java выбирает тело по списку аргументов вызова. Экран показывает строку подходящего тела. Два заголовка с одним списком — не перегрузки. Следующая страница — scope; там вы увидите, какие имена видны внутри метода, а какие остаются снаружи.
🧠 Проверьте Свои Знания
Проверьте Свои Знания
Бросьте себе вызов с помощью этой интерактивной викторины и узнайте, насколько хорошо вы понимаете тему
📝 Инструкции
- Внимательно прочитайте каждый вопрос
- Выберите лучший ответ на каждый вопрос
- Вы можете пересдавать тест столько раз, сколько захотите
- Ваш прогресс будет показан вверху