Domanda AIUTO variabli reference

Stato
Discussione chiusa ad ulteriori risposte.

examinedcastle

Utente Electrum
5 Luglio 2014
158
36
14
122
Salve ragazzi, sto studiando il java e proprio non capisco questo tipo di variabili! Per iniziare sto leggendo "Java mattone dopo mattone", e mi sono imbattuto in questo argomento c'è qualcuno così gentile da spiegarmi meglio cosa sono queste variabili, a cosa servono? introducendo anche l'auto referenza esplicita ed implicita che proprio non capisco..
Spero qualcuno mi aiuti grazie mille :patt:
 
Java passa le variabili solo tramite valore(pass-by-value), mentre le istanze degli oggetti tramite una referenza. Se per esempio devi passare un oggetto ad un metodo per cambiarne una proprietà, la proprietà modificata sarà quella dell'istanza passata:
Codice:
static void cambiaOggetto(MioOggetto obj){
     obj.stringa = "ciao";
}
In questo caso passando un'istanza di MioOggetto a cambiaOggetto automaticamente la stringa cambierà non solo all'interno del metodo ma per l'istanza corrente, ipotizzando che tu inizializzi la proprietà stringa nel costrutto dell'oggetto facendo una cosa di questo tipo:
Codice:
MioOggetto mo = new MioOggetto("hey");
System.out.println(mo.stringa);
cambiaOggetto(mo);
System.out.println(mo.stringa);

Vedrai stamparti:
Codice:
hey
ciao
 
Java passa le variabili solo tramite valore(pass-by-value), mentre le istanze degli oggetti tramite una referenza. Se per esempio devi passare un oggetto ad un metodo per cambiarne una proprietà, la proprietà modificata sarà quella dell'istanza passata:
Codice:
static void cambiaOggetto(MioOggetto obj){
     obj.stringa = "ciao";
}
In questo caso passando un'istanza di MioOggetto a cambiaOggetto automaticamente la stringa cambierà non solo all'interno del metodo ma per l'istanza corrente, ipotizzando che tu inizializzi la proprietà stringa nel costrutto dell'oggetto facendo una cosa di questo tipo:
Codice:
MioOggetto mo = new MioOggetto("hey");
System.out.println(mo.stringa);
cambiaOggetto(mo);
System.out.println(mo.stringa);

Vedrai stamparti:
Codice:
hey
ciao
Scusa se per te queste sono domande basilari ma se non capisco bene adesso in futuro mi ritroverei con vari buchi ahahaha in questo caso la variabile reference qual è?
Ho studiato il python esiste qualcosa di simile in python giusto come riferimento per capire..?
Che differenza intercorre tra variabile-valore e oggetto-istanza?
Grazie ancora [MENTION=206603]xSplit[/MENTION]
 
Ultima modifica:
Scusa se per te queste sono domande basilari ma se non capisco bene adesso in futuro mi ritroverei con vari buchi ahahaha in questo caso la variabile reference qual è?
Ho studiato il python esiste qualcosa di simile in python giusto come riferimento per capire..?
Che differenza intercorre tra variabile-valore e oggetto-istanza?
Grazie ancora @xSplit
Ogni istanza è una referenza, la jvm crea l'oggetto e lo alloca nell'heap per poi tornare con la sua referenza che altro non è che un puntatore quindi un indirizzo di memoria virtuale dove risiede l'oggetto, ogni cosa in java è passata come valore anche le referenze.
In python credo tu possa fare la stessa cosa dato che segue lo stesso principio del java.

Codice:
MioOggetto obj = new MioOggetto();
Qui noi creiamo un oggetto e otteniamo una referenza(puntatore)

Codice:
int val = 10;
Qui invece un valore(che andrà nello stack)

