Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Polestar 3 Performance, test drive: comodità e potenza possono convivere
Polestar 3 Performance, test drive: comodità e potenza possono convivere
Abbiamo passato diversi giorni alla guida di Polestar 3, usata in tutti i contesti. Come auto di tutti i giorni è comodissima, ma se si libera tutta la potenza è stupefacente
Qualcomm Snapdragon X2 Elite: l'architettura del SoC per i notebook del 2026
Qualcomm Snapdragon X2 Elite: l'architettura del SoC per i notebook del 2026
In occasione del proprio Architecture Deep Dive 2025 Qualcomm ha mostrato in dettaglio l'architettura della propria prossima generazione di SoC destinati ai notebook Windows for ARM di prossima generazione. Snapdragon X2 Elite si candida, con sistemi in commercio nella prima metà del 2026, a portare nuove soluzioni nel mondo dei notebook sottili con grande autonomia
Recensione DJI Mini 5 Pro: il drone C0 ultra-leggero con sensore da 1 pollice
Recensione DJI Mini 5 Pro: il drone C0 ultra-leggero con sensore da 1 pollice
DJI Mini 5 Pro porta nella serie Mini il primo sensore CMOS da 1 pollice, unendo qualità d'immagine professionale alla portabilità estrema tipica di tutti i prodotti della famiglia. È un drone C0, quindi in un peso estremamente contenuto e che non richiede patentino, propone un gimbal rotabile a 225 gradi, rilevamento ostacoli anche notturno e autonomia fino a 36 minuti. Caratteristiche che rendono il nuovo drone un riferimento per creator e appassionati
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 09-06-2009, 11:43   #1
luxorl
Senior Member
 
L'Avatar di luxorl
 
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);

	}

}
i due oggetti hanno lo stesso riferimento ma se modifico uno non tocco l'altro... mi chiarite le idee per favore?
__________________
luxorl è offline   Rispondi citando il messaggio o parte di esso
Old 09-06-2009, 12:00   #2
!k-0t1c!
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());
Questo codice stampa 3 perché y ha un riferimento allo stesso oggetto a cui punta x ed è l'oggetto stesso (un suo field) a venire modificato.
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());
vedresti invece stampato prima 5 e poi 3 perché hai creato due oggetti diversi e ne hai modificato uno solo.
Infine se scrivi
Codice:
Foo x = new Foo(5);
Foo y = x;
y = new Foo(4);
System.out.println(x.Bar.toString());
vedrai stampato 5 e non 4 perché tu hai semplicemente riassegnato y, ed y non *è* l'oggetto puntato da x ma *punta* a quell'oggetto quindi riassegnando y non cambi x né l'oggetto a cui x punta.
Per duplicare oggetti puoi usare .clone() laddove disponibile.
!k-0t1c! è offline   Rispondi citando il messaggio o parte di esso
Old 09-06-2009, 12:49   #3
Axel-84
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 questo caso vengono stampati due valori diversi...
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";
equivale sostanzialmente a
Codice:
Ibuffer = new Object("test modifica");
Axel-84 è offline   Rispondi citando il messaggio o parte di esso
Old 09-06-2009, 12:52   #4
luxorl
Senior Member
 
L'Avatar di luxorl
 
Iscritto dal: Oct 2003
Città: Pisa/Cosenza
Messaggi: 1364
Quote:
Originariamente inviato da !k-0t1c! Guarda i messaggi
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.
In pratica il mio esempio non funziona perché facendo:

Codice:
x="augh"
sostituisco NUOVAMENTE il riferimento della variabile facendolo puntare all'oggetto stringa "augh" ?
__________________
luxorl è offline   Rispondi citando il messaggio o parte di esso
Old 09-06-2009, 12:56   #5
fero86
Senior Member
 
Iscritto dal: Oct 2006
Città: Roma
Messaggi: 1383
Quote:
Originariamente inviato da luxorl Guarda i messaggi
i due oggetti hanno lo stesso riferimento ma se modifico uno non tocco l'altro... mi chiarite le idee per favore?
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).
fero86 è offline   Rispondi citando il messaggio o parte di esso
Old 09-06-2009, 13:01   #6
luxorl
Senior Member
 
