1. Wprowadzenie
Zacznijmy od pytania: po co w ogóle metoda ma coś zwracać? Dlaczego nie można po prostu wszystko zrobić w środku metody, a wynik wypisać na ekran?
Chodzi o to, że często potrzebujemy nie tylko wykonać jakieś działanie, ale też otrzymać wynik, który później przyda się w innych częściach programu. Na przykład:
- Metoda oblicza sumę dwóch liczb i zwraca ją, abyśmy mogli wykorzystać wynik w dalszych obliczeniach.
- Metoda określa, czy liczba jest parzysta, i zwraca true albo false, abyśmy mogli podjąć decyzję.
- Metoda zwraca łańcuch powitalny dla użytkownika, a my decydujemy, gdzie go przekazać – wypisać na ekran, zapisać do pliku, wysłać po sieci.
Gdyby metody zawsze tylko drukowały wynik, nasz program byłby na sztywno związany z jednym scenariuszem i trudno byłoby ponownie używać logiki. Wartość zwracana czyni metody elastycznymi i uniwersalnymi.
Analogia
Wyobraź sobie automat do kawy. Wrzucasz pieniądze, naciskasz przycisk – i dostajesz kawę. Gdyby automat tylko głośno mówił „Kawa zrobiona!” (ale nie wydawał kawy), raczej byś się nie ucieszył. Tak samo z metodami: czasem nie chodzi o to, by usłyszeć „Gotowe!”, lecz by otrzymać wynik.
2. Typ wartości zwracanej: co może zwracać metoda
W Java, kiedy deklarujesz metodę, podajesz typ wartości zwracanej – może to być dowolny typ: int, double, String, boolean, tablica, a nawet obiekt własnej klasy. Jeśli metoda nic nie zwraca – piszemy void.
Składnia:
return_type_value methodName(parameters)
{
// ciało metody
}
Przykłady:
int sum(int a, int b)
{
// zwraca int
}
String getGreeting(String name)
{
// zwraca String
}
boolean isEven(int number)
{
// zwraca boolean
}
void printHello()
{
// nic nie zwraca — po prostu wykonuje działanie
}
Ważne! Typ wartości zwracanej to „obietnica” metody: ma obowiązek zwrócić wartość tego typu. Jeśli obiecałeś zwrócić int, a zwracasz String – kompilator zaprotestuje i nie pozwoli zbudować programu.
3. Operator return: jak zwrócić wartość z metody
Aby faktycznie przekazać wynik działania metody „na zewnątrz”, używa się operatora return. To słowo mówi: „Oto wynik – i na tym moja praca się kończy”.
int sum(int a, int b)
{
int result = a + b;
return result; // zwracamy wynik
}
Można też krócej:
int sum(int a, int b)
{
return a + b;
}
Kiedy metoda dochodzi do wiersza return, kończy wykonywanie, zwraca wskazaną wartość i przekazuje ją tam, skąd została wywołana.
Ważne: typ wartości po return musi być zgodny z zadeklarowanym typem metody.
4. Użycie wartości zwracanej: co z nią zrobić?
Kiedy metoda zwraca wartość, możesz:
- Zapisać ją do zmiennej.
- Użyć bezpośrednio w wyrażeniu.
- Przekazać innej metodzie.
int result = sum(5, 7); // zapisujemy do zmiennej
System.out.println(result); // wypisujemy wynik
System.out.println(sum(10, 20)); // od razu wypisujemy wynik
if (isEven(42))
{
System.out.println("Liczba parzysta!");
}
Przykład: metoda zwracająca łańcuch
String getGreeting(String name)
{
return "Cześć, " + name + "!";
}
// Użycie:
String greeting = getGreeting("Alicja");
System.out.println(greeting); // Cześć, Alicja!
5. Praktyka: przykłady metod z wartością zwracaną
Metoda zwracająca maksimum z dwóch liczb
int max(int a, int b)
{
if (a > b)
{
return a;
}
else
{
return b;
}
}
Można jeszcze krócej, jeśli znasz operator trójargumentowy:
int max(int a, int b)
{
return (a > b) ? a : b;
}
Użycie:
int maximum = max(10, 25);
System.out.println("Maksimum: " + maximum); // Maksimum: 25
Metoda, która zwraca true, jeśli liczba jest parzysta
boolean isEven(int number)
{
return number % 2 == 0;
}
Użycie:
if (isEven(18))
{
System.out.println("Liczba parzysta!");
}
else
{
System.out.println("Liczba nieparzysta!");
}
Metoda zwracająca sumę elementów tablicy
int sumArray(int[] arr)
{
int sum = 0;
for (int i = 0; i < arr.length; i++)
{
sum += arr[i];
}
return sum;
}
Użycie:
int[] grades = {5, 4, 3, 5, 4};
int total = sumArray(grades);
System.out.println("Suma ocen: " + total);
6. Co się dzieje przy wywołaniu metody z return
Gdy wywołujesz metodę zwracającą wartość, wykonanie programu jakby „wchodzi” do środka metody, wykonuje jej kod, dochodzi do return, zwraca wartość – i podstawia ją w miejscu wywołania.
Schematycznie:
int a = 2;
int b = 3;
int c = sum(a, b); // tutaj wywoływane jest sum(2, 3), zwracane jest 5, c staje się równe 5
Schemat blokowy
graph TD
A["main"] --> B["sum(a, b)"]
B --> C[obliczenia]
C --> D[return result]
D -->|wynik zostaje zwrócony| A
7. Przydatne niuanse
return kończy wykonywanie metody
Gdy tylko w metodzie pojawia się return, wykonywanie metody natychmiast się przerywa. Wszystko, co jest dalej – nie zostanie wykonane.
int test()
{
return 42;
System.out.println("To nie zostanie wydrukowane"); // unreachable
}
return w metodzie o typie void
W metodzie void (która nic nie zwraca) można użyć return bez wartości – tylko po to, by przedwcześnie zakończyć wykonywanie metody, np. przy jakimś warunku.
void printPositive(int number)
{
if (number <= 0)
{
System.out.println("Liczba nie jest dodatnia!");
return; // po prostu wychodzimy z metody
}
System.out.println("Liczba: " + number);
}
8. Typowe błędy przy pracy z return
Błąd nr 1: Nie wszystkie ścieżki zwracają wartość
int getSign(int number)
{
if (number > 0)
{
return 1;
}
// A jeśli number <= 0? Brak return!
}
// Błąd: nie wszystkie gałęzie kodu zwracają wartość
Jak naprawić: zawsze zapewniaj return na wszystkich ścieżkach wykonania.
int getSign(int number)
{
if (number > 0)
{
return 1;
}
else if (number < 0)
{
return -1;
}
else
{
return 0;
}
}
Błąd nr 2: Niezgodność typu wartości zwracanej
int getNumber()
{
return "42"; // Błąd! Oczekiwano int, a nie String
}
Błąd nr 3: return po return
int test()
{
return 5;
System.out.println("To się nie wykona"); // unreachable statement
}
Błąd nr 4: return z wyrażeniem w metodzie void
void printSomething()
{
return 42; // Błąd! Metoda void nie może zwracać wartości
}
Błąd nr 5: Ignorowanie wartości zwracanej
sum(10, 20); // i co? Wynik przepadł!
Jeśli nie używasz wartości zwracanej, po prostu się ona traci. Nie zapominaj zapisać jej lub przekazać dalej w kodzie!
Błąd nr 6: Oczekiwanie, że return coś wydrukuje
int result = sum(2, 3);
// return niczego nie drukuje!
// Trzeba wyraźnie wypisać:
System.out.println(result);
GO TO FULL VERSION