Pagina 2 di 2 primaprima 1 2
Visualizzazione dei risultati da 11 a 20 su 20

Discussione: utilizzo dei reference

  1. #11
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da newutente Visualizza il messaggio
    far puntare due oggetti di tipo diverso alla stessa locazione di memoria
    Questo che hai detto non ha praticamente senso.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  2. #12
    Utente di HTML.it
    Registrato dal
    Oct 2014
    Messaggi
    315
    vabbè ci devo ragionare un po' su.

  3. #13
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da newutente Visualizza il messaggio
    Allora, se ho la necessità di far puntare due oggetti dello stesso tipo alla stessa locazione di memoria devo utilizzare istruzioni di questo tipo:
    codice:
    Data oggetto1 = new Data();
    Data oggetto2 = oggetto1;
    Sperando di chiarirti le idee: qui non hai due oggetti! Ne hai solo uno e dopo la seconda riga, hai due variabili reference con lo stesso valore, ovvero fanno riferimento entrambe allo stesso oggetto.

    Se successivamente assegni qualcos'altro (es. un altro nuovo oggetto Data) ad una delle due variabili, l'altra variabile non cambia e continua a fare riferimento all'oggetto Data creato alla prima riga.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  4. #14
    Utente di HTML.it
    Registrato dal
    Oct 2014
    Messaggi
    315
    Quindi, con l'istruzione
    codice:
    Data oggetto1 = new Data();
    io ho dichiarato prima una variabile e successivamente ho istanziato un oggetto. In questo modo la variabile punterà alla locazione di memoria dove si trova oggetto1, in poche parole conterrà l'indirizzo di memoria dove si trova oggetto1.

    Con l'istruzione
    codice:
    Data oggetto2 = oggetto1;
    vado a dichiarare una seconda variabile ma anzichè farla puntare ad una locazione di memoria di un nuovo oggetto (questo non avviene perchè non c'è new Data()) le passo l'indirizzo di memoria dove si trova l'oggetto1 creato in precedenza.
    Quindi ci sono due variabili (oggetto1 e oggetto2) che contengono lo stesso indirizzo di memoria e a quell'indirizzo di memoria si trova l'oggetto oggetto1.

    Se poi ci fosse una terza riga di codice del tipo
    codice:
    Data oggetto2 = new Data();
    vorrebbe dire che abbiamo fatto in modo ora che la seconda variabile non punti più alla locazione di memoria dove si trova oggetto1 ma è stato creato un nuovo oggetto e che quindi la seconda variabile punta alla locazione di memoria del nuovo oggetto.

    E' corretto?

  5. #15
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Quote Originariamente inviata da newutente Visualizza il messaggio
    Quindi, con l'istruzione
    E' corretto?

    Quasi tutto...

    L'eventuale terza riga non dovrebbe ri-dichiarare la variabile "oggetto2", perchè già dichiarata precedentemente... altrimenti il compilatore darebbe un errore "oggetto2 is already defined". Per il resto mi pare corretto.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  6. #16
    Utente di HTML.it
    Registrato dal
    Oct 2014
    Messaggi
    315
    Vediamo se ho capito anche il resto. Torniamo all'esempio che ho inserito nel post #5.

    Quindi con

    codice:
    ogg.cambiaReference(dataDiNascita)
    è come se dicessi "prendi la variabile dataDiNascita che contiene l'indirizzo di memoria dove si trova l'oggetto e che quindi contiene i campi giorno, mese e anno con già i valori all'interno inseriti nelle righe precedenti".
    Tra l'altro il senso del metodo cambiaReference è appunto quello di cambiare il valore (forse sarebbe corretto dire l'indirizzo di memoria) di ogg perchè fino a quel momento ogg è una variabile che contiene l'indirizzo di una locazione di memoria diversa da dataDiNascita visto che sono state fatte due istanziazioni differenti nelle prime due righe:
    codice:
    CiProvoConIReference ogg = new CiProvoConIReference();
    Data dataDiNascita = new Data();

    successivamente con il blocco di codice

    codice:
    public class CiProvoConIReference
    {
            public void cambiaReference(Data data)
            {
                      data = new Data();
            }
    }
    è come se dicessi "lascia perdere quella locazione di memoria, crea un nuovo oggetto in modo che la variabile ogg non contenga l'indirizzo di memoria dove si trova dataDiNascita ma l'indirizzo di memoria dove si trova un nuovo oggetto che è inizializzato con valori di default". Per questa ragione dataDiNascita contiene ancora i valori inseriti in precedenza.

    E' corretto?

  7. #17
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da newutente Visualizza il messaggio
    Vediamo se ho capito anche il resto. Torniamo all'esempio che ho inserito nel post #5.

    E' corretto?
    Quando passi un oggetto ad un metodo, stai passando una copia del valore del reference. Il metodo chiamato può cambiare lo "stato" dell'oggetto (tramite qualunque metodo setter setXYZ o con altro nome che va a modificare le variabili di istanza dell'oggetto) ma NON può cambiare il valore della variabile reference che ha il chiamante.

    Con il tuo esempio in #5 il metodo cambiaReference NON può (non è proprio tecnicamente possibile) cambiare il valore di dataDiNascita che è locale e usabile solo nel contesto del chiamante.

    Pertanto in un metodo andare ad assegnare subito qualcos'altro ad un parametro (in generale ma specialmente se "reference") senza usarlo prima .... praticamente non serve a nulla e non ha senso.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  8. #18
    Utente di HTML.it
    Registrato dal
    Oct 2014
    Messaggi
    315
    Ok, quindi diciamo che è un esempio fine a se stesso.

    Ho svolto un esercizio su questo argomento (in realtà l'avevo già postato ma l'ho rifatto).

    Questa è la traccia:
    Creare una classe Risultato che dichiari una sola variabile d'istanza di tipo float e di nome risultato. Aggiungere eventuali metodi e costruttori utili. Creare una classe CambiaRisultato con un metodo public di nome cambiaRisultato() che prende in input un oggetto di tipo risultato e ne modifica la variabile interna risultato sommandola con un altro valore. Creare una classe con un metodo main() di nome TestRisultato che stampi la variabile risultato di un oggetto di tipo Risultato, prima e dopo che questo oggetto sia passato in input al metodo cambiaRisultato() di un oggetto di tipo CambiaRisultato.
    e questa è la mia soluzione:
    codice:
    public class TestRisultato
    {
        public static void main(String args[])
        {
            Risultato oggetto1 = new Risultato();
            System.out.println(oggetto1.risultato);
            CambiaRisultato oggetto2 = new CambiaRisultato();
            oggetto2.cambiaRisultato(oggetto1);
            System.out.println(oggetto1.risultato);
        }
    }
    codice:
    public class Risultato
    {
        public float risultato;
    
        public float somma()
        {
            risultato = risultato + 1;
             return(risultato);
        }
        
    }
    codice:
    public class CambiaRisultato
    {
        public void cambiaRisultato(Risultato oggetto)
        {
            oggetto.somma();    
        }
    }
    Ho fatto questo esempio perchè il metodo cambiaRisultato() va a modificare (tramite il metodo somma()) la variabile risultato dell'oggetto1 poichè l'oggetto1 viene passato in input quindi sa esattamente dove puntare, mentre non viene assolutamente modificato l'indirizzo di memoria (o reference) poichè non c'è un'istruzione del tipo oggetto = new Risultato().
    Giusto?
    Ultima modifica di newutente; 06-11-2014 a 12:53

  9. #19
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da newutente Visualizza il messaggio
    codice:
    public class CambiaRisultato
    {
        public void cambiaRisultato(Risultato oggetto)
        {
            oggetto.somma();    
        }
    }
    Questo infatti è più sensato, perché il metodo somma è effettivamente in grado di modificare lo stato dell'oggetto Risultato.

    Quote Originariamente inviata da newutente Visualizza il messaggio
    mentre non viene assolutamente modificato l'indirizzo di memoria (o reference) poichè non c'è un'istruzione del tipo oggetto = new Risultato().
    Giusto?
    Sì e ribadisco che se anche ci fosse in cambiaRisultato un oggetto = new Risultato(); quello che farebbe è semplicemente cambiare il valore del parametro che è di fatto una variabile locale del metodo, totalmente slegata da qualunque altra variabile anche del chiamante.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  10. #20
    Utente di HTML.it
    Registrato dal
    Oct 2014
    Messaggi
    315
    ok, capito.
    grazie per la spiegazione.

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.