JavaRush /Java Blog /Random-IT /Passaggio di parametri in Java
vincent_vega
Livello 24
Gainesville

Passaggio di parametri in Java

Pubblicato nel gruppo Random-IT
Una variabile in Java è un contenitore con un valore al suo interno. Allora cosa significa "passare" una variabile? E qual è la differenza tra tipi di dati primitivi e di riferimento.
Passaggio di parametri in Java - 1
Ci arriveremo più tardi. Cominciamo prima con un compito semplice. Cosa fa questo codice:
int х = 3;
int у = х;
Nella riga 1 viene creata una variabile x di tipo int a cui viene assegnato il valore 3. Nella riga 2 viene creata una variabile y di tipo int a cui viene assegnato il valore della variabile x . In futuro, la variabile x non influenzerà in alcun modo y . Java copia il valore di x (3) e inserisce la copia in y . Questo sta passando un parametro per valore. Non scrivi una variabile su un'altra. Il valore viene copiato e assegnato a una nuova variabile. Espressione y = x; NON significa "scrivi x in y ". Significa "copia il valore all'interno di x e scrivi quella copia in y ". Se più tardi cambio y :
у = 34;
Ciò influirà su x ? Ovviamente no. x ha ancora il valore 3. Se cambio x in seguito :
х = 90;
Come ti influenzerà questo ? Non c'è modo. Non sono correlati in alcun modo dopo che è stata effettuata l'assegnazione (COPIA del valore). E i tipi di riferimento? Come funzionano? Non è così difficile, infatti la regola è la stessa. I collegamenti fanno la stessa cosa: ottieni una copia del collegamento. Quindi se dico:
Cat A = new Cat ();
Cat B = A;
Il collegamento A viene copiato nel collegamento B. Questo non si applica all'oggetto: hai ancora solo un oggetto. Ma ora hai due riferimenti diversi che controllano lo stesso oggetto Cat . Ora esaminiamo il passaggio dei parametri ai metodi. Java passa i parametri per valore. Sempre. Ciò significa "copia il valore e passa la copia". Per i tipi primitivi è facile:
int х = 5;
doStuff (х); / / Передать копию х (meaning 5) в метод doStuff
Il metodo doStuff è simile al seguente:
void doStuff (int у) {

   / / Действия с 'y'
}
Una copia del valore di x , ovvero 5, viene passata al metodo doStuff() . Il metodo doStuff() ha una propria variabile chiamata y . La variabile y è una variabile nuova, diversa. Con una copia di ciò che era in x al momento del passaggio al metodo. D'ora in poi, y e x non hanno alcun effetto l'uno sull'altro. Quando cambi y , non influisci su x .
void doStuff (int у) {

   у = 27; / / Это не влияет на 'х'
}
E viceversa: se cambi x , non cambierai y . L'unica cosa che x ha fatto in questo caso è stata copiare il suo valore e passarlo al metodo doStuff() . Come funziona il "passaggio per valore" con i riferimenti? Troppe persone dicono: "Java trasmette i tipi primitivi per valore e gli oggetti per riferimento". Non è quello che dicono. Java trasmette tutto in base al valore. Con le primitive, ottieni una copia del contenuto. Con i link ottieni anche una copia del contenuto. Ma qual è il contenuto del link? Telecomando. Strutture per la gestione/accesso alla struttura. Quando passi un riferimento a un oggetto a un metodo, stai passando una copia del riferimento. Clone del telecomando. L'oggetto è ancora nella pila in cui è stato creato, in attesa che qualcuno usi il telecomando. Alla struttura non interessa quanti telecomandi sono "programmati" per controllarla. Le uniche persone a cui importa questo sono il netturbino e tu, il programmatore. Quindi quando dici:
Cat A = new Cat ();
doStuff (А);

void doStuff (Cat B) {

   / / Использование B
}
Esiste un solo oggetto Cat . Ma ora due telecomandi (link) possono accedere allo stesso oggetto Cat . Quindi ora qualunque cosa B faccia all'oggetto Cat influenzerà il Cat puntato da A , ma non influenzerà il contenuto di A ! Puoi cambiare Cat usando il nuovo collegamento B (copiato direttamente da A ), ma non puoi cambiare A. cosa diavolo significa? Puoi modificare l'oggetto a cui A fa riferimento , ma non puoi modificare il riferimento di A : reindirizzalo a un altro oggetto o null . Pertanto, se modifichi il riferimento di B (non l' oggetto Cat effettivo a cui B fa riferimento , ma il valore del riferimento stesso) non modificherai il valore di A . E viceversa. COSÌ:
Cat A = new Cat ();
doStuff (А);

void doStuff (Cat B) {

   B = new Cat (); / / Не повлияет на ссылку A
}
Significa semplicemente che B punta a un altro oggetto. A è ancora felice. Quindi ripeti dopo di me: Java passa tutto per valore. (Va bene, ancora una volta... con sentimento.) Java trasmette tutto per valore. Per i tipi primitivi si passa una copia del valore corrente, per i riferimenti a oggetti si passa una copia del riferimento (controllo remoto). Non passi mai l'oggetto. Tutti gli oggetti vengono archiviati nell'heap. Sempre. Ora prepara una tazza di caffè abbondante e scrivi un po' di codice! Articolo originale .
Commenti
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION