Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Redmi Note 15 Pro+ 5G: autonomia monstre e display luminoso, ma il prezzo è alto
Redmi Note 15 Pro+ 5G: autonomia monstre e display luminoso, ma il prezzo è alto
Xiaomi ha portato sul mercato internazionale la nuova serie Redmi Note, che rappresenta spesso una delle migliori scelte per chi non vuole spendere molto. Il modello 15 Pro+ punta tutto su una batteria capiente e su un ampio display luminoso, sacrificando qualcosa in termini di potenza bruta e velocità di ricarica
HONOR Magic 8 Pro: ecco il primo TOP del 2026! La recensione
HONOR Magic 8 Pro: ecco il primo TOP del 2026! La recensione
HONOR ha finalmente lanciato il suo nuovo flagship: Magic 8 Pro. Lo abbiamo provato a fondo in queste settimane e ve lo raccontiamo nella nostra recensione completa. HONOR rimane fedele alle linee della versione precedente, aggiungendo però un nuovo tasto dedicato all'AI. Ma è al suo interno che c'è la vera rivoluzione grazie al nuovo Snapdragon 8 Elite Gen 5 e alla nuova MagicOS 10
Insta360 Link 2 Pro e 2C Pro: le webcam 4K che ti seguono, anche con gimbal integrata
Insta360 Link 2 Pro e 2C Pro: le webcam 4K che ti seguono, anche con gimbal integrata
Le webcam Insta360 Link 2 Pro e Link 2C Pro sono una proposta di fascia alta per chi cerca qualità 4K e tracciamento automatico del soggetto senza ricorrere a configurazioni complesse. Entrambi i modelli condividono sensore, ottiche e funzionalità audio avanzate, differenziandosi per il sistema di tracciamento: gimbal a due assi sul modello Link 2 Pro, soluzione digitale sul 2C Pro
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: 2785
Quote:
Originariamente inviato da luxorl Guarda i messaggi
Giusto?
wingman87 è online   Rispondi citando il messaggio o parte di esso
 Rispondi


Redmi Note 15 Pro+ 5G: autonomia monstre e display luminoso, ma il prezzo è alto Redmi Note 15 Pro+ 5G: autonomia monstre e displ...
HONOR Magic 8 Pro: ecco il primo TOP del 2026! La recensione HONOR Magic 8 Pro: ecco il primo TOP del 2026! L...
Insta360 Link 2 Pro e 2C Pro: le webcam 4K che ti seguono, anche con gimbal integrata Insta360 Link 2 Pro e 2C Pro: le webcam 4K che t...
Motorola edge 70: lo smartphone ultrasottile che non rinuncia a batteria e concretezza Motorola edge 70: lo smartphone ultrasottile che...
Display, mini PC, periferiche e networking: le novità ASUS al CES 2026 Display, mini PC, periferiche e networking: le n...
Offerte Amazon pazzesche: tech, smartpho...
Ubisoft annuncia l'arrivo dei 60 fps per...
Infratel Italia: ecco la nuova mappa del...
Hoover HMC5 in offerta: il battimaterass...
Un'idea 'rivoluzionaria' dal Politecnico...
Steam ha registrato un record di ricavi ...
'Quando sei pronto… vai': ChatGPT sotto ...
Razer: l'intelligenza artificiale piace ...
Disastro Rad Power Bikes: incendio al ma...
Speciale Braun in offerta su Amazon: reg...
Threads cresce e batte X su mobile a liv...
Televisori, asse Sony - TCL: c'è ...
Uso del carbone in calo in Cina e India ...
Una potente tempesta solare colpisce la ...
Italo fa la storia: Starlink arriver&agr...
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: 14:45.


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