Visualizzazione dei risultati da 1 a 7 su 7
  1. #1
    Utente di HTML.it
    Registrato dal
    Oct 2011
    Messaggi
    590

    passaggio per riferimento o per valore

    salve, da quel che ricordo in java non esiste il concetto di puntatore, anche se due variabili possono riferirsi allo stesso oggetto.
    esempio:
    codice:
     int a[]=new int[10];
    int b[]=a;
    così a e b si riferiscono allo stesso array e quindi operando su b[] opero anche su a[], giusto?

    ora il tema del thread:
    io so che in java esiste solo lo "scambio per valore", ossia al metodo è possibile passare il valore di una variabile/oggetto, non il riferimento.
    avendo quindi un metodo che vuole restituire il primo elemento dell'array e impostarlo a 0:
    codice:
    public int returnFirst(int[] array){
    int tmp=array[0];
    array[0]=0;
    return tmp;
    }
    dopo l'esecuzione di questo metodo il primo elemento dell'array nella funzione main chiamante è stato modificato dal metodo o no?

  2. #2
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802
    Quote Originariamente inviata da jimbo0 Visualizza il messaggio
    dopo l'esecuzione di questo metodo il primo elemento dell'array nella funzione main chiamante è stato modificato dal metodo o no?
    Certo. Potevi vederlo da te provando ad eseguirlo comunque...
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

  3. #3
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,280
    Quote Originariamente inviata da jimbo0 Visualizza il messaggio
    in java non esiste il concetto di puntatore
    Non esistono i puntatori come in C/C++ ... esistono i "reference" che sotto sotto alla fin fine sono degli "indirizzi" gestiti dalla JVM. Ma non hai il controllo (la "aritmetica" dei puntatori) come in C/C++.

    Quote Originariamente inviata da jimbo0 Visualizza il messaggio
    anche se due variabili possono riferirsi allo stesso oggetto.
    così a e b si riferiscono allo stesso array e quindi operando su b[] opero anche su a[], giusto?
    Sì.

    Quote Originariamente inviata da jimbo0 Visualizza il messaggio
    io so che in java esiste solo lo "scambio per valore", ossia al metodo è possibile passare il valore di una variabile/oggetto, non il riferimento.
    Per essere precisi, viene sempre passata una copia del valore. E se si tratta di un reference, viene passata una copia del valore del reference, ovvero chiamante e chiamato hanno entrambi il riferimento allo stesso oggetto.

    Quote Originariamente inviata da jimbo0 Visualizza il messaggio
    avendo quindi un metodo che vuole restituire il primo elemento dell'array e impostarlo a 0:
    codice:
    public int returnFirst(int[] array){
    int tmp=array[0];
    array[0]=0;
    return tmp;
    }
    dopo l'esecuzione di questo metodo il primo elemento dell'array nella funzione main chiamante è stato modificato dal metodo o no?
    Sì, viene modificato dalla assegnazione a array[0]. E anche il chiamante che ha passato l'array "vede" la modifica (se ha e tiene il reference all'array, ovvio).
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  4. #4
    Utente di HTML.it
    Registrato dal
    Oct 2011
    Messaggi
    590
    Quote Originariamente inviata da andbin Visualizza il messaggio
    Per essere precisi, viene sempre passata una copia del valore. E se si tratta di un reference, viene passata una copia del valore del reference, ovvero chiamante e chiamato hanno entrambi il riferimento allo stesso oggetto.

    mi spieghi con un piccolo esempio questo passaggio? uno stesso array posso passarlo in due modi?

  5. #5
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,280
    Quote Originariamente inviata da jimbo0 Visualizza il messaggio
    mi spieghi con un piccolo esempio questo passaggio? uno stesso array posso passarlo in due modi?
    Non ci sono 2 modi .... solo 1!

    codice:
    public void chiamante() {
        int[] arr = { 1, 2, 3 };
        chiamato(arr);
    }
    
    public void chiamato(int[] interi) {
       ....
    }

    In chiamante, arr ha un valore, quale esso sia non ha molta importanza (per il programmatore). Quando chiamato viene invocato, viene passata una copia del valore. Ovvero anche il parametro interi ha lo stesso valore contenuto in arr. Ma sono 2 variabili distinte, questo è il senso della "copia". Se assegni un altro reference ad 'interi', non cambi il valore di 'arr' in chiamante.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  6. #6
    Utente di HTML.it
    Registrato dal
    Oct 2011
    Messaggi
    590
    Quote Originariamente inviata da andbin Visualizza il messaggio
    Non ci sono 2 modi .... solo 1!

    codice:
    public void chiamante() {
        int[] arr = { 1, 2, 3 };
        chiamato(arr);
    }
    
    public void chiamato(int[] interi) {
       ....
    }

    In chiamante, arr ha un valore, quale esso sia non ha molta importanza (per il programmatore). Quando chiamato viene invocato, viene passata una copia del valore. Ovvero anche il parametro interi ha lo stesso valore contenuto in arr. Ma sono 2 variabili distinte, questo è il senso della "copia". Se assegni un altro reference ad 'interi', non cambi il valore di 'arr' in chiamante.
    ok, quindi posso assegnare un altro reference ad "interi" ma se in chiamato() c'è interi[1]=99; modifico anche arr[], ho capito bene?

    questo concetto mi risulta un po' ostico perché mi pareva di ricordare che in java ci sono casi in cui quando si passa ad una funzione un oggetto/variabile questo rimane immutato nella funzione chiamante..

  7. #7
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,280
    Quote Originariamente inviata da jimbo0 Visualizza il messaggio
    se in chiamato() c'è interi[1]=99; modifico anche arr[], ho capito bene?
    Sì, esatto.

    Quote Originariamente inviata da jimbo0 Visualizza il messaggio
    in java ci sono casi in cui quando si passa ad una funzione un oggetto/variabile questo rimane immutato nella funzione chiamante..
    Questo riguarda solo il fatto che un oggetto sia "mutabile" oppure no. Dipende da come è fatta la classe. String ad esempio è immutabile ma semplicemente perché non c'è alcun metodo setQualcosa (o altro con qualunque altro nome) che va a modificare lo "stato" dell'oggetto ovvero le sue variabili di istanza.

    In sostanza alla fin fine: il metodo/costruttore chiamato ha un reference uguale a quello che ha il chiamante. Non può cambiare le variabili locali nel chiamante ma se l'oggetto è "mutabile" può cambiarne lo stato.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

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.