1. Przekazywanie parametrów
A teraz zaczyna się zabawa. Jak zapewne już wiesz, z metod typu System.out.println()
możesz przekazywać parametry do metod. Co w rzeczywistości znacznie zwiększa korzyści płynące z tworzenia i używania metod.
Jak więc zadeklarować metodę z parametrami? To właściwie całkiem proste:
public static void Nazwa(параметры)
{
kod метода
}
Gdzie Nazwa
jest unikalną nazwą metody i kod метода
poleceniami, które składają się na metodę. A параметры
to parametry metody oddzielone przecinkami. Napiszmy ten szablon bardziej szczegółowo:
public static void Nazwa(тип1 Nazwa1, тип2 Nazwa2, тип3 Nazwa3)
{ kod метода
}
Przykłady:
Kod | Wyjaśnienie |
---|---|
|
Metoda z zadeklarowanym print parametremString str |
|
Metoda zadeklarowana print z dwoma parametramiString str int count |
|
Metoda zadeklarowana write z dwoma parametramiint x int y |
Jeśli nie chcemy, aby metoda miała parametry, po prostu zostawiamy puste nawiasy.
Parametry to specjalne zmienne metody. Z ich pomocą różne wartości mogą być przekazywane do metody, gdy jest ona wywoływana.
Na przykład napiszmy metodę wyświetlającą ciąg tekstu określoną liczbę razy.
Wiesz już, jak napisać kod, aby kilka razy wyświetlić ciąg znaków na ekranie. Ale którą linię wyprowadzić? I ile razy? Do tego potrzebujemy parametrów.
Oto jak wyglądałby kod tego zadania:
Kod | Wyjaśnienie |
---|---|
|
Zadeklarowana metoda printLines z parametrami: String text , int count Metoda wyświetla count napis raz. text Wywołujemy metodę printLines z innymi parametrami |
Za każdym razem, gdy metoda jest wywoływana, jej zmiennym parametrom przypisywane są przekazane wartości i dopiero wtedy zaczynają być wykonywane polecenia wewnątrz metody.
2. Argumenty metody
Chcę zwrócić trochę twoją uwagę na wywołanie metody z parametrami.
Te wartości, które są przekazywane do metody, gdy jest wywoływana, są zwykle nazywane argumentami metody.
Spójrzmy jeszcze raz na przykład:
Kod | Wyjaśnienie |
---|---|
|
Zadeklarowana metoda printLines z parametrami: String text , int count Metoda count raz wyświetla napis. text Wywołujemy metodę printLines z parametramitext = "Привет"; count = 10; text = "Пока"; count = 20; |
printLines
Przy pierwszym wywołaniu metody jej zmiennym parametrom przypisano następujące wartości: String text = "Привет", int count = 10
.
Gdy metoda printLines
została wywołana po raz drugi, jej zmiennym parametrom przypisano różne wartości: String text = "Пока", int count = 20
.
Parametry metody to właśnie zmienne, którym przypisuje się określone wartości podczas wywoływania metody. Wartości "Привет"
, i nazywane są argumentami metody "Пока"
.10
20
3. Konflikt nazw zmiennych podczas wywoływania metody
Zmienne mogą być używane jako argumenty metod. Jest to proste i jasne, ale potencjalnie może nieść ze sobą pewne trudności. Rozważmy ten sam przykład, ale usuniemy argumenty z osobnych zmiennych:
Kod | Wyjaśnienie |
---|---|
|
Zadeklarowaliśmy metodę printLines z parametrami: String text , int count Metoda wyświetla count łańcuch jeden raz.Metodę z parametrami text wywołujemy printLines :text = str; count = n; |
Na razie nic skomplikowanego: mamy zmienną str
, jej wartość jest przypisywana do zmiennej text
w momencie wywołania metody. Mamy zmienną n
, jej wartość jest przypisywana do zmiennej count
podczas wywoływania metody. Podczas gdy wszystko jest jasne.
A teraz zmieńmy nazwy naszych zmiennych w metodzie main
:
Kod | Wyjaśnienie |
---|---|
|
Zadeklarowaliśmy metodę printLines z parametrami: String text , int count Metoda wyświetla count łańcuch jeden raz.Metodę z parametrami text wywołujemy printLines :text = text; count = count; |
Zwróć uwagę na dwie rzeczy
Po pierwsze, mamy zmienne o tej samej nazwie w różnych metodach. Są to różne zmienne (specjalnie pomalowaliśmy je na różne kolory). Wszystko działa tak samo jak w poprzednim przykładzie, gdy zmienne w metodzie main
zostały wywołane str
i n
.
Po drugie, po wywołaniu metody nie dzieje się żadna magia. Zmiennym parametru po prostu przypisuje się wartości argumentów. Niezależnie od tego, czy są to konkretne liczby, napisy, zmienne czy wyrażenia.
Po zmianie nazw zmiennych w metodzie main nic się nie zmieniło. To tak, jakby były różne zmienne w różnych metodach i pozostały. Nie ma magicznego związku między text
zmiennymi text
.
4. Przekazywanie referencji do metod
Mam nadzieję, że wszystko zrozumiałeś z poprzedniego wykładu, bo teraz znów zajmiemy się przekazywaniem argumentów metodom, tylko jeszcze głębiej.
Jak już wiesz, niektóre zmienne w Javie nie przechowują samych wartości, ale adres (odniesienie) bloku pamięci, w którym te wartości się znajdują. Na przykład działają zmienne łańcuchowe lub zmienne tablicowe.
Co się dzieje, gdy przypisujesz zmienną tablicową do innej zmiennej tablicowej? Prawidłowy. Dwie zmienne zaczynają odnosić się do tego samego kontenera w pamięci:
Co się stanie, jeśli jedna z tych zmiennych jest zmienną parametru metody?
Kod | Wyjaśnienie |
---|---|
|
Metoda printArraySum oblicza sumę liczb przekazanej tablicy i wyświetla ją na ekranie |
Stanie się dokładnie to samo: zmienna parametru data
będzie zawierała odniesienie do tego samego kontenera co zmienna months
. Gdy metoda zostanie wywołana, przypisanie po prostu nastąpi .data = months
A ponieważ obie zmienne odnoszą się do tego samego kontenera liczb całkowitych, metoda printArraySum
może nie tylko odczytywać wartości z tablicy, ale także je zmieniać!
Na przykład możemy napisać własną metodę, która wypełnia dwuwymiarową tablicę tymi samymi wartościami. Oto jak to może wyglądać:
Kod | Wyjaśnienie |
---|---|
|
Metoda fill przechodzi przez wszystkie komórki przekazanej tablicy dwuwymiarowej i przypisuje im wartość value . Tworzymy dwuwymiarową tablicę. Wypełniamy całą tablicę liczbą 8 . |
5. Metody o tej samej nazwie
Wróćmy teraz do nazw metod.
Standardy Java wymagają, aby wszystkie metody w tej samej klasie miały unikalne nazwy. Te. Niemożliwe jest zadeklarowanie dwóch identycznych metod w tej samej klasie.
Dopiero przy porównywaniu metod pod kątem identyczności brane są pod uwagę nie tylko nazwy, ale także typy parametrów ! Ponadto nazwy zmiennych-parametrów nie są brane pod uwagę . Przykłady:
Kod | Wyjaśnienie |
---|---|
|
Te trzy metody są uważane za różne . Mogą być zadeklarowane w tej samej klasie. |
|
Wszystkie te pięć metod uważa się za różne . Mogą być zadeklarowane w tej samej klasie. |
|
Te dwie metody są uważane za takie same (nie można ich zadeklarować w tej samej klasie). |
Dlaczego niektóre metody są uważane za takie same , a inne za inne ? I dlaczego nazwy zmiennych parametrów nie są brane pod uwagę przy określaniu unikalności metody?
Dlaczego wyjątkowość jest w ogóle potrzebna? Chodzi o to, że kiedy kompilator kompiluje twój program, musi dokładnie wiedzieć, którą funkcję/metodę wywołujesz w określonym miejscu.
Na przykład napiszesz, że kompilator jest inteligentny i łatwo wywnioskuje, że tutaj wywoływana jest metoda z parametrem typu .System.out.println("Cześć")
println()
String
A jeśli napiszesz , kompilator zobaczy tutaj wywołanie metody z parametrem typu .System.out.println(1.0)
println()
double
Kompilator upewnia się, że podczas wywoływania metody typy argumentów i parametrów są zgodne i nie zwraca uwagi na nazwę argumentu. W Javie nazwy zmiennych parametrów nie pomagają kompilatorowi określić, którą metodę wywołać. Dlatego nie są one brane pod uwagę przy określaniu wyjątkowości metody.
Nazwa metody i typy jej parametrów nazywane są sygnaturą metody . Przykład:sum(int, int)
Każda klasa nie powinna mieć metod o unikalnych nazwach, ale metody z unikalnymi sygnaturami .
GO TO FULL VERSION