Newsgroup: it.comp.java
Titolo: Esercizio di confronto

Ciao a tutti,
sto studiando java e avrei bisogno di un 
aiutino sul seguente esercizio.
Prendendo ad esame questo frammento di codice:
 
Point x = new Point(10,10);
Point y = new Point(5,3);
Point z = x;
Point w = new Point(10,10);
 
si dica quale delle seguenti espressioni è 
vera e quale falsa (fra parentesi metto 
quello che penso io voi dovete solo dirmi 
se è giusto o sbagliato):
 
x == y	(F)
x.equals(y) (F)
x == z (V)
x.equals(z) (V)
x.equals(w) (F)
w.equals(z) (F)
w == z (V)
y.equals(new Point(5,3)) (V)
y.equals(y) (V)
z.equals(y) (F)
z == z (V)
z == new Point(10,10) (V)
 
 
Grazie mille...

 se è giusto o sbagliato):
 
spiega perche'.
 
Inoltre: nell'esercizio c'e' anche la definizione della classe Point
oppure no?
 
Ciao Jack
-- 
Yoda of Borg am I! Assimilated shall you be! Futile resistance is, hmm?

 oppure no?
 
no, è la classe java.awt.Point
 
ciao e grazie
 

 sto studiando java e avrei bisogno di un aiutino sul seguente esercizio.
 
 
potresti dire quale è la finalità didattica
di questo esercizio?
 
 

 
 
suppongo aiutare a comprendere la 
differenza fra equals e ==
perché, ti sembra insensato?

 z == new Point(10,10) (V)
 
anche questa è sbagliata

 ehm...le devo spiegare tutte? :-)
 
allora spiega la differenza tra .equals() e "==" quando uguagli una
classe ;)


 classe ;)
  ^^^^^^^
 
ops, intendevo Oggetto... :P



Direi che, considerando le motivazioni, le hai sbagliate tutte meno una, 
ma in dubbio anche questa.
 

il 23.01.2012 12:57, Scrive Jamie 163712160:

Non e' affatto insensato, ma oltre che la motivazione che sospetti, 
dovrebbe anche indurre a controllare la documentazione della classe che 
stai esaminando. Nella fattispecie, la documentazione di 
java.awt.Point.equals() recita:
 
"Determines whether or not two points are equal. Two instances of 
Point2D are equal if the values of their x and y member fields, 
representing their position in the coordinate space, are the same."
 
Dove "Two instances of Point2D" si deve intendere "Two instances of 
Point". Probabilmente l'errore deriva dal fatto che Point estende la 
classe che Point2D, che e' abstract, dalla quale e' stato copiato il 
testo della documentazione del metodo.

 testo della documentazione del metodo.
 
 
Allora non ho capito niente!
Il libro, al capitolo dedicato, recita:
Il confronto per identità tra due valori 
di tipo primitivo si applica usando 
l'operatore ==, che non deve essere 
confuso con l'operatore di assegnamento 
visto in precedenza. Il confronto 
restituisce un valore di tipo booleano. 
L'operatore si applica a una coppia di 
espressioni di tipo compatibile ed è 
commutativo. Un confronto per identità tra 
i contenuti di due variabili di tipo 
primitivo coinvolgerà direttamente i 
valori memorizzati nelle corrispettive 
zone di memoria, restituendo true se 
coincidono, false altrimenti.
Analogamente, un confronto per identità 
eseguito con l'operatore == tra i 
contenuti di due variabili di tipo 
riferimento controlla se le due variabili 
contengono lo stesso riferimento (ovvero 
se riferiscono esattamente lo stesso oggetto).
Nel caso dei tipi riferimento, un 
confronto spesso piu' utile è quello per 
uguaglianza che viene effettuato invocando 
il metodo equals() su uno degli oggetti da 
confrontare. In questo caso l'esito 
potrebbe essere positivo anche quando le 
variabili memorizzano riferimenti diversi, 
purché gli oggetti riferiti siano ritenuti 
equivalenti. Nell'esempio dei punti del 
piano cartesiano due oggetti distinti di 
tipo java.awt.Point sono ritenuti 
equivalenti se rappresentano punti con le 
stesse coordinate.

il 23.01.2012 14:42, Scrive Jamie 163712160:

Il libro recita bene, tra l'altro cita anche il comportamento del metodo 
equals di Point al quale mi riferivo.
Cio' che puo' non essere chiaro, e' cosa si intenda per "variabili di 
tipo riferimento", ovvero ciò a cui mi riferisco con il lemma "istanza":
Una variabile e' definita dal tipo e dal valore assegnatole, nel caso di 
un tipo primitivo (byte, char, short, int, float, double e boolean) la 
variabili contengono solo un valore, altrimenti contiene il riferimento 
di un oggetto istanziato dall'operatore new o il riferimento ad un 
oggetto statico, ovvero un oggetto la cui istanza è unica nella JVM, ad 
esempio, se;
String a = "pippo", b = "pippo";
allora
(a == b) è true
ma se
String a = "pippo", b = new String("pippo");
allora
(a == b) è false
a.equals(b) continua ad essere true per effetto della definizione del 
metodo String.equals
 

 metodo String.equals
 
Vediamo se ho capito bene.
Se ho due variabili di tipo primitivo e 
voglio confrontarne il contenuto, uso ==, 
che mi restituirà vero solo se i valori 
assegnati alle due variabili sono uguali.
Se invece ho ad esempio una variabile di 
tipo primitivo che ha un certo valore x, e 
una riferimento che si riferisce a 
un'altra variabile di tipo primitivo che 
ha valore sempre x, usando == ottengo 
comunque un false?
Sto facendo una gran fatica a comprendere 
questi concetti :-(
 

 questi concetti :-(
 
in java non esistono riferimenti a tipi primitivi. si parla di
riferimenti quando si ha a che fare con oggetti, cioè tutto tranne che
i primitivi.
con i tipi primitivi l'operatore == resituisce true/false
coerentemente con i due valori contenuti.
il problema dell'operatore == riguarda appunto i tipi *non* primitivi,
le cui variabili sono (appunto) dei riferimenti e il confronto avviene
fra riferimenti e non fra i contenuti degli oggetti.
 
 
 

il 23.01.2012 20:11, Scrive Jamie 117355904:

Non proprio. Intanto non e' possibile confrontare una variabile 
primitiva con un riferimento di un oggetto, salvo quei casi in cui il 
compilatore fa un adattamento automatico (ma questo e' un altro 
discorso), inoltre quando hai delle variabili di un tipo non primitivo, 
ovvero istanze di classi che hanno come capostipite gerarchico 
java.lang.Object, il confronto dell'operatore == avviene sul loro 
"puntatore", tali puntatori sono uguali solo se si tratta della stessa 
istanza.

 ma in dubbio anche questa.
 
Già! però un test l'avrei passato :-)))
Scherzo!
Ti ringrazio molto per la pazienza e la consulenza!
 

 è corretto dire che z è un'istanza della classe Point?
Si'.