Spis treści
Jak już widzieliśmy, metody mogą przyjmować zero, jeden lub więcej argumentów.
Argumenty metody:
- mają określony typ (prymitywny, jak na przykład int, bądź złożony, jak String),
- mają nazwę (zgodną z zasadami nazewnictwa obiektów w Javie),
- są rozdzielone przecinkami,
- nie muszą być tego samego typu,
- nie mogą mieć określonych wartości domyślnych – jeżeli metoda ma przyjąć trzy argumenty, to tyle ich musimy podać podczas wywoływania takiej metody,
- podczas wywoływania muszą być podane w takiej samej kolejności, w jakiej zostały zdefiniowane w metodzie.
Spójrzmy na poniższy przykład:
import java.util.Scanner; public class PrzykladArgumentowMetod { public static void main(String[] args) { System.out.println("Ile gwiazdek wypisac?"); int liczbaGwiazdek = getInt(); // (1) wypiszWielokrotnosc("*", liczbaGwiazdek); // (2) // wypiszWielokrotnosc(liczbaGwiazdek, "*"); // (3) } public static int getInt() { // (4) return new Scanner(System.in).nextInt(); } public static void wypiszWielokrotnosc(String tekst, int ileRazy) { // (5) for (int i = 0; i < ileRazy; i++) { System.out.print(tekst); } } }
- Metoda getInt nie przyjmuje żadnych argumentów (4) – pomimo tego, wywołując ją musimy użyć pustych nawiasów (1).
- Metoda wypiszWielokrotnosc przyjmuje dwa argumenty (5) – jeden typu złożonego String, a drugi typu podstawowego int.
- Wywołując (2) metodę wypiszWielokrotnosc, musimy podać oba argumenty tej metody.
- Gdybyśmy spróbowali wywołać metodę wypiszWielokrotnosc podając argumenty w złej kolejności (3), powyższy kod źródłowy by się nie skompilował.
Modyfikacja argumentów metod¶
W Javie istnieją dwa rodzaje typów – prymitywne oraz referencyjne (zwane typami złożonymi). W rozdziale trzecim poznaliśmy wszystkie osiem typów prymitywnych, którymi są:
- boolean
- byte
- short
- int
- long
- float
- double
- char
Typy prymitywne są elementami budującymi, z których składają się typy złożone, definiowane przez programistów.
Typy referencyjne – to typy złożone, zdefiniowane w bibliotekach standardowych języka Java, oraz tworzone przez programistów. Do typów referencyjnych zaliczamy także tablice. Przykładem typu złożonego jest String. Biblioteka standardowa Java udostępnia tysiące tego rodzaju typów.
Oba te rodzaje typów mają kilka bardzo istotnych różnic, o których opowiemy sobie w rozdziale siódmym. Na razie skupimy się na jednej z nich – przekazywaniu i modyfikowaniu ich w metodach.
Spójrzmy na poniższy przykład – co zostanie wypisane na ekranie?
public class ZmianaArgumentowWMetodzie { public static void main(String[] args) { int x = 5; // (1) int[] tablicaWartosci = { 1, 2, 3 }; // (2) doKwadratu(x); // (3) wszystkieDoKwadratu(tablicaWartosci); // (4) System.out.println("X wynosi " + x); // (5) for (int i = 0; i < tablicaWartosci.length; i++) { // (6) System.out.println("Element tablicy o indeksie " + i + " wynosi " + tablicaWartosci[i]); // (7) } } public static void doKwadratu(int liczba) { liczba = liczba * liczba; // (8) } public static void wszystkieDoKwadratu(int[] tablicaLiczb) { for (int i = 0; i < tablicaLiczb.length; i++) { // (9) tablicaLiczb[i] = tablicaLiczb[i] * tablicaLiczb[i]; // (10) } } }
Niespodziewanie, na ekranie zobaczymy następujące wartości:
X wynosi 5Przeanalizujmy powyższy program:
- Na początku metody main tworzymy po jednej zmiennej typu prymitywnego (1) i referencyjnego (2) (tablicę liczb typu int).
- Następnie, wywołujemy metody doKwadratu (3) i wszystkieDoKwadratu (4), przekazując jako argumenty utworzone wcześniej zmienne.
- W obu metodach modyfikujemy przesłane do tych metod argumenty (8) (9, 10).
- Po powrocie z obu metod wypisujemy na ekran wartości obu zmiennych (5) (6, 7).
Dlaczego zmienna x zachowała po wywołaniu metody doKwadratu swoją pierwotną wartość 5, natomiast elementy tablicy tablicaWartosci po powrocie z metody wszystkieDoKwadratu mają wartości podniesione do kwadratu?
Powodem są różne rodzaje typów tych zmiennych – zmiany argumentów prymitywnych typów (jak int) nie zmieniają oryginalnej zmiennej, podczas gdy argumenty typów referencyjnych operują bezpośrednio na przesłanym obiekcie – w tym przypadku, na tablicy. Dlatego zmienna x zachowała swoją pierwotną wartość, a zmiany wykonane na tablicy, którą podaliśmy jako argument metody wszystkieDoKwadratu, "przetrwały" po zakończeniu tej metody.
Jest to bardzo ważna różnica i zawsze trzeba mieć świadomość, że modyfikacja argumentów typów referencyjnych pociąga za sobą zmiany w oryginalnym obiekcie. W rozdziale o klasach poznamy powód takiego zachowania zmiennych typów referencyjnych.