- Писать и вызывать
static-метод с параметрами и возвращаемым значением - Использовать перегрузку методов
- Объяснять, что в Java аргументы передаются по значению
Представь, что площадь комнаты нужно вычислять в десяти местах программы. Если написать одну и ту же формулу десять раз, то для исправления одной ошибки придётся править десять мест. Метод — это именованный блок кода: его пишут один раз и вызывают сколько угодно. Один метод ты уже знаешь — main.
Устройство метода
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). Компилятор выбирает нужный вариант по аргументам. Одного лишь другого возвращаемого типа для этого недостаточно.
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 внутри метода не влияет на переменную вызывающего кода. А у массивов и объектов копируется не сам объект, а ссылка на него — по этой ссылке метод может изменить элементы того же самого массива.
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 позволяет передать методу любое количество аргументов; внутри метода они выглядят как массив.
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.
Показать решениеСкрыть решение
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.
void?