"Bună Amigo! Sper că ți-a plăcut să rezolvi sarcini folosind propriile metode și că îți dai seama cât de convenabil este să creezi metode. Acum hai să vorbim despre cel mai interesant subiect dintre toate."

— Mi-ai stârnit interesul, Diego... Un subiect nou?

„Fiecare subiect este nou pentru tine, tânărul meu robot! Și acesta nu face excepție. Deși încă o dată este vorba despre metode. Probabil că ai observat deja din metodele de genul acesta că putem transmite argumente metodelor. Odată ce suntem în interiorul System.out.println()metodei , ne referim la ei drept parametri."

„Parametrii sunt ceea ce scriem în paranteze?”

„Da, exact. Și, de fapt, parametrii sporesc foarte mult beneficiile pe care le obținem în urma creării și utilizării metodelor”.

"Înțeleg ce spui despre utilizarea lor și se dovedește că am făcut-o deja. Cum declarăm o metodă cu parametri?"

„De fapt, este destul de simplu:

public static void name(parameters)
{
  method body
}

"Unde nameeste numele unic al metodei și method bodyreprezintă comenzile care alcătuiesc metoda. Și parameterseste un substituent pentru parametrii metodei, separați prin virgule."

— Hmm... cred că înțeleg... Sau poate nu...

„Permiteți-mi să vă ofer mai multe detalii despre acest șablon, astfel încât să fiți sigur că înțelegeți că înțelegeți:

public static void name(Type1 name1, Type2 name2, Type3 name3)
{
  method body
}

Aici sunt cateva exemple:

Cod Explicaţie
public static void print(String str)
{
}
Metoda printeste declarată cu un parametru:
String str
public static void print(String str, int count)
{
}
Metoda printeste declarată cu doi parametri:
String str
int count
public static void write(int x, int y)
{
}
Metoda writeeste declarată cu doi parametri:
int x
int y

"Ah... Acum e clar. Și dacă nu vrem ca metoda să aibă parametri, atunci pur și simplu lăsăm parantezele goale."

„Exact. Practic, parametrii sunt variabile speciale în cadrul unei metode. Cu ajutorul lor, poți trece diverse valori metodei atunci când este apelată. Și dacă nu trebuie să treci valori, atunci lași parantezele goale.

„De exemplu, să scriem o metodă care afișează o anumită linie de text de un anumit număr de ori. Ai vreo idee despre cum să faci asta?”

„Ei bine... Se pare că știu bine cum să scriu cod pentru a afișa un șir pe ecran de mai multe ori...”

"Cum specificați șirul de afișat? Și cum specificați numărul de linii afișate? Puteți ghici?"

— Lucrurile încep să devină clare... Probabil cu ajutorul parametrilor metodei?

„Exact. Un parametru șir pentru linia de text și un parametru numeric pentru numărul de linii afișate. Codul care face acest lucru ar arăta astfel:

Cod Explicaţie
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);
   }
}

Am declarat printLinesmetoda cu următorii parametri:
String text, int count

Metoda afișează text counttimpii șirului



. Numim printLinesmetoda cu diverși parametri

„De fiecare dată când este apelată o metodă, parametrilor acesteia li se atribuie valorile transmise și abia apoi începem să executăm comenzile din interiorul metodei.

Argumente

„Vreau să acordați o atenție deosebită apelării metodelor care au parametri. Valorile transmise metodei sunt de obicei numite argumente atunci când sunt transmise metodei.

Să aruncăm o altă privire la exemplul nostru:

Cod Explicaţie
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);
   }
}

Am declarat printLinesmetoda cu următorii parametri:
String text, int count

Metoda afișează String text counttimes


Apelăm printLinesmetoda cu următoarele argumente:
text = "Hi"; count = 10;
text = "Bye"; count = 20;

„Când printLinesmetoda a fost apelată pentru prima dată, parametrilor acesteia li s-au atribuit următoarele valori:

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

„Când printLinesmetoda a fost apelată a doua oară, parametrilor ei li s-au atribuit valori diferite:

String text = "Bye", int count = 20.

„Parametrii sunt nici mai mult, nici mai puțin decât variabile cărora li se atribuie anumite valori atunci când o metodă este apelată. Valorile "Hi", "Bye", 10, și 20sunt ele însele numite argumente.”

„Voi încerca să-mi amintesc diferența și să nu confund aceste concepte”.

Nume de variabile conflictuale la apelarea unei metode

„Când apelați o metodă, puteți folosi variabile ca argumente.

— Ei bine, asta are sens!

„Are sens, dar poate produce unele dificultăți. Să ne întoarcem încă o dată la exemplul nostru, dar de data aceasta vom muta argumentele în variabile separate:

Cod Explicaţie
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);
   }
}

Am declarat printLinesmetoda cu următorii parametri:
String text, int count

Metoda afișează String text counttimes



Apelăm printLinesmetoda cu următoarele argumente:
text = str;
count = n;

"Hmm... Nu văd dificultăți. Avem o strvariabilă. Valoarea ei este atribuită parametrului textatunci când este apelată metoda. Avem o nvariabilă. Valoarea acesteia este atribuită parametrului countatunci când este apelată metoda." „Până acum, totul este clar”.

„Bine, bine. Acum să redenumim variabilele noastre în mainmetoda:

Cod Explicaţie
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);
   }
}

Am declarat printLinesmetoda cu următorii parametri:
String text, int count

Metoda afișează String text counttimes



Apelăm printLinesmetoda cu următoarele argumente:
text = text;
count = count;

„Fii atent la două lucruri

În primul rând: avem variabile cu același nume în metode diferite. Acestea sunt variabile diferite (le descriem în mod deliberat folosind culori diferite). Totul funcționează la fel ca în exemplul anterior, unde variabilele din mainmetodă au fost numite strși n.

În al doilea rând: Nimic magic nu se întâmplă atunci când metoda este apelată. Parametrilor li se atribuie pur și simplu valorile argumentului. Indiferent dacă sunt numere, șiruri, variabile sau expresii.

"După ce redenumim variabilele din metoda principală, nimic nu s-a schimbat. Erau variabile diferite în metode diferite anterior și astfel rămân. Nu există nicio legătură magică între cele două textvariabile."

"Acum stiu."

Transmiterea referințelor la metode

"Sper că ai asimilat deja tot ce ți-am spus despre trecerea argumentelor la metode. Spun asta, pentru că acum vom aprofunda puțin în acest subiect. Ascultă cu atenție."

„Știți deja că unele variabile din Java stochează nu valorile în sine, ci o referință , adică adresa blocului de memorie în care se află valorile. Așa funcționează variabilele șir și variabilele matrice.

„Când un dezvoltator atribuie o altă variabilă matrice unei variabile matrice, ce se întâmplă?”

— Atunci arată aceleași adrese?

„Corect. Cele două variabile încep să se refere la același spațiu din memorie:

„Și ce se întâmplă dacă una dintre aceste variabile este un parametru al unei metode?

Cod Explicaţie
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 sumcalculează suma numerelor din matricea transmisă și o afișează pe ecran

„Se întâmplă exact același lucru: dataparametrul va conține o referință la aceeași zonă de memorie ca și monthsvariabila. Când metoda este apelată, are loc o atribuire simplă: .data = months

„Și, deoarece ambele variabile se referă la aceeași zonă de memorie care stochează un întreg, atunci metoda sumpoate nu numai să citească valori din matrice, ci și să le modifice!”

„Bănuiesc că înțeleg, dar am nevoie de mai multe exemple!”

„Ei bine, de exemplu, putem scrie propria noastră metodă care umple o matrice bidimensională cu aceeași valoare. Acesta este modul în care ar putea arăta:

Cod Explicaţie
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 iterează peste fiecare celulă din matricea bidimensională transmisă și valuele atribuie.






Creăm o matrice bidimensională.
Umplem întreaga matrice cu numărul 8.

Metode cu același nume

„Acum să revenim încă o dată la numele metodelor.”

"Nu-mi pot imagina ce altceva s-ar putea spune despre nume!"

„Ei bine, standardul limbajului Java cere ca toate metodele din aceeași clasă să aibă nume unice.

„Deci, este imposibil să declari două metode cu nume identic în aceeași clasă?”

„Acum — acordați o atenție deosebită! Metodele dintr-o clasă pot avea într-adevăr nume identice! Dar în acest caz, ele trebuie să aibă parametri diferiți. Cu alte cuvinte, metodele sunt comparate pentru asemănare, nu numai că sunt luate în considerare numele, ci și tipurile parametrilor ! Rețineți că am spus în mod special tipurile. Numele parametrilor nu sunt luate în considerare . Exemple:

Cod Explicaţie
void fill(int[] data, int value) {
}
void fill(int[][] data, int value) {
}
void fill(int[][][] data, int value)  {
}
Aceste trei metode sunt metode diferite . Ele pot fi declarate în aceeași clasă.
void print(String str) {
}
void print(String str, String str2) {
}
void print(int val) {
}
void print(double val) {
}
void print() {
}
Fiecare dintre aceste cinci metode este considerată diferită . Ele pot fi declarate în aceeași clasă.
void sum(int x, int y) {
}
void sum(int data, int value) {
}
„Aceste două metode sunt considerate la fel , ceea ce înseamnă că nu pot fi declarate în aceeași clasă.”

„Sunt total confuz! De ce avem nevoie de toate acestea? De ce unele metode sunt considerate la fel , în timp ce altele sunt diferite ? Și de ce numele parametrilor nu sunt luate în considerare atunci când se determină unicitatea unei metode? De ce este necesară unicitatea la toate?"

„Chestia este că atunci când compilatorul compilează un program, trebuie să știe exact ce metodă intenționați să apelați în orice loc.

„De exemplu, dacă scrieți , compilatorul este inteligent și va concluziona cu ușurință că intenționați să apelați metoda aici cu un parametru. Dar dacă scrieți , compilatorul va vedea un apel la metoda cu un parametru. Habar nu are ce nume a dat programatorul parametrului când a declarat metoda."System.out.println("Hi")println()StringSystem.out.println(1.0)println()double

Ahh, se pare că începe să treacă!

„Când o metodă este apelată, compilatorul se asigură că tipurile de argumente se potrivesc cu tipurile de parametri. Nu acordă nicio atenție numelui argumentelor. În Java, numele parametrilor nu ajută compilatorul să determine ce metodă să programatorii au nevoie de ele, nu de compilator.

„Și cred că de aceea nu sunt luate în considerare atunci când se determină unicitatea unei metode?”

„Da, este complet corect. Numele unei metode și tipurile parametrilor acesteia se numesc semnătura metodei . De exemplu, sum (int, int)

„Deci fiecare clasă trebuie să aibă metode cu semnături unice, mai degrabă decât metode cu nume unice.”

"Bravo, Amigo! Ai rezumat perfect această lecție. Dacă ceva rămâne neclar, nu te panica. Acest subiect va deveni clar după câteva sarcini."