Перейти к содержанию
Educora
Начальный16 мин6 / 18

Методы

Разбивай код на повторно используемые методы: параметры, возвращаемое значение, void, static, перегрузка и рекурсия.

Проверь себя
В этом уроке ты узнаешь
  • Писать и вызывать static-метод с параметрами и возвращаемым значением
  • Использовать перегрузку методов
  • Объяснять, что в Java аргументы передаются по значению

Представь, что площадь комнаты нужно вычислять в десяти местах программы. Если написать одну и ту же формулу десять раз, то для исправления одной ошибки придётся править десять мест. Метод — это именованный блок кода: его пишут один раз и вызывают сколько угодно. Один метод ты уже знаешь — main.

Устройство метода

Java
public class Main {
    static void greet(String name) {
        System.out.println("Hello, " + name + "!");
    }

    static double area(double width, double height) {
        return width * height;
    }

    static boolean isEven(int n) {
        return n % 2 == 0;
    }

    public static void main(String[] args) {
        greet("Aysel");
        greet("Murad");
        double room = area(4.5, 3);
        System.out.println("Room area: " + room);
        System.out.println(isEven(10) + " " + isEven(7));
    }
}
Ожидаемый результат
Hello, Aysel!
Hello, Murad!
Room area: 13.5
true false
  • static означает, что метод принадлежит классу и его можно вызвать, не создавая объект. С методами объектов ты познакомишься в следующем модуле.
  • Возвращаемый тип (void, double, boolean) показывает, что возвращает метод. void означает «ничего не возвращает».
  • Параметры в скобках — входные данные метода; у каждого есть тип и имя. Конкретные значения, передаваемые при вызове, называются аргументами.
  • return возвращает результат в место вызова и сразу завершает метод.

Обрати внимание: в вызове area(4.5, 3) число 3 целое, но параметр имеет тип double — Java автоматически расширит его до 3.0. Имена методов, возвращающих boolean, обычно начинаются с is или has: isEven, hasTicket.

Перегрузка и класс Math

В Java может быть несколько методов с одним именем — если их списки параметров различаются (количеством или типами). Это называется перегрузкой методов (overloading). Компилятор выбирает нужный вариант по аргументам. Одного лишь другого возвращаемого типа для этого недостаточно.

Java
public class Main {
    static int max(int a, int b) {
        return a > b ? a : b;
    }

    static double max(double a, double b) {
        return a > b ? a : b;
    }

    static int max(int a, int b, int c) {
        return max(max(a, b), c);
    }

    public static void main(String[] args) {
        System.out.println(max(3, 9));
        System.out.println(max(2.5, 1.5));
        System.out.println(max(4, 11, 7));
        System.out.println(Math.max(5, 8) + " " + Math.sqrt(49) + " " + Math.pow(2, 10) + " " + Math.abs(-3));
    }
}
Ожидаемый результат
9
2.5
11
8 7.0 1024.0 3

Аргументы передаются по значению

При вызове метода Java копирует значение аргумента в параметр. Поэтому изменение параметра типа int внутри метода не влияет на переменную вызывающего кода. А у массивов и объектов копируется не сам объект, а ссылка на него — по этой ссылке метод может изменить элементы того же самого массива.

Java
public class Main {
    static void tryToChange(int x, int[] arr) {
        x = 100;
        arr[0] = 100;
    }

    public static void main(String[] args) {
        int number = 1;
        int[] numbers = {1, 2, 3};
        tryToChange(number, numbers);
        System.out.println(number);
        System.out.println(numbers[0]);
    }
}
Ожидаемый результат
1
100

Рекурсия и переменное число аргументов

Метод может вызывать и сам себя — это называется рекурсией. У каждого рекурсивного метода должно быть условие остановки, иначе вызовы будут продолжаться бесконечно и программа упадёт с StackOverflowError. А запись int... values позволяет передать методу любое количество аргументов; внутри метода они выглядят как массив.

Java
public class Main {
    static int factorial(int n) {
        if (n <= 1) {
            return 1;
        }
        return n * factorial(n - 1);
    }

    static int sum(int... values) {
        int total = 0;
        for (int v : values) {
            total += v;
        }
        return total;
    }

    public static void main(String[] args) {
        System.out.println(factorial(5));
        System.out.println(sum(1, 2, 3));
        System.out.println(sum(10, 20, 30, 40));
        System.out.println(sum());
    }
}
Ожидаемый результат
120
6
100
0
Как вычисляется factorial(5)?

Проследи по шагам вызов factorial(5) рекурсивного метода factorial.

Показать решение
factorial(5) = 5 · factorial(4)
factorial(4) = 4 · factorial(3)
factorial(3) = 3 · factorial(2)
factorial(2) = 2 · factorial(1)
factorial(1) = 1 — условие остановки.
Теперь возвращаемся обратно: 2 · 1 = 2, 3 · 2 = 6, 4 · 6 = 24, 5 · 24 = 120.

Главное

  • Метод — именованный блок кода: пишется один раз, вызывается много раз.
  • Заголовок задаёт возвращаемый тип, имя и параметры; void ничего не возвращает, другие типы требуют return.
  • Перегрузка: у методов с одинаковым именем должны различаться списки параметров.
  • Java передаёт аргументы по значению; для массивов и объектов копируется ссылка.
  • У рекурсивного метода обязательно должно быть условие остановки.

Проверь себя

Вопросов: 10. Каждый правильный ответ приносит XP.

1 / 10
Что означает возвращаемый тип void?