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
public static void print(String str)
{
}
Metoda z zadeklarowanym printparametrem
String str
public static void print(String str, int count)
{
}
Metoda zadeklarowana printz dwoma parametrami
String str
int count
public static void write(int x, int y)
{
}
Metoda zadeklarowana writez dwoma parametrami
int 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
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("Cześć", 10);
     printLines("Do widzenia", 20);
   }
}


Zadeklarowana metoda printLinesz parametrami:
String text, int count
Metoda wyświetla countnapis raz. text





Wywołujemy metodę printLinesz 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
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("Cześć", 10);
     printLines("Do widzenia", 20);
   }
}


Zadeklarowana metoda printLinesz parametrami:
String text, int count
Metoda countraz wyświetla napis. text




Wywołujemy metodę printLinesz parametrami
text = "Привет"; 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 printLineszostał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 "Пока".1020


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
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 = "Cześć";
     int n = 10;
     printLines(str, n);
   }
}


Zadeklarowaliśmy metodę printLinesz 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 textw momencie wywołania metody. Mamy zmienną n, jej wartość jest przypisywana do zmiennej countpodczas wywoływania metody. Podczas gdy wszystko jest jasne.

A teraz zmieńmy nazwy naszych zmiennych w metodzie main:

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 = "Cześć";
     int count = 10;
     printLines(text, count);
   }
}


Zadeklarowaliśmy metodę printLinesz 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 mainzostały wywołane stri 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:

Przekazywanie odwołań do metod

Co się stanie, jeśli jedna z tych zmiennych jest zmienną parametru metody?

Kod Wyjaśnienie
class Solution
{
   public static void printArraySum(int[] data)
   {
     int sum = 0;
     for (int i = 0; i < data.length; i++)
       sum = sum + data[i];
     System.out.println(sum);
   }

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


Metoda printArraySumoblicza 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
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 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
void fill(int[] data, int value) {
}
void fill(int[][] data, int value) {
}
void fill(int[][][] data, int value)  {
}
Te trzy metody są uważane za różne . 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() {
}
Wszystkie te pięć metod uważa się za różne . 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 (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 .