|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3741
|
Uguaglianza tra oggetti
ho riscoperto l'acqua calda però mi interessa sapere qualcosina di più.
Ho istanziato due oggetti di tipo Memo contenenti a volte le medesime stringhe ed a volte stringhe differenti. Per la caratteristica di essere oggetti, sono confrontabili tra loro con l'operatore di uguaglianza ma......come viene verificata l'uguaglianza dei due oggetti ????? |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Oct 2006
Messaggi: 1105
|
spero di aver capito bene la domanda...
nota che ti parlo di come funziona la cosa in Java. In Java hai 2 operatori di uguaglianza tra oggetti: "==" e "equals". il primo confronta L'INDIRIZZO di due riferimenti a oggetti: Class1 c1 = new Class1(); Class1 c2 = new Class1(); -> c1 == c2 è FALSE se ora faccio c2 = c1, allora le due variabili puntano allo stesso oggetto e di conseguenza c1 == c2 è, ora, TRUE passiamo ora al secondo operatore, equals. supponiamo che Class1 abbia due membri, per semplicità di tipo primitivo e contenga un metodo equals definito come segue: Class1 { int m1; double m2; ... public boolean equals(Class1 c) { return (this.m1 == c.m1) && (this.m2 == c.m2); } } ora, Class1 c1 = new Class1(); Class1 c2 = new Class1(); c1.equals(c2) è TRUE la cosa importante e interessante è che equals è completamente personalizzato, quindi sei tu a decidere qual è il criterio di uguaglianza Ultima modifica di mad_hhatter : 11-07-2007 alle 10:06. |
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3741
|
hai capito cosa intendo
Ma supponi di avere istanziato due oggetti di tipo stringa, se sono oggetti puoi scrivere s1 != s2 o s1 == s2 mi chiedevo il funzionamento interno del confronto e cioè, se attraverso l'operaotre '=' usato su due oggetti, veniva scandito il contenuto delle due stringhe per rotirnare che i due oggetti sono uguali. Posso istanziare due rettangoli con la stessa classe e delle stesse dimensioni ma posso dire credo, di avere due rettangoli uguali ma due oggetti diversi! |
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Oct 2006
Messaggi: 1105
|
infatti l'operatore "==" è logico, mentre "equals" è SEMANTICO
se tu hai due stringhe che rappresentano la stessa sequenza di caratteri, o due rettangoli aventi uguale altezza e uguale larghezza, essi sono semanticamente uguali, ma possono essere oggetti diversi. se tu fai: String s1 = "abc"; String s2 = "abc"; allora s1 == s2 è false, ma s1.equals(s2) è true perchè il secondo è implementato per confrontare la sequenza di caratteri, mentre il primo guarda solo l'indirizzo contenuto nei riferimenti. Lo stesso dicasi per i rettangoli. E' per questo che esiste "==" E ANCHE "equals". In C++, ad esempio, con l'overloading degli operatori potresti, FORSE (perchè non conosco il C++), fare in modo che "==" si comporti come "equals". |
|
|
|
|
|
#5 | |
|
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
String s1 = new String ("abc"); String s2 = new String ("abc"); Qui s1 == s2 è sempre in ogni caso false.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3741
|
in Borland Builder C++
String s1= "abc"; String s2= "abc"; is1 == s2 ???? "vero" String s1= "abc"; String s2= "abcd"; is1 == s2 ???? "falso" |
|
|
|
|
|
#7 |
|
Senior Member
Iscritto dal: Jun 2006
Messaggi: 1077
|
Parlando di OOP quando si scrive una nuova classe si deve sempre fare l'override del metodo equals in quanto è l'unico metodo per testare l'uquaglianza (semantica) tra due oggetti. Poi che in Java l'operatore "==" fatto su due oggetti stringa uguali restituisca true è solo una scelta fatta dalla Sun.
|
|
|
|
|
|
#8 |
|
Senior Member
Iscritto dal: May 2005
Città: Bari
Messaggi: 349
|
in c++ se fai l'include di <string> o <cstring> ora non ricordo bene hai già una classe nella quale è overloadato l'operatore == per effettuare una strcmp....
per quel che riguarda gli oggetti -sempre in c++- ti consiglio di fare un overloading dell'operatore == per fargli fare ciò che ti serve.... Vito
__________________
Si può vincere una guerra in due...o forse anche da solo. Si può estrarre il cuore anche al più nero assassino, ma è più difficile cambiare un'idea! |
|
|
|
|
|
#9 |
|
Senior Member
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3741
|
uhm.....ci siamo leggermente persi
Ho due oggetti di tipo memo quindi due istanze di tali oggetti. Se scrivo Memo1->Text != Memo2->Text dovrei ottenere true se entrambi gli oggetti sono dello stesso tipo ed hanno i medesimi attributi o proprietà, indifferentemente dall'indirizzamento in memoria |
|
|
|
|
|
#10 |
|
Member
Iscritto dal: Nov 2004
Città: pisa
Messaggi: 204
|
Che linguaggio usi?
di solito nei linguaggi che non ammettono un uso diretto dei puntatori ci sono queste due scelte perchè deve comunque essere possibile fare entrambi i confronti (java): per sapere se due oggetti sono il solito: == per sapere se due oggetti hanno lo stesso contenuto: equals Nei linguaggi dove puoi usare direttamente i puntatori (c++) per sapere se due stringhe sono il solito oggetto: &obj1 == &obj2 per sapere se due oggetti hanno lo stesso contenuto: obj1 == obj2 (se fanno l'overriding dell'operatore ==) più facile di così se ho detto qualche cazzata correggetemi |
|
|
|
|
|
#11 |
|
Senior Member
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3741
|
parlo di C++ ma in termine di oggetti non credo ci sia molta differenza tra C++ e java, sbaglio ?
Se scrivo Memo1 == Memo2 mi viene restituito un false in quanto con molta probabilità entra in gioco l'indirizzamento in memoria, oggetti dello stesso tipo ma che vengono riconosciuti come individui a se. Se navigo al loro interno con la notazione -> ed arrivo a Text che è il loro contenuto, tale contenuto mi ritorna un true se entrambi contengono il medesimo testo, indifferentemente dalla lunghezza di quest'ultimo. La mia domanda era appunto: quando scrivo Memo1->Text == Memo2->Text cosa fa il codice celato in quel '==' per scoprire che i due contenuti dei Memo sono uguali ? Ultima modifica di misterx : 11-07-2007 alle 22:31. |
|
|
|
|
|
#12 |
|
Senior Member
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
|
Gli oggetti C++ e gli oggetti Java non sono neanche lontani parenti
Le specifiche di C++ (ISO '98) ci dicono che il risultato della comparazione per uguaglianza di due puntatori ad oggetti dello stesso tipo è true se e solo se entrambi sono null, puntano allo stesso oggetto o al componente di un array successivo all'ultimo.
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me! |
|
|
|
|
|
#13 |
|
Senior Member
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3741
|
parlando esclusivamente di oggetti non penso che un oggetto C++ sia differente da un oggetto java
|
|
|
|
|
|
#14 |
|
Senior Member
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
|
Se parliamo di bit in memoria, sono entrambi collezioni di uno e zero ma l'oggetto, in quanto definizione di un'identità, in Java è più "cicciotto". Il minimo oggetto Java è l'unione della definizione di java.lang.Object e qualcos'altro. Quello che c'è scritto in Object è parecchio ma due cose risaltano più di tutte. La prima è la definizione di identità: equals e hashCode. La seconda è l'introspezione: getClass. Non è poco.
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me! |
|
|
|
|
|
#15 |
|
Senior Member
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3741
|
intendevo a livello concettuale e non implementativo.
Però ancora nessuno mi ha risposto come funziona quel == tra due oggetti |
|
|
|
|
|
#16 |
|
Member
Iscritto dal: Nov 2004
Città: pisa
Messaggi: 204
|
Veramente te lo hanno spiegato tutti
|
|
|
|
|
|
#17 |
|
Senior Member
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3741
|
|
|
|
|
|
|
#18 |
|
Senior Member
Iscritto dal: Jan 2004
Città: Montignoso(MS)
Messaggi: 9484
|
Ma sbaglio o in C++ e' anche possibile sovrascrivere l'operatore di uguaglianza == ?
In java, invece, nel caso di oggetti, non dovrebbe corrispondere a chiamare il metodo equals ?
__________________
"Il Meglio che si possa ottenere è evitare il peggio." I.C. |
|
|
|
|
|
#19 | |
|
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
In Java l'operatore == applicato a due operandi di tipo reference effettua solo una comparazione sui valori dei reference, non sul contenuto degli oggetti.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
|
|
|
|
|
#20 | |
|
Senior Member
Iscritto dal: Oct 2006
Messaggi: 1105
|
Quote:
più di così non so cosa risponderti... mi spiace |
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 19:48.




















