"Cześć Amigo! Mam nadzieję, że rozwiązywanie zadań własnymi metodami sprawiało ci przyjemność i że zdajesz sobie sprawę, jak wygodne jest tworzenie metod. Porozmawiajmy teraz o najciekawszym temacie ze wszystkich."
- Zainteresowałeś mnie, Diego... Nowy temat?
„Każdy temat jest dla ciebie nowy, mój młody robocie! I ten nie jest wyjątkiem. Chociaż znowu chodzi o metody. Pewnie już zauważyłeś, że z metod takich jak ta możemy przekazywać argumenty metodom. Gdy już znajdziemy się w System.out.println()
metodzie , nazywamy je parametrami”.
„Parametry są tym, co piszemy w nawiasach?”
„Tak, dokładnie. W rzeczywistości parametry znacznie zwiększają korzyści, jakie czerpiemy z tworzenia i używania metod”.
„Rozumiem, co mówisz o ich używaniu, i okazuje się, że już to zrobiłem. Jak zadeklarować metodę z parametrami?”
„W rzeczywistości jest to dość proste:
public static void name(parameters)
{
method body
}
„Gdzie name
jest unikalną nazwą metody i method body
reprezentuje polecenia, które składają się na metodę. I parameters
jest symbolem zastępczym dla parametrów metody, oddzielonych przecinkami”.
"Hmm... Chyba rozumiem... A może nie..."
„Pozwól, że podam ci więcej szczegółów na temat tego szablonu, abyś miał pewność, że rozumiesz, że rozumiesz:
public static void name(Type1 name1, Type2 name2, Type3 name3)
{
method body
}
Oto kilka przykładów:
Kod | Wyjaśnienie |
---|---|
|
Metodę print deklarujemy parametrem:String str |
|
Metoda print jest deklarowana z dwoma parametrami:String str int count |
|
Metoda write jest deklarowana z dwoma parametrami:int x int y |
„Ach… Teraz wszystko jasne. A jeśli nie chcemy, aby metoda miała parametry, to po prostu zostawiamy puste nawiasy”.
„Dokładnie. Zasadniczo parametry to specjalne zmienne w metodzie. Z ich pomocą możesz przekazywać różne wartości do metody, gdy jest ona wywoływana. A jeśli nie musisz przekazywać wartości, to zostawiasz puste nawiasy.
„Na przykład napiszmy metodę, która wyświetla dany wiersz tekstu określoną liczbę razy. Jakieś pomysły, jak to zrobić?”
„Cóż… Wygląda na to, że doskonale wiem, jak napisać kod, aby kilka razy wyświetlić ciąg znaków na ekranie…”
„Jak określasz wyświetlany ciąg znaków? A jak określasz liczbę wyświetlanych wierszy? Czy zgadniesz?”
„Sprawy zaczynają się wyjaśniać… Prawdopodobnie za pomocą parametrów metody?”
„Dokładnie. Parametr łańcuchowy dla wiersza tekstu i parametr liczbowy dla liczby wyświetlanych wierszy. Kod, który to robi, wyglądałby tak:
Kod | Wyjaśnienie |
---|---|
|
Zadeklarowaliśmy printLines metodę z następującymi parametrami: String text , int count Metoda wyświetla text count czasy napisów . Wywołujemy printLines metodę z różnymi parametrami |
„Za każdym razem, gdy metoda jest wywoływana, jej parametrom przypisywane są przekazane wartości i dopiero wtedy przystępujemy do wykonywania poleceń wewnątrz metody.
Argumenty
„Chcę, abyś zwrócił szczególną uwagę na wywoływanie metod, które mają parametry. Wartości przekazywane do metody są zwykle nazywane argumentami, gdy są przekazywane do metody.
Spójrzmy jeszcze raz na nasz przykład:
Kod | Wyjaśnienie |
---|---|
|
Zadeklarowaliśmy printLines metodę z następującymi parametrami: String text , int count Metoda wyświetla text count czasy napisów . Wywołujemy printLines metodę z następującymi argumentami:text = "Hi"; count = 10; text = "Bye"; count = 20; |
„Gdy printLines
metoda została wywołana po raz pierwszy, jej parametrom przypisano następujące wartości:
String text = "Hi", int count = 10
.
„Kiedy printLines
metoda została wywołana po raz drugi, jej parametrom przypisano różne wartości:
String text = "Bye", int count = 20
.
„Parametry to nic więcej ani mniej niż zmienne, którym przypisuje się określone wartości podczas wywoływania metody. Wartości "Hi"
, "Bye"
, 10
, i 20
same są nazywane argumentami”.
„Spróbuję zapamiętać różnicę i nie pomylić tych pojęć”.
Konflikt nazw zmiennych podczas wywoływania metody
„Kiedy wywołujesz metodę, możesz użyć zmiennych jako argumentów.
— Cóż, to ma sens!
„To ma sens, ale potencjalnie może powodować pewne trudności. Wróćmy jeszcze raz do naszego przykładu, ale tym razem przeniesiemy argumenty do osobnych zmiennych:
Kod | Wyjaśnienie |
---|---|
|
Zadeklarowaliśmy printLines metodę z następującymi parametrami: String text , int count Metoda wyświetla text count czasy napisów . Wywołujemy printLines metodę z następującymi argumentami:text = str; count = n; |
„Hmm… nie widzę żadnych trudności. Mamy zmienną str
. Jej wartość jest przypisywana do text
parametru, gdy metoda jest wywoływana. Mamy zmienną n
. Jej wartość jest przypisywana do count
parametru, gdy metoda jest wywoływana.” – Jak na razie wszystko jest jasne.
„Dobrze, dobrze. Teraz zmieńmy nazwy naszych zmiennych w main
metodzie:
Kod | Wyjaśnienie |
---|---|
|
Zadeklarowaliśmy printLines metodę z następującymi parametrami: String text , int count Metoda wyświetla text count czasy napisów . Wywołujemy printLines metodę z następującymi argumentami:text = text; count = count; |
„Zwróć uwagę na dwie rzeczy
Po pierwsze: mamy zmienne o tej samej nazwie w różnych metodach. To są różne zmienne (celowo przedstawiamy je różnymi kolorami). Wszystko działa tak samo jak w poprzednim przykładzie, gdzie zmienne w main
metodzie zostały nazwane str
i n
.
Po drugie: po wywołaniu metody nie dzieje się nic magicznego. Parametrom po prostu przypisuje się wartości argumentów. Niezależnie od tego, czy są to liczby, łańcuchy znaków, zmienne czy wyrażenia.
„Po zmianie nazw zmiennych w metodzie głównej nic się nie zmieniło. Poprzednio były to różne zmienne w różnych metodach i tak pozostało. Nie ma magicznego związku między tymi dwiema text
zmiennymi”.
"Teraz wiem."
Przekazywanie referencji do metod
„Mam nadzieję, że przyswoiłeś już wszystko, co ci powiedziałem o przekazywaniu argumentów metodom. Mówię to, ponieważ teraz zagłębimy się w ten temat nieco głębiej. Słuchaj uważnie”.
„Wiesz już, że niektóre zmienne w Javie przechowują nie same wartości, ale referencję , czyli adres bloku pamięci, w którym znajdują się wartości. Tak działają zmienne łańcuchowe i zmienne tablicowe.
„Co się dzieje, gdy programista przypisze inną zmienną tablicową do zmiennej tablicowej?”
„Czy w takim razie wskazują ten sam adres?”
„Zgadza się. Dwie zmienne zaczynają odnosić się do tego samego miejsca w pamięci:
„A co się stanie, jeśli jedna z tych zmiennych jest parametrem metody?
Kod | Wyjaśnienie |
---|---|
|
Metoda sum oblicza sumę liczb w przekazanej tablicy i wyświetla ją na ekranie |
„Dzieje się dokładnie to samo: data
parametr będzie zawierał odwołanie do tego samego obszaru pamięci co zmienna months
. Po wywołaniu metody następuje proste przypisanie: .data = months
„A ponieważ obie zmienne odnoszą się do tego samego obszaru pamięci przechowującego liczbę całkowitą, metoda sum
może nie tylko odczytywać wartości z tablicy, ale także je zmieniać!”
„Chyba rozumiem, ale potrzebuję więcej przykładów!”
„Cóż, na przykład, możemy napisać własną metodę, która wypełnia dwuwymiarową tablicę tą samą wartością. Może to wyglądać tak:
Kod | Wyjaśnienie |
---|---|
|
Metoda fill iteruje po każdej komórce w przekazanej tablicy dwuwymiarowej i przypisuje value do nich. Tworzymy dwuwymiarową tablicę. Wypełniamy całą tablicę liczbą 8 . |
Metody o tej samej nazwie
„Teraz wróćmy jeszcze raz do nazw metod”.
„Nie mogę sobie wyobrazić, co jeszcze można powiedzieć o imionach!”
„Cóż, standard języka Java wymaga, aby wszystkie metody w tej samej klasie miały unikalne nazwy.
„Więc nie można zadeklarować dwóch identycznie nazwanych metod w tej samej klasie?”
„Teraz — zwróćcie baczną uwagę! Metody w klasie rzeczywiście mogą mieć identyczne nazwy! Ale w tym przypadku muszą mieć różne parametry. Innymi słowy, metody są porównywane pod kątem identyczności, brane są pod uwagę nie tylko nazwy, ale także typy parametrów ! Zauważ, że konkretnie powiedziałem typy. Nazwy parametrów nie są brane pod uwagę . Przykłady:
Kod | Wyjaśnienie |
---|---|
|
Te trzy metody to różne metody. Mogą być zadeklarowane w tej samej klasie. |
|
Każda z tych pięciu metod jest uważana za inną . Mogą być zadeklarowane w tej samej klasie. |
|
„Te dwie metody są uważane za takie same , co oznacza, że nie można ich zadeklarować w tej samej klasie”. |
„Jestem całkowicie zdezorientowany! Po co nam to wszystko? Dlaczego niektóre metody są uważane za takie same , a inne za inne ? I dlaczego nazwy parametrów nie są brane pod uwagę przy określaniu wyjątkowości metody? Wszystko?"
„Rzecz w tym, że kiedy kompilator kompiluje program, musi dokładnie wiedzieć, którą metodę zamierzasz wywołać w danym miejscu.
„Na przykład, jeśli napiszesz , kompilator jest sprytny i łatwo stwierdzi, że zamierzasz wywołać tutaj metodę z parametrem. Ale jeśli napiszesz , kompilator zobaczy wywołanie metody z parametrem. Nie ma pojęcia jaką nazwę nadał programista parametrowi podczas deklarowania metody."System.out.println("Hi")
println()
String
System.out.println(1.0)
println()
double
Ach, wygląda na to, że zaczyna to przechodzić!
„Kiedy wywoływana jest metoda, kompilator upewnia się, że typy argumentów odpowiadają typom parametrów. Nie zwraca żadnej uwagi na nazwy argumentów. W Javie nazwy parametrów nie pomagają kompilatorowi określić, którą metodę zastosować. call.Programiści ich potrzebują, nie kompilator.
"I chyba dlatego nie są brane pod uwagę przy określaniu wyjątkowości metody?"
"Tak, to jest całkowicie poprawne. Nazwa metody i typy jej parametrów nazywane są sygnaturą metody . Na przykład, sum (int, int)
"
„Dlatego każda klasa musi mieć metody z unikalnymi sygnaturami, a nie metody z unikalnymi nazwami”.
"Dobra robota, Amigo! Doskonale podsumowałeś tę lekcję. Jeśli coś pozostaje niejasne, nie panikuj. Ten temat stanie się jasny po kilku zadaniach."
GO TO FULL VERSION