|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Oct 2003
Città: Pisa/Cosenza
Messaggi: 1364
|
[Java] Object a=b ...che succede?
Ciao se creo due oggetti in java e poi faccio:
a=b; Cosa succede? Copio il riferimento o duplico l'oggetto? Da questo test che ho fatto: Codice:
public class test{
public static void main(String args[]){
Object x=new Object();
Object y=new Object();
//confronto se hanno lo stesso riferimento ---> NO
if(x==y) System.out.println("YES");
else System.out.println("NO");
System.out.println();
x=y;
//confronto se hanno lo stesso riferimento ---> SI
if(x==y) System.out.println("YES");
else System.out.println("NO");
System.out.println();
y="Yahoo";
x="AUGH";
System.out.println();
System.out.println(y);
System.out.println(x);
}
}
__________________
|
|
|
|
|
|
#2 |
|
Member
Iscritto dal: Jul 2008
Messaggi: 237
|
La questione è piuttosto semplice. Tu crei due oggetti e li assegni a due variabili. Il punto è che una variabile contiene un riferimento all'oggetto e se modifichi il valore della variabile non modifichi l'oggetto a cui punta, ma semplicemente sostituisci il riferimento. Quel che tu avevi in mente si vede invece con quest'esempio:
Codice:
public class Foo
{
public Foo(int x) { Bar = x; }
public int Bar;
}
//...da qualche altra parte, ad es nel main
Foo x = new Foo(5);
Foo y = x;
x.Bar = 3;
System.out.println(y.Bar.toString());
Scrivendo Codice:
Foo x = new Foo(5); Foo y = new Foo(5); y.Bar = 3; System.out.println(x.Bar.toString()); System.out.println(y.Bar.toString()); Infine se scrivi Codice:
Foo x = new Foo(5); Foo y = x; y = new Foo(4); System.out.println(x.Bar.toString()); Per duplicare oggetti puoi usare .clone() laddove disponibile. |
|
|
|
|
|
#3 |
|
Junior Member
Iscritto dal: Feb 2008
Messaggi: 5
|
visto che sono anche un pò io il produttore della domanda, ti rilancio un'altro quesito.
Il problema nasce nel caso di oggetti dichiarati come Object Codice:
Object Ibuffer; Object Sbuffer; Object m = 4; Ibuffer = m; Sbuffer = Ibuffer; //l'oggetto viene duplicato??? Ibuffer = "test modifica"; System.out.println(Sbuffer + " --- " + Ibuffer); in particolare Sbuffer contiene 4 e Ibuffer contiene "test modifica" è possibili che gli oggetti usati direttamente come Object abbiano un comportamento diverso da quello "standard"? ------- Mi sono accorto, mentre scrivevo la domanda, dell'errore. Scrivere Codice:
Ibuffer = "test modifica"; Codice:
Ibuffer = new Object("test modifica");
|
|
|
|
|
|
#4 | |
|
Senior Member
Iscritto dal: Oct 2003
Città: Pisa/Cosenza
Messaggi: 1364
|
Quote:
Codice:
x="augh"
__________________
|
|
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Oct 2006
Città: Roma
Messaggi: 1383
|
le stringhe in Java sono oggetti immutabili: quando riassegni "Yahoo" a y e "AUGH" a x non stai modificando il contenuto delle due stringhe, ma stai assegnando a x e y due nuovi oggetti stringa (anch'essi immutabili).
|
|
|
|
|
|
#6 | |
|
Senior Member
Iscritto dal: Oct 2003
Città: Pisa/Cosenza
Messaggi: 1364
|
Quote:
Giusto?
__________________
|
|
|
|
|
|
|
#7 |
|
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
Codice:
public class test{
public static void main(String args[]){
Object x=new Object();
Object y=new Object();
'x' è stata fatta puntare a un nuovo Object, e 'y' è stata fatta puntare a un altro nuovo Object. Notare quindi, che la parte a sinistra dell'assegnamento è la reference e la parte a destra dell'assegnamento è una istanza (un oggetto istanziato) Codice:
//confronto se hanno lo stesso riferimento ---> NO
if(x==y) System.out.println("YES");
else System.out.println("NO");
la reference 'x' punta a un'istanza di Object diversa da quella a cui punta la reference 'y'. Codice:
System.out.println(); x=y; In questo caso stiamo assegnando alla reference 'x' l'istanza puntata dalla reference 'y'. La vecchia istanza di Object puntata da 'x' resta così senza riferimenti, e, siccome parliamo di Java, diventa eleggibile per essere garbage-collected. Codice:
//confronto se hanno lo stesso riferimento ---> SI
if(x==y) System.out.println("YES");
else System.out.println("NO");
System.out.println();
Codice:
y="Yahoo"; x="AUGH"; Anche la a reference 'y' viene fatta puntare a una nuova istanza. Anche in questo caso si sta assegnado un letterale di tipo String, diverso dal precedente. Parliamo quindi della creazione di due istanze diverse di tipo String. La vecchia istanza di Object puntata da 'x' e 'y' resta ora senza riferimenti diventando in teoria eleggibile per essere garbage-collected. Codice:
System.out.println(); System.out.println(y); System.out.println(x); } }
__________________
As long as you are basically literate in programming, you should be able to express any logical relationship you understand. If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it. (Chris Crawford) Ultima modifica di banryu79 : 09-06-2009 alle 16:48. |
|
|
|
|
|
#8 |
|
Member
Iscritto dal: Jul 2008
Messaggi: 237
|
Tutto il problema sta nella confusione tra una variabile che punta ad un oggetto e l'oggetto stesso. La variabile è un po' come un puntatore in C, io posso riassegnarlo e puntare a qualcos'altro senza cambiare il contenuto della memoria a cui puntava precedentemente. Quanto alla domanda ricorrente "l'oggetto viene duplicato" la risposta è semplicemente *NO*. Solo implementando funzioni specifiche (vd. clone) un oggetto può venire duplicato, diversamente è sempre lo stesso riferimento che viene passato in giro per variabili ed argomenti.
|
|
|
|
|
|
#9 |
|
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
Usando una terminologia "Javista" più precisa, si parla di reference/riferimenti e istanze di oggetto.
Tenuta da conto questa distinzione, e il fatto che il passaggio dei parametri avviene sempre per valore [passaggio per valore di un tipo primitivo oppure passaggio per valore di un riferimento] quando si legge un sorgente non dovrebbero esserci più problemi/confusioni di sorta. E sì, le references in Java sono simili ai puntatori in C (solo non è possibile l'aritmetica dei puntatori).
__________________
As long as you are basically literate in programming, you should be able to express any logical relationship you understand. If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it. (Chris Crawford) |
|
|
|
|
|
#10 |
|
Member
Iscritto dal: Jul 2008
Messaggi: 237
|
Visto che sei entrato nel tema del passaggio dei parametri, che in Java come in C# è di default per valore e non per riferimento, posto questo link che credo possa chiarire qualche dubbio ai neofiti (a loro agio con l'Inglese): http://www.yoda.arachsys.com/java/passing.html
|
|
|
|
|
|
#11 |
|
Senior Member
Iscritto dal: Nov 2005
Messaggi: 2780
|
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 01:36.




















