Объявление и вызов
public class Methods { static int square(int x) { return x * x; } static void greet(String name) { System.out.println("Привет, " + name + "!"); } public static void main(String[] args) { int result = square(7); System.out.println(result); greet("Анна"); }}Сигнатура: модификаторы, возвращаемый тип, имя, параметры. void — метод ничего не возвращает.
Параметры передаются по значению
В Java все аргументы передаются по значению. Для примитивов копируется значение, для объектов — копия ссылки.
import java.util.Arrays;public class PassByValue { static void changePrimitive(int x) { x = 100; } static void changeArray(int[] arr) { arr[0] = 100; } static void replaceArray(int[] arr) { arr = new int[]{9, 9, 9}; } public static void main(String[] args) { int a = 1; changePrimitive(a); System.out.println(a); int[] data = {1, 2, 3}; changeArray(data); System.out.println(Arrays.toString(data)); replaceArray(data); System.out.println(Arrays.toString(data)); }}Вывод:
1[100, 2, 3][100, 2, 3]Метод может изменить содержимое объекта, но не может подменить переданную ссылку у вызывающего кода.
Возврат значения
public class Returns { static boolean isEven(int n) { return n % 2 == 0; } static int max(int a, int b) { if (a > b) { return a; } return b; } static String classify(int n) { if (n < 0) { return "отрицательное"; } if (n == 0) { return "ноль"; } return "положительное"; } public static void main(String[] args) { System.out.println(isEven(4)); System.out.println(max(3, 9)); System.out.println(classify(-5)); }}Оператор return завершает метод. Все пути выполнения метода с непустым типом должны возвращать значение.
Перегрузка
Методы с одинаковым именем, но разными параметрами:
public class Overloading { static int add(int a, int b) { return a + b; } static double add(double a, double b) { return a + b; } static int add(int a, int b, int c) { return a + b + c; } static String add(String a, String b) { return a + b; } public static void main(String[] args) { System.out.println(add(1, 2)); System.out.println(add(1.5, 2.5)); System.out.println(add(1, 2, 3)); System.out.println(add("a", "b")); }}Различать перегруженные методы по возвращаемому типу нельзя.
Рекурсия
Метод вызывает сам себя. Обязательны базовый случай и шаг к нему:
public class Recursion { static long factorial(int n) { if (n <= 1) { return 1; } return n * factorial(n - 1); } static int fibonacci(int n) { if (n < 2) { return n; } return fibonacci(n - 1) + fibonacci(n - 2); } static int gcd(int a, int b) { return b == 0 ? a : gcd(b, a % b); } public static void main(String[] args) { System.out.println(factorial(10)); System.out.println(fibonacci(10)); System.out.println(gcd(48, 18)); }}Слишком глубокая рекурсия приводит к StackOverflowError. Если можно, заменяйте рекурсию циклом.
Статические и обычные методы
Метод с static принадлежит классу и вызывается без объекта. Метод без static работает с конкретным объектом, это тема следующей части курса.
Разбиение задачи на методы
public class Primes { static boolean isPrime(int n) { if (n < 2) { return false; } for (int i = 2; (long) i * i <= n; i++) { if (n % i == 0) { return false; } } return true; } static void printPrimes(int limit) { for (int i = 2; i <= limit; i++) { if (isPrime(i)) { System.out.print(i + " "); } } System.out.println(); } public static void main(String[] args) { printPrimes(50); }}Правила хорошего метода: одна задача, понятное имя-глагол, не больше 3–4 параметров.
Задачи для самостоятельной работы
- Метод, считающий сумму цифр числа.
- Метод, проверяющий, является ли строка числом.
- Метод, возвращающий наибольший общий делитель трех чисел.
- Метод, переворачивающий массив на месте.
- Рекурсивный метод для вычисления степени
pow(x, n).