Codice:
void metodo([COLOR=#333333]MioOggetto[/COLOR] oggetto){
     oggetto.stringa = "valore 1"; //puntatore -> variabile = nuovo valore
     oggetto = new [COLOR=#333333]MioOggetto[/COLOR](); //oggetto è ora il puntatore dell'istanza locale di [COLOR=#333333]MioOggetto[/COLOR]
     oggetto.stringa = "valore 2"; //nuovo puntatore -> variabile = nuovo valore
}
Se adesso passassimo a metodo una referenza di MioOggetto il nostro oggetto muterà la proprietà stringa con "valore 1" mentre la nuova istanza andrà a finire nel garbage collector, spero di essere stato abbastanza esplicativo.
 
Ricapitolando ogni istanza è una referenza e una referenza è uno spazio virtuale dove allocare il valore referenziato..o mi sbaglio? La referenza e puntatore sono la stessa cosa?
Comunque sto iniziando a capire ahahaha [MENTION=206603]xSplit[/MENTION]
 
Ultima modifica:
Ricapitolando ogni istanza è una referenza e una referenza è uno spazio virtuale dove allocare il valore referenziato..o mi sbaglio? La referenza e puntatore sono la stessa cosa?
Comunque sto iniziando a capire ahahaha @xSplit
Ogni istanza ottiene una referenza che fa da puntatore per l'oggetto, la referenza contiene l'indirizzo dell'oggetto nella memoria virtuale.


Come in c++ in pratica quello che avviene nel metodo sarebbe
Codice:
void metodo(MioOggetto &var){
    //...
}
Solo che java lo fa passando solo il valore e quindi non cambia la referenza in caso si dichiari un nuovo oggetto.
 
Ogni istanza ottiene una referenza che fa da puntatore per l'oggetto, la referenza contiene l'indirizzo dell'oggetto nella memoria virtuale.


Funziona esattamente come in C, in pratica quello che avviene nel metodo sarebbe
Codice:
void metodo(MioOggetto &var){
    //...
}
Solo che java lo fa passando solo il valore e quindi non cambia la referenza in caso si dichiari un nuovo oggetto.
una cosa tu nell'esempio precedente quando hai creato il metodo "metodo" con parametri(miooggetto oggetto), hai cambiato il valore dell'oggetto "oggetto" in valore 1, poi hai creato un nuovo oggetto all'interno di miooggetto e lo hai assegnato a oggetto e hai cambiato il valore dell'oggetto "oggetto" in "valore 2"....ora quindi se passiamo a metodo una referenza a miooggetto la mia domanda è " perchè la proprietà dell'oggetto muta a "valore 1" facendo finire la proprietà "valore 2" nel Gc? Pensavo dovesse accadere l'incontrario!Ovvero nel Gc ci dovesse finire la prima proprietà in quanto successivamente viene creata una nuova referenza all'ggetto e gli vieni cambiato valore...ma non è così...ora mi chiedo perchè? Forse perchè la referenza passata al metodo è diversa da quella creata all'interno del metodo?
 
Ogni istanza ottiene una referenza che fa da puntatore per l'oggetto, la referenza contiene l'indirizzo dell'oggetto nella memoria virtuale.


Funziona esattamente come in C, in pratica quello che avviene nel metodo sarebbe
Codice:
void metodo(MioOggetto &var){
    //...
}
Solo che java lo fa passando solo il valore e quindi non cambia la referenza in caso si dichiari un nuovo oggetto.
c++ magari
 
una cosa tu nell'esempio precedente quando hai creato il metodo "metodo" con parametri(miooggetto oggetto), hai cambiato il valore dell'oggetto "oggetto" in valore 1, poi hai creato un nuovo oggetto all'interno di miooggetto e lo hai assegnato a oggetto e hai cambiato il valore dell'oggetto "oggetto" in "valore 2"....ora quindi se passiamo a metodo una referenza a miooggetto la mia domanda è " perchè la proprietà dell'oggetto muta a "valore 1" facendo finire la proprietà "valore 2" nel Gc? Pensavo dovesse accadere l'incontrario!Ovvero nel Gc ci dovesse finire la prima proprietà in quanto successivamente viene creata una nuova referenza all'ggetto e gli vieni cambiato valore...ma non è così...ora mi chiedo perchè? Forse perchè la referenza passata al metodo è diversa da quella creata all'interno del metodo?
Io non ho cambiato il valore dell'oggetto, ho cambiato una proprietà relativa alla stessa referenza che gli è stata passata e successivamente ho dichiarato una nuova istanza dell'oggetto, ma dato che la nuova istanza una volta che il metodo finisce di eseguire non viene più usata il gc automaticamente la candida per la rimozione.
 
Stato
Discussione chiusa ad ulteriori risposte.