Методы

Базовый Java
≈ 3 мин чтения

Зачем нужны методы

Когда одна и та же последовательность действий нужна несколько раз, копировать её по программе неудобно. Метод позволяет дать этому действию имя, вынести код в отдельный блок и вызывать его там, где он нужен.

static void printGreeting() {
    System.out.println("Привет!");
}

printGreeting();
printGreeting();

Код внутри printGreeting() описан один раз, но выполнить его можно сколько угодно раз. Так программа становится короче, а смысл отдельных действий заметнее.

static пока воспринимай как часть формы примера. Он нужен здесь, чтобы такие методы можно было использовать рядом со знакомым main. Сам модификатор будет разобран позже.

Объявление и вызов метода

В простом объявлении метода указываются тип результата, имя, круглые скобки и тело в фигурных скобках. Если метод ничего не возвращает, вместо типа результата пишут void.

static void sayHello() {
    System.out.println("Hello");
}

Это только объявление: оно говорит Java, что должен делать метод. Чтобы код внутри выполнился, метод нужно вызвать:

sayHello();

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

Параметры и аргументы

Метод может получать данные снаружи. В объявлении для этого задаются параметры — переменные, которые доступны внутри метода.

static void printSum(int a, int b) {
    System.out.println(a + b);
}

При вызове вместо параметров передаются конкретные значения — аргументы:

printSum(4, 7);
printSum(10, 20);

Один и тот же метод работает с разными данными. Количество и типы аргументов должны подходить параметрам метода.

Возвращаем результат

Часто метод должен не печатать ответ сам, а вычислить значение и отдать его вызывающему коду. Тогда вместо void указывается тип результата, а значение возвращается через return.

static int square(int number) {
    return number * number;
}

int result = square(5);
System.out.println(result);

У square() тип результата int, поэтому результат вызова можно сохранить в переменную типа int или сразу использовать в выражении.

return завершает текущий вызов метода. Код этого метода после выполненного return уже не выполняется.

Локальные переменные

Параметры и переменные, объявленные внутри метода, принадлежат этому вызову метода. Снаружи обратиться к ним по имени нельзя.

static int doubleNumber(int number) {
    int result = number * 2;
    return result;
}

Здесь number и result существуют только внутри doubleNumber(). Это помогает каждому методу работать со своими временными данными и не засорять остальную программу лишними переменными.

Перегрузка методов

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

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

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

При вызове Java выбирает подходящий вариант по переданным аргументам. Поэтому max(3, 8) вызовет первый метод, а max(3, 8, 5) — второй. Одного только другого типа возвращаемого значения для перегрузки недостаточно.

Делим программу на понятные действия

Хороший метод обычно выполняет одну понятную задачу и получает только те данные, которые ему действительно нужны. Тогда основной код читается как последовательность действий, а детали каждого действия спрятаны в методе.

int price = 1200;
int discount = 200;

int finalPrice = calculateFinalPrice(price, discount);
System.out.println(finalPrice);

Имя calculateFinalPrice() сразу объясняет намерение кода. Именно в этом одна из главных ценностей методов: они помогают не только переиспользовать команды, но и разбивать программу на небольшие осмысленные части.