2016-04-10 13 views
-3

Ich habe einen Class Point implementiert und ich möchte sehen, ob Objekte der Klasse gleich sind oder nicht mit dem Operator ==. Ich recherchierte und fand mehrere Lösungen, die mir befahlen, die Equals-Methode von Object zu überschreiben. Ich habe getan, als ich gelesen habe, aber der Operator == funktioniert immer noch nicht. Wenn ich p1.equals (p2) benutze, funktioniert es aber. Kann mir jemand sagen, was ich falsch gemacht habe? Ich habe sogar versucht, die Methode hashCode zu überschreiben, obwohl ich nicht vorhabe, Point in einem Container zu verwenden.== operator funktioniert nicht mit overriden gleich methode

Implementierung von Point:

public final class Point { 

    private final int x; 
    private final int y; 

    public Point(int x, int y) { 
     this.x = x; 
     this.y = y; 
    } 

    @Override 
    public boolean equals(Object other) { 

     if (!(other instanceof Point)) { 
      return false; 
     } 

     Point that = (Point) other; 
     return this.x == that.x && this.y == that.y; 
    } 

    @Override 
    public int hashCode() { 
     return x + y; //just for testing, equal objects should return same hash? 
    } 

    @Override 
    public String toString() { 
     return "(" + x + "," + y + ")"; 
    } 

    public int getX() { 
     return x; 
    } 

    public int getY() { 
     return y; 
    } 
} 

My Test-Klasse:

public class Test { 

    public static void main(String[] args) { 

     Point p1 = new Point(1,2); 
     Point p2 = new Point(1,2); 

     if(p1.equals(p2)) { 
      System.out.println("equal"); 
     } else { 
      System.out.println("not equal"); 
     } 

     if(p1 == p2) { 
      System.out.println("equal"); 
     } else { 
      System.out.println("not equal"); 
     } 

     System.out.println(p1); 
    } 
} 

Ausgabe lautet:

equal 
not equal 
(1,2) 

so scheint die toString Methode überschrieben zu arbeiten, aber das einzige, was wont Arbeit ist der Operator ==. Ich versuchte, eine Sout zu der überschriebenen Methode equals hinzuzufügen, und es würde nur seine Nachricht anzeigen, wenn ich die equals-Methode direkt von p2.equals (p2) ausführen ...

+2

Das ist, weil "equals" und "==" verschiedene Dinge testen. 'equeds' testet die Gleichheit (die für jede Klasse in einer benutzerdefinierten Weise definiert werden kann),' == 'testet die Identität (was nicht möglich ist). –

+2

In der Tat - Sie können keine Operatoren in Java überladen. –

+0

In diesem Forum gibt es viele Fragen dazu, wie Sie die equals-Methode überschreiben können, um Ihre eigene Definition von Gleichheit für Ihre eigenen benutzerdefinierten Klassen mit dem Operator == zu aktivieren, der dann keine Adressen vergleicht, sondern Ihre Implementierung der überschriebenen equals-Methode verwendet. – Maxincredible52

Antwort

0

Operator == und die equals Methode sind in keiner Weise miteinander verbunden. Sie können (und sollten) die equals-Methode überschreiben, um eine Überprüfung auf logische Gleichheit zu implementieren.

Der Operator == implementiert immer eine Prüfung auf referenzielle Gleichheit. Auf diese Weise können Sie überprüfen, ob zwei Objekte nicht nur das Gleiche bedeuten, sondern tatsächlich das gleiche Objekt sind. Das ist Absicht.

1

== Operator ist nur Referenzen für Objekte vergleichen. Sie können diesen Operator nicht überschreiben.

können Sie offizielle lesen java tutorial

+0

Wenn sie diese Antwort lesen können, was ist der Sinn von dir? Einfach als duplizieren markieren. – Savior

+0

@Pillar, Ich füge diesen Link nach der Antwort hinzu. Und ich markiere es als Duplikat. – IntFloat

0

== Objektreferenzen vergleicht. Die vollständige Spezifikation dieses Operators lautet here.

Verwandte Themen