L'Avatar di luxorl
 
Iscritto dal: Oct 2003
Città: Pisa/Cosenza
Messaggi: 1364
Quote:
Originariamente inviato da fero86 Guarda i messaggi
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).

Quote:
Originariamente inviato da luxorl Guarda i messaggi
In pratica il mio esempio non funziona perché facendo:

Codice:
x="augh"
sostituisco NUOVAMENTE il riferimento della variabile facendolo puntare all'oggetto stringa "augh" ?
Giusto?
__________________
luxorl è offline   Rispondi citando il messaggio o parte di esso
Old 09-06-2009, 13:09   #7
banryu79
Senior Member
 
L'Avatar di banryu79
 
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();
Sono state create due reference, di tipo Object, di nome 'x' e 'y'.
'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");
Qui si usa l'operatore di uguaglianza '==' che confronta istanze.
la reference 'x' punta a un'istanza di Object diversa da quella a cui punta la reference 'y'.

Codice:
		System.out.println();

		x=y;
Qui c'è un assegnamento. Ricordando che la parte a sinistra è la reference a cui si assegna una istanza, la parte a destra viene risolta come l'istanza da assegnare.
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();
Chiaramente ora sia 'x' che 'y' puntano alla stessa istanza, quindi si verifica l'uguaglianza.

Codice:
		y="Yahoo";
		x="AUGH";
La reference 'x' viene nuovamente fatta puntare a una nuova istanza. In questo caso si sta assegnado un letterale di tipo String.
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);

	}

}
Qui vengono stampate le due istanze di tipo String create al passaggio precedente. Prima viene stampata l'istanza puntata da 'y', poi quella da '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.
banryu79 è offline   Rispondi citando il messaggio o parte di esso
Old 09-06-2009, 13:41   #8
!k-0t1c!
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.
!k-0t1c! è offline   Rispondi citando il messaggio o parte di esso
Old 09-06-2009, 14:13   #9
banryu79
Senior Member
 
L'Avatar di banryu79
 
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)
banryu79 è offline   Rispondi citando il messaggio o parte di esso
Old 09-06-2009, 14:37   #10
!k-0t1c!
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
!k-0t1c! è offline   Rispondi citando il messaggio o parte di esso
Old 09-06-2009, 14:42   #11
wingman87
Senior Member
 
Iscritto dal: Nov 2005
Messaggi: 2780
Quote:
Originariamente inviato da luxorl Guarda i messaggi
Giusto?
wingman87 è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Polestar 3 Performance, test drive: comodità e potenza possono convivere Polestar 3 Performance, test drive: comodit&agra...
Qualcomm Snapdragon X2 Elite: l'architettura del SoC per i notebook del 2026 Qualcomm Snapdragon X2 Elite: l'architettura del...
Recensione DJI Mini 5 Pro: il drone C0 ultra-leggero con sensore da 1 pollice Recensione DJI Mini 5 Pro: il drone C0 ultra-leg...
ASUS Expertbook PM3: il notebook robusto per le aziende ASUS Expertbook PM3: il notebook robusto per le ...
Test ride con Gowow Ori: elettrico e off-road vanno incredibilmente d'accordo Test ride con Gowow Ori: elettrico e off-road va...
ESA: rilevati 40 mila asteroidi vicino a...
La batteria salva fabbriche di EQORE ott...
SpaceX Starship: iniziati i test della t...
Datacenter IA nello spazio entro 5 anni,...
Telescopio spaziale James Webb: rilevato...
Ericsson Mobility Report: nel 2025 il 5G...
PLAI DEMO DAY: si chiude il secondo cicl...
Google rilascia Nano Banana Pro: il nuov...
ChatGPT si rinnova ancora: disponibile l...
Ring lancia super sconti di Black Friday...
Black Friday 2025: 450 euro di sconto su...
Tutte le offerte Blink in un unico posto...
OpenAI e Foxconn uniscono le forze per r...
Ricarica delle auto elettriche in 3 minu...
Lucid presenta Gravity Touring, il SUV e...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 01:36.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Served by www3v