Wywołując metodę przekazujemy pewną listę – potencjalnie pustą – parametrów typu prostego i referencji do obiektów. W języku Java wszystkie parametry (wszystkich rodzajów i typów) są przekazywane przez wartość. Zrozumienie, co się kryje za tym zdaniem jest absolutnie kluczowe dla zrozumienia języka Java. Co to więc oznacza, że parametry metod przekazywane są przez wartość?
Argumenty metody traktowane są dokładnie tak samo, jak zmienne zadeklarowane w jej ciele. Są to po prostu zmienne lokalne tej metody. To, że parametry wywołania przekazywane są przez wartość oznacza, że przekazywana jest sama wartość parametru, tj. wartości zmiennych użytych jako parametry wywołania są kopiowane do zmiennych lokalnych metody. Także przekazanie referencji do obiektu polega na skopiowaniu tej referencji do zmiennej lokalnej metody; nie samego obiektu, tylko referencji, a więc wskazania na ten obiekt. Zerknijmy na poniższy przykład.
public class TestClass { public static void main(String[] args) { String x = "Ola"; System.out.println("x: " + x); someOp(x); System.out.println("x: " + x); } public static void someOp(String y) { System.out.println("y: " + y); y = "Ela"; System.out.println("y: " + y); } }
Deklarujemy więc w metodzie main(…) zmienną referencyjną x typu String i przypisujemy jest obiekt reprezentujący napis „Ola”. Następnie wypisujemy wartość obiektu wskazywanego przez zmienną x. Wywołujemy metodę someOp(…) przekazując zmienną x jako argument wywołania. Wartość tej referencji jest kopiowana do zmiennej lokalnej y. Wyświetlamy wartość zmiennej y po czym przypisujemy do niej inny obiekt – obiekt reprezentujący napis „Ela”. Wyświetlamy jeszcze raz zmienną y i wywołanie metody się kończy. W metodzie main(…) jeszcze raz wyświetlamy wartość zmiennej x (de facto jest to wyświetlenie wartości obiektu wskazywanego przez referencję x) i widzimy, że rzeczywiście wskazuje ona teraz na ten sam obiekt. Efektem uruchomienia powyższego programu będzie wyświetlenie napisu:
x: Ola y: Ola y: Ela x: Ola
Zwróćmy uwagę na fakt, że przypisanie w metodzie someOp(…) nowej wartości do zmiennej y nie pociąga w skutkach żadnej zmiany wartości zmiennej x. Co więcej, nawet jeśli byśmy chcieli to nie będziemy mogli zmienić w metodzie someOp(…) wartości zmiennej x. Nie jest w Javie możliwa zmiana wartości zmiennych przekazanych jako argumenty wywołania metody. Java nie wspiera znanej z innych języków koncepcji argumentów typu IN/OUT. Możemy natomiast z metody someOp(…) wywoływać metody obiektu wskazywanego zarówno przez zmienną x jak i y.