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)
  1. public static: na razie zawsze stoi na początku. Co oznacza, wyjaśnia artykuł o klasach i obiektach w Javie.
  2. Typ zwracany: double, int, boolean, String, … albo void, jeśli metoda nic nie zwraca.
  3. Nazwa: pisana małą literą, mówi, co metoda robi.
  4. 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) to 1,
  • 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łasza illegal 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 ma return.

  • Parametry to kopie

    Przy int, double i boolean metoda 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