Objektvergleich

xyZman

Bekanntes Mitglied
Hi.
Warum zeigt er hier immer false ?
Und prüft man gleichheit bei Objekten nicht mit equals() ?

Java:
public class Equality {
   double value;
   Equality() {
      value = Math.random();
}
   Equality(Equality e) {
      this.value = e.value;
}
   Equality reverse() {
      return new Equality(this);
}
   public static void main(String[] args) {
      Equality object = new Equality();
      Equality tcejbo = object.reverse();
   
      
      System.out.print(object == tcejbo);
} }


lg
Flo
 

Gossi

Bekanntes Mitglied
Hi.
Warum zeigt er hier immer false ?
Und prüft man gleichheit bei Objekten nicht mit equals() ?

Java:
public class Equality {
double value;
Equality() {
value = Math.random();
}
Equality(Equality e) {
this.value = e.value;
}
Equality reverse() {
return new Equality(this);
}
public static void main(String[] args) {
Equality object = new Equality();
Equality tcejbo = object.reverse();

//nicht == sondern .equals();
System.out.print(object.equals(tcejbo));
} }


lg
Flo

Sollte gehen...
 
Zuletzt bearbeitet von einem Moderator:
S

SlaterB

Gast
was ist dazu denn die konkrete Frage?
natürlich klappt == nicht, wenn reverse() ein ANDERES Objekt zurückgibt, zwei unterschiedliche Objekt sind nie ==,
was kann dazu unklar sein?

equals() wäre interessanter,
sofern die Methode aber nicht implementiert wird (wie bie Standardklassen a la String der Fall) kommt dasselbe wie bei == raus
 

Gossi

Bekanntes Mitglied

Mist, hab den Quellcode vergessen.

Java:
System.out.print(object.equals(tcejbo));

Sollte gehen, hatte eigentlich deinen Quellcode kopiert und es dort verbessert mit Kommentar

[EDIT]Ahh, SlaterB hat meine Qoute entfernt, das erklärts natürlich, in dem Java-Tag hatte ich die änderungen geschrieben....[/EDIT]
 
S

SlaterB

Gast
habs wieder korrigiert, ist aber ganz ohne Hinweis wirklich nicht leicht zu erkennen
 

sung

Mitglied
Trotzdem object und tcejbo haben gleiche value, sind sie zwei verschiedenen Objekte.
Deswegen zeigt es hier immer false.
Wenn man gleichheit bei Objekten mit equals() prüft, soll man die equals() Method überschreiben.
z.B

boolean equals(Equality obj) {
if ((obj == null)|| (this == null))
return false;
return this.value == obj.value;
}
 
Zuletzt bearbeitet:
S

SlaterB

Gast
bei einem primitiven Datentype double wird das equals schwer, falls du nicht auf Autoboxing spekulierst ;)

abgesehen davon bietet sich beim ungenauen double natürlich ein gesonderter Vergleich für minimale Abweichungen an

edit:
oh ja, equals(Equality) statt equals(Object) ist ganz bös wie weiter unten geschrieben wird
 
Zuletzt bearbeitet von einem Moderator:

andiv

Bekanntes Mitglied
@Gossi und @Sung: Beides falsch ;-)

Java:
@Override
public boolean equals(Object other) {
    if(other == this) {
        return true;
    }
    if(!(other instanceof Equality)) {
        return false;
    }
    Equality e = (Equality)other;
    // falls value ein primitiver Datentyp ist, wobei man bei float/double auf die Ungenauigkeiten achten muss
    return value == e.value;
    // falls value ein Objekt ist
    return value == null ? e.value == null : value.equals(e.value));
}

Edit: Man muss natürlich auch noch hashCode überschreiben damit es korrekt wird
 
Zuletzt bearbeitet:

sung

Mitglied
Es tut mir leid. Ich habe null vergessen.

boolean equals(Equality obj) {
if ((obj == null)|| (this == null))
return false;
return this.value == obj.value;
}

Aber double ist kein Unterklasse von Object, und hat kein equals() Method.
 
S

SlaterB

Gast
this == null wird selten erfüllt sein,

besonders wichtig ist, die Methode als equals(Object) zu deklarieren, sonst wird nicht die allgemeine Methode überschrieben
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
E Objektvergleich Enum Java Basics - Anfänger-Themen 7

Ähnliche Java Themen


Oben