Методы
Зачем нужны методы
Когда одна и та же последовательность действий нужна несколько раз, копировать её по программе неудобно. Метод позволяет дать этому действию имя, вынести код в отдельный блок и вызывать его там, где он нужен.
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() сразу объясняет намерение кода.
Именно в этом одна из главных ценностей методов: они помогают не только переиспользовать команды,
но и разбивать программу на небольшие осмысленные части.