"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 namejest unikalną nazwą metody i method bodyreprezentuje polecenia, które składają się na metodę. I parametersjest 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
public static void print(String str)
{
}
Metodę printdeklarujemy parametrem:
String str
public static void print(String str, int count)
{
}
Metoda printjest deklarowana z dwoma parametrami:
String str
int count
public static void write(int x, int y)
{
}
Metoda writejest 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
class Solution
{
   public static void printLines(String text, int count)
   {
     for (int i = 0; i < count; i++)
       System.out.println(text);
   }

   public static void main(String[] args)
   {
     printLines("Hi", 10);
     printLines("Bye", 20);
   }
}

Zadeklarowaliśmy printLinesmetodę z następującymi parametrami:
String text, int count

Metoda wyświetla text countczasy napisów



. Wywołujemy printLinesmetodę 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
class Solution
{
   public static void printLines(String text, int count)
   {
     for (int i = 0; i < count; i++)
       System.out.println(text);
   }

   public static void main(String[] args)
   {
     printLines("Hi", 10);
     printLines("Bye", 20);
   }
}

Zadeklarowaliśmy printLinesmetodę z następującymi parametrami:
String text, int count

Metoda wyświetla text countczasy napisów


. Wywołujemy printLinesmetodę z następującymi argumentami:
text = "Hi"; count = 10;
text = "Bye"; count = 20;

„Gdy printLinesmetoda została wywołana po raz pierwszy, jej parametrom przypisano następujące wartości:

String text = "Hi", int count = 10.

„Kiedy printLinesmetoda 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 20same 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
class Solution
{
   public static void printLines(String text, int count)
   {
     for (int i = 0; i < count; i++)
       System.out.print(text);
   }

   public static void main(String[] args)
   {
     String str = "Hi";
     String n = 10;
     printLines(str, n);
   }
}

Zadeklarowaliśmy printLinesmetodę z następującymi parametrami:
String text, int count

Metoda wyświetla text countczasy napisów



. Wywołujemy printLinesmetodę z następującymi argumentami:
text = str;
count = n;

„Hmm… nie widzę żadnych trudności. Mamy zmienną str. Jej wartość jest przypisywana do textparametru, gdy metoda jest wywoływana. Mamy zmienną n. Jej wartość jest przypisywana do countparametru, gdy metoda jest wywoływana.” – Jak na razie wszystko jest jasne.

„Dobrze, dobrze. Teraz zmieńmy nazwy naszych zmiennych w mainmetodzie:

Kod Wyjaśnienie
class Solution
{
   public static void printLines(String text, int count)
   {
     for (int i = 0; i < count; i++)
       System.out.print(text);
   }

   public static void main(String[] args)
   {
     String text = "Hi";
     String count = 10;
     printLines(text, count);
   }
}

Zadeklarowaliśmy printLinesmetodę z następującymi parametrami:
String text, int count

Metoda wyświetla text countczasy napisów



. Wywołujemy printLinesmetodę 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 mainmetodzie zostały nazwane stri 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 textzmiennymi”.

"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
class Solution
{
   public static void sum(int[] data)
   {
     int total = 0;
     for (int i = 0; i < data.length; i++)
       total = total + data[i];
     System.out.println(total);
   }

   public static void main(String[] args)
   {
     int[] months = {31, 28, 31, 30, 31, 30, 31, 31, 30};
     sum(months);
   }
}


Metoda sumoblicza sumę liczb w przekazanej tablicy i wyświetla ją na ekranie

„Dzieje się dokładnie to samo: dataparametr 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 summoż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
class Solution
{
   public static void fill(int[][] data, int value)
   {
     for (int i = 0; i < data.length; i++)
     {
       for (int j = 0; j < data[i].length; j++)
         data[i][j] = value;
     }
  }

   public static void main(String[] args)
   {
     int[][] months = {{31, 28}, {31, 30, 31}, {30, 31, 31}};
     fill (months, 8);
   }
}


Metoda fill iteruje po każdej komórce w przekazanej tablicy dwuwymiarowej i przypisuje valuedo 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
void fill(int[] data, int value) {
}
void fill(int[][] data, int value) {
}
void fill(int[][][] data, int value)  {
}
Te trzy metody to różne metody. Mogą być zadeklarowane w tej samej klasie.
void print(String str) {
}
void print(String str, String str2) {
}
void print(int val) {
}
void print(double val) {
}
void print() {
}
Każda z tych pięciu metod jest uważana za inną . Mogą być zadeklarowane w tej samej klasie.
void sum(int x, int y) {
}
void sum(int data, int value) {
}
„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()StringSystem.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."