Metody i rekurencja w Javie w prosty sposób
Zaktualizowano 22 października 2026
Metody w Javie nadają fragmentowi kodu nazwę. Wywołujesz metodę tyle razy, ile chcesz, a kod piszesz tylko raz. W tym artykule napiszesz własne metody, przeciążysz je i sprawisz, że będą wywoływać same siebie.
Własne metody
Metoda stoi w klasie obok main, a nie w jej środku. Jej nagłówek ma cztery części:
public static double grossPrice(double net)
public static: na razie zawsze stoi na początku. Co oznacza, wyjaśnia artykuł o klasach i obiektach w Javie.- Typ zwracany:
double,int,boolean,String, … albovoid, jeśli metoda nic nie zwraca. - Nazwa: pisana małą literą, mówi, co metoda robi.
- Parametry: w nawiasach, każdy z typem, oddzielone przecinkami. Przy wywołaniu dostają wartości, które przekazujesz.
return zwraca wynik i natychmiast kończy metodę. Zwróconą wartość możesz zapisać, wypisać albo liczyć z nią dalej.
public class Main { public static double grossPrice(double net) { return net * 1.19; }
public static boolean isAdult(int age) { return age >= 18; }
public static void printLine(int length) { for (int i = 0; i < length; i++) { System.out.print("-"); } System.out.println(); }
public static void main(String[] args) { printLine(20); System.out.printf("Gross: %.2f%n", grossPrice(50.0)); double total = grossPrice(10.0) + grossPrice(20.0); System.out.printf("Total: %.2f%n", total); System.out.println("Adult at 17? " + isAdult(17)); printLine(20); }}Przeciążanie i varargs
Kilka metod może mieć tę samą nazwę, jeśli różnią się parametrami: liczbą albo typem. Nazywa się to przeciążaniem. Przy wywołaniu Java wybiera pasującą metodę na podstawie argumentów. Metoda może przy tym wywołać inną, tak jak max z trzema parametrami korzysta z wersji z dwoma.
Jeśli metoda ma przyjmować dowolnie wiele wartości, piszesz trzy kropki po typie: int... numbers. Nazywa się to varargs. Wewnątrz metody numbers jest zwykłą tablicą, pustą, jeśli nic nie przekażesz.
public class Main { public static int max(int a, int b) { if (a > b) { return a; } return b; }
public static int max(int a, int b, int c) { return max(max(a, b), c); }
public static int sum(int... numbers) { int total = 0; for (int n : numbers) { total += n; } return total; }
public static void main(String[] args) { System.out.println(max(3, 7)); System.out.println(max(3, 9, 5)); System.out.println(sum()); System.out.println(sum(4)); System.out.println(sum(1, 2, 3, 4)); }}Rekurencja
Metoda może wywołać samą siebie. Nazywa się to rekurencją i pasuje wtedy, gdy problem da się sprowadzić do mniejszej wersji tego samego problemu. Każda rekurencja potrzebuje dwóch części:
- warunku zakończenia (przypadku bazowego), który zna wynik od razu, np.
factorial(1)to1, - wywołania rekurencyjnego z mniejszą wartością, np.
n * factorial(n - 1).
Tak Java liczy factorial(3): 3 * factorial(2) → 3 * 2 * factorial(1) → 3 * 2 * 1 = 6. Większe przykłady znajdziesz w artykule o rekurencji i backtrackingu.
public class Main { public static void countdown(int n) { if (n == 0) { System.out.println("Go!"); return; } System.out.println(n); countdown(n - 1); }
public static int factorial(int n) { if (n <= 1) { return 1; } return n * factorial(n - 1); }
public static void main(String[] args) { countdown(3); for (int i = 1; i <= 5; i++) { System.out.println(i + "! = " + factorial(i)); } }}Typowe błędy
Metoda napisana wewnątrz main
Metoda nie może stać wewnątrz innej metody. Jeśli stoi między nawiasami
main, kompilator zgłaszaillegal start of expression. Metody stoją w klasie obok siebie.Brak return w jednej z gałęzi
Jeśli metoda ma typ zwracany, każda ścieżka przez nią musi kończyć się
return:public static String sign(int n) { if (n > 0) { return "positive"; } else if (n < 0) { return "negative"; } // missing return statement}return "zero";na końcu usuwa błąd.Zwrócona wartość przepada
Samo
grossPrice(10.0);co prawda liczy, ale wynik ginie. Zapisz go (double price = grossPrice(10.0);) albo wypisz. I odwrotnie: metoda niczego nie wypisuje tylko dlatego, że mareturn.Parametry to kopie
Przy
int,doubleibooleanmetoda dostaje kopię wartości. Jeśli zmieni parametr, wywołujący tego nie zauważy. Przy tablicach dostaje natomiast referencję do tej samej tablicy (zobacz tablice w Javie): zmiany elementów są potem widoczne także na zewnątrz.Rekurencja bez zakończenia
Jeśli brakuje warunku zakończenia albo nigdy nie zostaje on osiągnięty, metoda wywołuje się w kółko, aż program zakończy się błędem
StackOverflowError. Sprawdź: czy wartość przy każdym wywołaniu się zmniejsza i czy na pewno trafi do przypadku bazowego?
Zadania z tego tematu
Przećwicz to, czego się nauczyłeś, od razu w przeglądarce. Testy natychmiast sprawdzają twoje rozwiązanie.
Powiązane artykuły
- Klasy i obiektyKlasy i obiekty w Javie w prosty sposób: pola, konstruktor, gettery, static i rekordy z przykładami. Do tego typowe błędy, np. przesłonięte pola.Czytaj artykuł
- Rekurencja i backtrackingRekurencja i backtracking w Javie prosto wyjaśnione: warunek stopu, stos wywołań, permutacje i wieże Hanoi z przykładami oraz typowymi błędami.Czytaj artykuł
- Klasyczne algorytmyNWD algorytmem Euklidesa, sito, systemy liczbowe, algorytm Luhna i algorytm zachłanny w Javie: krótkie przykłady, złożoność i typowe błędy.Czytaj artykuł