Visualizzazione dei risultati da 1 a 4 su 4
  1. #1

    [JAVA] Passaggio per riferimento

    Ciao a tutti,
    ho un dubbio a proposito del passaggio per riferimento.
    Ecco un esempio:

    codice:
    class A{
     int val = 100; 
    
    static void incrementa(int i){
     i = i + 1; 
    } 
    
    static void annulla(A a){
     a.val = 0;
     a = null; 
    }
    
    public static void main(String[] args){
     int i = 0; 
    
    System.out.println("valore di i prima di invocare 'incrementa(i)': " + i); incrementa(i);
    System.out.println("valore di i dopo che è stato invocato 'incrementa(i)': " + i);
    System.out.println(); 
    A a = new A(); 
    System.out.println("valore di 'a' prima di invocare 'annulla(a)': " + a);
    System.out.println("valore di 'a.val' prima di invocare 'annulla(a)': " + a.val); annulla(a);
    System.out.println(); 
    System.out.println("valore di 'a' dopo che è stato invocato 'annulla(a)': " + a);
    System.out.println("valore di 'a.val' dopo che è stato invocato 'annulla(a)': " + a.val); } 
    }
    Eseguendo questo codice si può notare che l'istruzione "a=null;" contenuta nel metodo "annulla", viene eseguita ma l'oggetto "a" all'interno del main non viene distrutto come ci si aspetterebbe facendo puntare a null l'oggetto "a".
    Come mai?
    Se metto la stessa istruzione all'interno del main invece l'oggetto perde il riferimento e quindi di fatto non esiste più.

    Qualcuno mi sa togliere questo dubbio?
    Grazie!!
    FV

  2. #2
    Utente di HTML.it
    Registrato dal
    Oct 2011
    Messaggi
    347
    Succede questo perchè tu passi il riferimento all'oggetto, ma quel riferimento (cioè a) nel metodo diventa una variabile interna del metodo stesso! Quindi finche quella variabile punta al tuo oggetto, lo puoi modificare, ma quando viene eseguito a = null tu dici alla variabile interna di non puntare più quell'oggetto, ma non modifichi la variabile esterna, cioè quella contenuta nel main. Spero di essere stato chiaro

  3. #3
    John360 sei stato molto chiaro, grazie!
    Dunque, se ho capito bene, all'interno del metodo "annulla" si crea una copia della variabile che rappresenta l'indirizzo dell'oggetto che ho passato per riferimento. Se tramite questa copia modifico gli attributi dell'oggetto (per esempio quando faccio dall'interno del metodo "a.val = 0;") questi vengono modificati perchè essa punta all'oggetto passato per riferimento. Ma se modifico la variabile in sè, (quando faccio a=null sto agendo sulla copia e quindi quella modifica ha valore solo per la copia e non per la variabile esterna che contiene ancora l'indirizzo corretto dell'oggetto.

    Dimmi se sbaglio, ma in questo senso capisco anche le molte discussioni a proposito del passaggio per valore o per riferimento degli oggetti in JAVA. Di fatto JAVA crea una copia dell'indirizzo dell'oggetto e usa quella all'interno del metodo (e dunque si potrebbe parlare di passaggio per valore), però essendo quella copia di fatto un puntatore si parla giustamente di passaggio per riferimento, tranne per l'eccezione del caso che ho sopra riportato che evidenzia questo meccanismo.
    Dico bene?

    Grazie ancora e buona serata!
    FV

  4. #4
    Utente di HTML.it
    Registrato dal
    Oct 2011
    Messaggi
    347
    PERFETTO! Hai capito proprio quello che volevo dire! Sono contento di essermi spiegato bene! Il fatto che non ci siano puntatori in java è proprio per semplificare la programmazione ma alcune volte ci sono delle sottigliezze che vanno capite

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.