Parametrii metodei java

Atunci când se numește o metodă, argumentele sunt transmise "prin valoare". Cu alte cuvinte, valorile variabilelor de parametru din corpul metodei sunt copii ale acelor obiecte pe care codul de inițiere le-a transmis metodei ca argumente. Dacă, de exemplu, metoda are ca argument o valoare de tip dublu, în corpul metodei salvează o copie a valorilor parametrilor corespunzătoare și posibilele modificări copiei în timpul funcționării metodei nu afectează conținutul variabilelor din cod-inițiator. Luați în considerare următorul exemplu:

clasa PassByValue

public static void principal (String [] args)

Sst.emut.println ("la: un =" + unu);

Stern.onut.println ("după: unul =" + unu);

voce statică publică dublă (dublu arg)

arg / = 2,0; // Împărțiți valoarea arg în jumătate

s.stem.out.println ("jumătate: arg =" + arg);

Rezultatul programului este prezentat mai jos: operația de împărțire a valorii parametrului arg în metoda halveIt nu afectează conținutul variabilei de pe corpul metodei principale.

jumătate: arg = 0,5

clasa PassRef

public static void principal (String [] args)

Corp venus = corp nou ("Beepa", null);

Sustem.onut.rintln ("la:" + venus);

Sustem.onut.rintln ("după:" + venus);

public void static CommonName (Body bodyRef)

bodyRef.name = "star dimineață";

Rezultatul programului arată astfel:

După: 0 (Steaua Morning)

Rețineți că starea obiectului "extern" față de metoda CommonName a fost permisă să schimbe "dinăuntru" această metodă; În plus, venus variabilă păstrat încă o referință la aceeași clasă de obiect de corp, și variabilă metoda COMMONNAME copie bodyRef de referință venus a primit o altă valoare - nulă. Toate acestea, desigur, necesită o explicație mai detaliată.

Următoarea diagramă ilustrează starea variabilelor imediat după apelul de la metoda principală a CommonName.

În acest moment, cele două variabile, venus în principal și bodyRef în commonName, indică același obiect. Când metoda commonName modifică câmpul bodyRef.name, conținutul aceluiași obiect care este comun celor două variabile de referință este modificat. Atunci când commonName stabilește variabila bodyRef la null, numai conținutul corpului se schimbă; starea legăturii venus rămâne aceeași, deoarece parametrul bodyRef este o copie a variabilei venus transmisă ca argument de valoare. Singurele date pe care acesta din urmă este expus elementul - este setarea bodyRef ca atare (același a fost observată în exemplul anterior, în cazul în care singura „victimă“ parte, în procesul metodei halveIt dovedește parametrul ARG). Dacă modificarea bodyRef a afectat valoarea lui venus în principal, șirul după. Rezultatul pe ecran va conține cuvântul nul. (. Numele BodyRef = ...) În ceea ce privește prima declarație de atribuire în corpul metodei commonName, trebuie repetată încă o dată: unul și același obiect, în același timp, indică cele două variabile, Venus în principal și bodyRef în commonName, astfel încât modificările la starea obiectului prin referință bodyRef, va fi, de asemenea, vizibilă atunci când accesați obiectul utilizând alte link-uri existente (în special, Venus).

Există o opinie comună, la fel de incorectă, că obiectele Java se presupune că sunt transmise "prin referință". În teorie, limbaje de programare, legătura de transmisie pe termen lung este suficient upotrebitelny, strict vorbind, înseamnă următoarele: atunci când argumentul transmis funcției, functia apelata devine o referire la valoarea inițială, dar nu o copie a acestei valori. Dacă valoarea parametrului se modifică în corpul funcției, datele corespunzătoare din codul care inițiază apelul sunt de asemenea modificate, deoarece argumentul și parametrul indică același bloc de memorie. Dacă Java este, de fapt a permis să folosească argumente transmise prin referință, au existat o modalitate de a declara o halveIt metodă, astfel încât codul său intern se poate modifica valoarea unei variabile externe una, și pentru a permite metoda SommonName schimba valoarea lui Venus la null. Dar este imposibil să faci asta. În obiectele Java nu se trece prin referință - referințele la obiecte sunt transmise prin valoare. Deoarece două copii ale aceleiași variabile de referință indică același obiect, orice schimbare a stării obiectului făcută cu o referință va fi "vizibilă" prin cealaltă. Există o singură cale de a transmite argumente (prin valoare), ceea ce face viața mult mai ușoară.

Articole similare