Objekte mittels equals vergleichen

M

MarkusFromBerne

Mitglied
Ich versuche gerade, 2 Point-Objekte mittels equals zu vergleichen. Obwohl ich äquivalente Werte eingebe, ist equals der Ansicht, dass meine beiden Objekte nicht der Fall ist.

Der code wird anstandslos kompiliert, die Ausführung ist ebenso reibungslos. Eben bis auf dem Umstand, dass das Resultat nicht meinen Erwartungen entspricht. Ich erhalte:
Die zwei Objekte sind nicht aequivalent: Point [x=7, y=99] unterscheidet sich von Point [x=7, y=99]

Ich kann meinen Denkfehler nicht finden.
Und da ich keine Fehlermeldung erhalte, kann ich nicht danach googeln.

Was ich über equals weiss:
- die equals-Methode wird in der Klasse definiert. Die Klasse importiere ich in diesem Fall hier. Dort ist, laut Dokumentation, ein equals integriert.
- equals vergleicht die Objekte, NICHT die Referenzvariable. In meinem Fall werden also die int-Variablen der beiden Objekte verglichen.

Vielen Dank für eure Hilfe!



import java.awt.*;
class kapitel27verdammtesEquals
{
public static void main ( String arg[] )
{
Point pointA = new Point( 7, 99 ); // erstes Point-Objekt
Point pointB = new Point( 7, 99 ); // zweites Point-Objekt

if ( pointA.equals( pointB ) )
System.out.println("Die zwei Objekte enthalten die gleichen Daten: " + pointA );
else
System.out.println("Die zwei Objekte sind nicht aequivalent: " + pointA + " unterscheidet sich von " + pointB);
}
}
 
kneitzel

kneitzel

Top Contributor
Welche JRE / JDK nutzt du? Dein Code gibt bei mir aus: "Die zwei Objekte enthalten die gleichen Daten: java.awt.Point[x=7,y=99]"

Und Code bitte mit Code-Tags posten:
Java:
import java.awt.*;
class kapitel27verdammtesEquals
{
  public static void main ( String arg[] )
  {
    Point pointA = new Point( 7, 99 ); // erstes Point-Objekt
    Point pointB = new Point( 7, 99 ); // zweites Point-Objekt

    if ( pointA.equals( pointB ) )
      System.out.println("Die zwei Objekte enthalten die gleichen Daten: " + pointA );
    else
      System.out.println("Die zwei Objekte sind nicht aequivalent: " + pointA + " unterscheidet sich von " + pointB);
  }
}
 
O

Oneixee5

Aktives Mitglied
Dein Code erzeugt bei mir die Ausgabe:
Code:
Die zwei Objekte enthalten die gleichen Daten: java.awt.Point[x=7,y=99]
 
M

MarkusFromBerne

Mitglied
@Oneixee5: Danke für deine Nachricht.

Ich hab' natürlich vor dem Posten hier mehrmals neu kompiliert& ausgeführt. Erhielt aber immer das "falsche" Ergebnis.
Jetzt hab' ich Visual Code geschlossen und neugestartet. Siehe da; richtiger Output kommt!

Naja, war wohl falscher Alarm von mir.
Sorry für die Umstände und danke für die Hilfe.
Markus
 
M

MarkusFromBerne

Mitglied
@JustNobody: Danke auch für deinen Hinweis. Code-tag mache ich das nächste Mal.

Hier die Infos zu meiner IDE. Das Problem taucht zwar nicht mehr auf. Aber falls Irrtum meinerseits ausgeschlossen werden kann (was nicht der Fall ist ;-)), gibt's vielleicht noch einen Hinweis auf mögliche Ursachen:
Visual Studio Code

Version: 1.48.1 (user setup)
Commit: 3dd905126b34dcd4de81fa624eb3a8cbe7485f13
Datum: 2020-08-19T17:12:13.244Z
Electron: 7.3.2
Chrome: 78.0.3904.130
Node.js: 12.8.1
V8: 7.8.279.23-electron.0
Betriebssystem: Windows_NT x64 10.0.19041

Die Ausgabe bei mir ist übrigens:
"Die zwei Objekte sind nicht aequivalent: Point [x=7, y=99] unterscheidet sich von Point [x=7, y=99]"
 
M

MarkusFromBerne

Mitglied
aargh, in der weiterentwickelten Version meines codes taucht das Problem wieder auf!
Die erwartete Ausgabe ist "Die Koordinaten der beiden Punkte sind gleich.", ich erhalte jedoch "Die Koordinaten der beiden Punkte sind verschieden.".


Java:
import java.util.Scanner;
import java.awt.*;

public class kapitel27a1mitFertigerKlasse {
    public static void main(String[] args) {

        Scanner scan = new Scanner(System.in);

        //Punkt 1 einlesen mittels Scanner
        System.out.println("Gib die x-Koordinate ein");
        int x1 = scan.nextInt();
        System.out.println("Gib die y-Koordinate ein");
        int y1 = scan.nextInt();
        Point P1= new Point (x1, y1);

        //Punkt 2 einlesen mittels Scanner
        System.out.println("Gib die x-Koordinate ein");
        int x2 = scan.nextInt();
        System.out.println("Gib die y-Koordinate ein");
        int y2 = scan.nextInt();
        Point P2= new Point (x2, y2);
        
        //Punkte ausgeben, toString-Methode testen
        System.out.println ("P1 = "+P1.toString());
        System.out.println ("P2 = "+P2.toString());
        System.out.println(); //zur besser Lesbarkeit
    
        //Punkte vergleichen, ternar testen
        System.out.println("Ausgabe nach ternaer:");
        String equalsResult = (P1.equals(P2))
        ? "Die Koordinaten der beiden Punkte sind gleich."
        : "Die Koordinaten der beiden Punkte sind verschieden.";
        System.out.println(equalsResult);
        System.out.println(); //zur besser Lesbarkeit

        //Punkte vergleiche. Braves If zum Quer-Testen des equals
        System.out.println("Ausgabe nach if:");
        if (P1.equals(P2)){
            System.out.println("Die Koordinaten der beiden Punkte sind gleich.");
        } else {
            System.out.println("Die Koordinaten der beiden Punkte sind verschieden.");
        }
    }
}

Meine Eingabe für alle per scanner abgefragten Werte: 2

Meine Ausgabe:
Gib die x-Koordinate ein
2
Gib die y-Koordinate ein
2
Gib die x-Koordinate ein
2
Gib die y-Koordinate ein
2
P1 = Point [x=2, y=2]
P2 = Point [x=2, y=2]

Ausgabe nach ternaer:
Die Koordinaten der beiden Punkte sind verschieden.

Ausgabe nach if:
Die Koordinaten der beiden Punkte sind verschieden.


Infos zu meiner IDE Visual Studio Code:
Version: 1.48.1 (user setup)
Commit: 3dd905126b34dcd4de81fa624eb3a8cbe7485f13
Datum: 2020-08-19T17:12:13.244Z
Electron: 7.3.2
Chrome: 78.0.3904.130
Node.js: 12.8.1
V8: 7.8.279.23-electron.0
Betriebssystem: Windows_NT x64 10.0.19041

Weder beim Kompilieren noch beim Ausführen irgendwelche Fehlermeldungen.

Danke für eure Hilfe.
Gruss, Markus
 
O

Oneixee5

Aktives Mitglied
Eventuell solltest du vor dem Compilieren die bestehenden Binaries löschen. So kannst du sicher sein, dass alles neu erstellt wurde. Möglicherweise gibt es Probleme beim überschreiben der .class Dateien.
 
M

MarkusFromBerne

Mitglied
Eventuell solltest du vor dem Compilieren die bestehenden Binaries löschen. So kannst du sicher sein, dass alles neu erstellt wurde. Möglicherweise gibt es Probleme beim überschreiben der .class Dateien.
Danke für den Tipp!
Ich habe das ausprobiert; .class-file gelöscht, Visual Studio neugestartet, .java neu kompiliert, neues .class ausgeführt - keine veränderung.

Ich habe nochmal die Spezifikation der equal-Methode in der Point-class nachgeschaut. Ich habe den Eindruck, dass dort das Problem liegt. So weit ich das verstehe, steht dort aber nichts ungewöhnliches.

Gruss,
Markus
 
L

LimDul

Top Contributor
Irgendwas ist strange bei dir:

Gib die x-Koordinate ein
2
Gib die y-Koordinate ein
2
Gib die x-Koordinate ein
2
Gib die y-Koordinate ein
2
P1 = java.awt.Point[x=2,y=2]
P2 = java.awt.Point[x=2,y=2]

Ausgabe nach ternaer:
Die Koordinaten der beiden Punkte sind gleich.

Ausgabe nach if:
Die Koordinaten der beiden Punkte sind gleich.

Welche Java Version ist den installiert?
 
M

MarkusFromBerne

Mitglied
LimDul:
Du hast nicht zufällig eine Klasse namens "Point" im gleichen Package liegen? Dann wird natürlich die verwendet und nicht mehr die aus java.awt
Das war das Problem!
Ich hab heute morgen mit einer eigenen Point-Class herumgebastelt. Meine selbergemachte Point-Class hatte kein toString, darum habe ich danach die offizielle Point-class importiert.
Meine selbergemachte Point-Klasse wird zwar weder importiert noch deklariert im aktuellen .java-file, liegt aber vielleicht irgend in einem temporary oder so rum. Das .java-file mit der selbergemachten Klasse ist im gleichen Ordner wie das kapitel27a1mitFertigerKlasse.java.

Ich habe nun einen neuen Ordner erstellt, kapitel27a1mitFertigerKlasse.java dort rein kopiert, die IDE sicherheitshalber neu gestartet, das .java neu kompiliert und ausgeführt - tadaa, es tut wie's soll!
Es war also tatsächlich meine selbergebastelte Point-Class, die das Problem verursacht hat.

Das bedeutet vermutlich, dass lokal deklarierte Klassen die importierten Klassen gewissermassen überschreiben. Obwohl es keinen manuellen Aufruf meiner eigenen Klasse gab, nur den import der offiziellen Klasse.

Vielen Dank für eure Hilfe! Ich hoffe mein Fehler war nicht allzu dämlich ;-)
Gruss, Markus
 
L

LimDul

Top Contributor
Das war das Problem!
Ich hab heute morgen mit einer eigenen Point-Class herumgebastelt. Meine selbergemachte Point-Class hatte kein toString, darum habe ich danach die offizielle Point-class importiert.
Meine selbergemachte Point-Klasse wird zwar weder importiert noch deklariert im aktuellen .java-file, liegt aber vielleicht irgend in einem temporary oder so rum. Das .java-file mit der selbergemachten Klasse ist im gleichen Ordner wie das kapitel27a1mitFertigerKlasse.java.

Ich habe nun einen neuen Ordner erstellt, kapitel27a1mitFertigerKlasse.java dort rein kopiert, die IDE sicherheitshalber neu gestartet, das .java neu kompiliert und ausgeführt - tadaa, es tut wie's soll!
Es war also tatsächlich meine selbergebastelte Point-Class, die das Problem verursacht hat.

Das bedeutet vermutlich, dass lokal deklarierte Klassen die importierten Klassen gewissermassen überschreiben. Obwohl es keinen manuellen Aufruf meiner eigenen Klasse gab, nur den import der offiziellen Klasse.

Vielen Dank für eure Hilfe! Ich hoffe mein Fehler war nicht allzu dämlich ;-)
Gruss, Markus
Das ist die Packagestruktur von Java.
Klassen im gleichen Package haben immer Präferenz vor importierten. Grundsätzlich hat jede Klasse einen voll qualifizierten Namen. der ist bei normalen Klassen package.klassenname (mal inner classes und co außen vorgelassen).

Das Import statement sorgt dafür, dass du dir das Package sparen kannst. Wenn es dabei aber zu Konflikten kommt gilt das Klassen aus dem gleichen Package Vorrang haben. Du hättest im Code anstelle von import und der Verwendung von Point auch immer java.awt.Point schreiben können - also den vollqualifizierten Namen.
 
M

MarkusFromBerne

Mitglied
Das ist die Packagestruktur von Java.
Klassen im gleichen Package haben immer Präferenz vor importierten. Grundsätzlich hat jede Klasse einen voll qualifizierten Namen. der ist bei normalen Klassen package.klassenname (mal inner classes und co außen vorgelassen).

Das Import statement sorgt dafür, dass du dir das Package sparen kannst. Wenn es dabei aber zu Konflikten kommt gilt das Klassen aus dem gleichen Package Vorrang haben. Du hättest im Code anstelle von import und der Verwendung von Point auch immer java.awt.Point schreiben können - also den vollqualifizierten Namen.
Danke für die Erklärung!

Ich hab' das gleich ausprobiert. Nun kann ich auch in meinem bestehenden Ordner mit mehreren Point-class die richtige class aufrufen.
Hier der Code, falls jemand das gleiche Problem hat:
Java:
import java.util.Scanner;

public class kapitel27a1mitFertigerKlasse {
    public static void main(String[] args) {

        Scanner scan = new Scanner(System.in);

        //Punkt 1 einlesen mittels Scanner
        System.out.println("Gib die x-Koordinate ein");
        int x1 = scan.nextInt();
        System.out.println("Gib die y-Koordinate ein");
        int y1 = scan.nextInt();
        java.awt.Point P1= new  java.awt.Point (x1, y1);

        //Punkt 2 einlesen mittels Scanner
        System.out.println("Gib die x-Koordinate ein");
        int x2 = scan.nextInt();
        System.out.println("Gib die y-Koordinate ein");
        int y2 = scan.nextInt();
        java.awt.Point P2= new  java.awt.Point (x2, y2);
    
        //Punkte ausgeben, toString-Methode testen
        System.out.println ("P1 = "+P1.toString());
        System.out.println ("P2 = "+P2.toString());
        System.out.println(); //zur besser Lesbarkeit
    
        //Punkte vergleichen, ternar testen
        System.out.println("Ausgabe nach ternaer:");
        String equalsResult = (P1.equals(P2))
        ? "Die Koordinaten der beiden Punkte sind gleich."
        : "Die Koordinaten der beiden Punkte sind verschieden.";
        System.out.println(equalsResult);
        System.out.println(); //zur besser Lesbarkeit

        //Punkte vergleiche. Braves If zum Quer-Testen des equals
        System.out.println("Ausgabe nach if:");
        if (P1.equals(P2)){
            System.out.println("Die Koordinaten der beiden Punkte sind gleich.");
        } else {
            System.out.println("Die Koordinaten der beiden Punkte sind verschieden.");
        }
    }
}

Danke nochmal! Durch eure Hilfe wurden ein paar Stunden voller Frust von einer Woge des Erfolgs abgelöst ;-)
Gruss,
Markus
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
G Objekte mittels Schleife anlegen und ansprechen Java Basics - Anfänger-Themen 8
G Methoden Informationen aus zwei Objekte bekommen? Java Basics - Anfänger-Themen 6
P Globale Objekte Java Basics - Anfänger-Themen 2
C Nachträglich neue grafische Objekte hinzufügen Java Basics - Anfänger-Themen 7
D Interaktion zweier Objekte Java Basics - Anfänger-Themen 5
M Objekte in Array speichern und ausgeben Java Basics - Anfänger-Themen 17
S Objekte indiziert erstellen Java Basics - Anfänger-Themen 27
M Warum dürfen Objekte einer Klasse auf statische Variablen dieser Klasse referenzieren? Java Basics - Anfänger-Themen 10
C Fernseher-Aufgabe (Methoden, Klassen und Objekte) Java Basics - Anfänger-Themen 63
N Typebound Objekte einer Arraylist hinzufügen Java Basics - Anfänger-Themen 7
A (Objekte Java Basics - Anfänger-Themen 6
Y Klassen Klassen und Objekte Java Basics - Anfänger-Themen 3
Y Klassen Klassen und Objekte mit set und get Java Basics - Anfänger-Themen 0
U Objekte in einer LinkedList sortieren Java Basics - Anfänger-Themen 5
N Methode um Objekte einer Liste hinzuzufügen Java Basics - Anfänger-Themen 1
G Java Objekte auf Duplikate testen Java Basics - Anfänger-Themen 4
B Neue Liste erstellen, wenn Objekte bestimmte Referenz hat / Gruppierung von Einträgen Java Basics - Anfänger-Themen 12
M Implementieren einer Datenstruktur, welche nur 5 Objekte speichert Java Basics - Anfänger-Themen 3
M Objekte miteinander vergleichen Java Basics - Anfänger-Themen 18
C Verschiedene Objekte in einer Liste speichern Java Basics - Anfänger-Themen 6
J Java GUI- Objekte Position per Quelltext bestimmen Java Basics - Anfänger-Themen 4
G Objekte in Methoden? Java Basics - Anfänger-Themen 13
H Auf Objekte bzw Variabeln aus einer anderen Methode zugreifen Java Basics - Anfänger-Themen 7
S Frage Klasse und Objekte Java Basics - Anfänger-Themen 2
K Boolean in einer Methode um 2 Objekte zu vergleichen Java Basics - Anfänger-Themen 12
I Objekte Hilfe Java Basics - Anfänger-Themen 8
G Klassen und Objekte Java Basics - Anfänger-Themen 2
W Verschachtelte Objekte wieder auspacken Java Basics - Anfänger-Themen 3
R Attribute mehrerer Objekte ausgeben Java Basics - Anfänger-Themen 3
C Objekte und Konstruktoren Java Basics - Anfänger-Themen 2
F Erstellen zweier Objekte mit dem selben Inhalt Java Basics - Anfänger-Themen 1
O ObjectOutputStream Anzahl Objekte festhalten Java Basics - Anfänger-Themen 17
R Objekte aus Array als String + kommasepariert speichern Java Basics - Anfänger-Themen 12
X Objekte einer ArrayList richtig ausgeben? Java Basics - Anfänger-Themen 8
J Best Practice Dateiinhalte validieren und auf Objekte mappen Java Basics - Anfänger-Themen 3
B Automatisch Objekte erzeugen mit verschiedenen Namen Java Basics - Anfänger-Themen 4
der_Schokomuffin Hilfe gesucht beim Thema Objekte übergeben! Java Basics - Anfänger-Themen 2
S Konstruktor, Objekte Java Basics - Anfänger-Themen 4
PaperHat Objekte in Array vergleichen Java Basics - Anfänger-Themen 9
B HTML Code / Seite auslesen und JAVA Objekte erstellen Java Basics - Anfänger-Themen 12
PaperHat Programmieraufgabe - Objekte in Objekten Java Basics - Anfänger-Themen 2
E Methode mit Parametern um Objekte zu übergeben Java Basics - Anfänger-Themen 4
V Collections Objekte einer ArrayList in der main() ausgeben Java Basics - Anfänger-Themen 9
T Klassen Klassenübergreifende Objekte erstellen lassen Java Basics - Anfänger-Themen 5
A Objekte verknüpfen Java Basics - Anfänger-Themen 2
M Objekte mit einer Schleife mehrmals erzeugen Java Basics - Anfänger-Themen 17
B Klassen Alle Unter-Objekte durchlaufen in der Hauptklasse Java Basics - Anfänger-Themen 10
B Objekte zählen/ Vererbung/ Kopplung/ Interface/ Abstract Class Java Basics - Anfänger-Themen 5
S Zählen der Zeiger auf Objekte Java Basics - Anfänger-Themen 35
J Methoden Equals Methode für Integer und Objekte überschreiben? Java Basics - Anfänger-Themen 9
B Erste Schritte Objekte von JFrame der Fenstergröße anpassen Java Basics - Anfänger-Themen 3
M Klassen und Objekte Java Basics - Anfänger-Themen 2
J Objekte und Abstrakte Klassen Java Basics - Anfänger-Themen 2
J Array Objekte einer Klasse zuordnen Java Basics - Anfänger-Themen 15
H Interface Objekte speichern und laden (serialisieren/deserialisieren) Java Basics - Anfänger-Themen 1
Orkanson Objekte in ein Array einfügen Java Basics - Anfänger-Themen 5
X Objekte in ArrayList einfügen Java Basics - Anfänger-Themen 10
L Vorherige Objekte zählen und ausgeben Java Basics - Anfänger-Themen 11
Orkanson Objekte und Klassen Java Basics - Anfänger-Themen 8
R Objekte zur Laufzeit in Schleife erzeugen und in ArrayList ablegen Java Basics - Anfänger-Themen 4
D Objekte-Fragen Java Basics - Anfänger-Themen 1
T Objekte in der Methode Java Basics - Anfänger-Themen 8
F Alle Objekte einer Klasse nach Eigenschaft durchsuchen Java Basics - Anfänger-Themen 8
R Interface Eigene Objekte in Listen sortieren mit Interface Comparable Java Basics - Anfänger-Themen 5
E Eine Instanzvariable und zwei Objekte Java Basics - Anfänger-Themen 14
N Objekte in ArrayList finden Java Basics - Anfänger-Themen 10
K Comparable - Objekte aus Array vergleichen und größtes auswählen Java Basics - Anfänger-Themen 1
R getrennte Objekte aus Klasse erstellen : warum Inhalt dann gleich ? Java Basics - Anfänger-Themen 2
T Objekte in Listen vererben Java Basics - Anfänger-Themen 3
E Methoden Objekte in Methode aufrufen ohne getter und setter? Java Basics - Anfänger-Themen 1
A Variablen In anderer Klasse auf Objekte von JFrame zugreifen Java Basics - Anfänger-Themen 1
R Objekte Vergleichen und Sortieren Java Basics - Anfänger-Themen 3
BobbGott Klassen 2 "Objekte" in einer Methode - wie? Java Basics - Anfänger-Themen 7
S Objekte mit gleichem Namen in unterschiedlichen Klassen Java Basics - Anfänger-Themen 3
S Objekte "gegebenfalls" erzeugen Java Basics - Anfänger-Themen 5
F Klassen Zugriff auf verschachtelte Objekte Java Basics - Anfänger-Themen 11
H Objekt überschreibt Variablen vorheriger Objekte Java Basics - Anfänger-Themen 2
snipesss Objekte Java Basics - Anfänger-Themen 14
tuc Erste Schritte verschiedene objekte in einem feld speichern Java Basics - Anfänger-Themen 4
J Objekte in einer Liste Java Basics - Anfänger-Themen 3
D Mehrere Objekte in ein Objekt zusammenfassen Java Basics - Anfänger-Themen 16
W OOP Zwei Objekte beziehen sich aufeinander (Zirkelbezug)? Java Basics - Anfänger-Themen 4
D Objekte mit verschiedenen Attributen erstellen Java Basics - Anfänger-Themen 3
A OOP Zugriff auf Objekte von außen Java Basics - Anfänger-Themen 8
T Objekte mit Verhalten Java Basics - Anfänger-Themen 14
Z OOP Objekte einer Klasse weiteren Klassen zur Verfügung stellen Java Basics - Anfänger-Themen 17
T Objekte erstellen Java Basics - Anfänger-Themen 2
D Methoden Wie können Klassen auf Klassenfremde Objekte zugreifen? Java Basics - Anfänger-Themen 7
G Datentypen verschiedene Objekte in eine ArrayList, Generics Java Basics - Anfänger-Themen 2
D Statische Objekte mit variablem Parameter Java Basics - Anfänger-Themen 1
K Mehrere Objekte anlegen Java Basics - Anfänger-Themen 23
S Objekte klonen und Deep Copy Java Basics - Anfänger-Themen 30
D Objekte in Liste eintragen Java Basics - Anfänger-Themen 4
H Mit Schleife erstellte gleichnamige Objekte einzeln anwählen? Java Basics - Anfänger-Themen 1
P verständnis Frage Refernzen und Objekte Java Basics - Anfänger-Themen 1
C Methoden Objekte und Methode und Übergabe Java Basics - Anfänger-Themen 4
E Objekte und static Java Basics - Anfänger-Themen 2
EisKaffee Klassen Objekte verwalten Java Basics - Anfänger-Themen 13
boscho87 Objekte übergeben Best Practice Java Basics - Anfänger-Themen 1
K Nachträglich auf Objekte zugreifen Java Basics - Anfänger-Themen 2

Ähnliche Java Themen

Anzeige

Neue Themen


Oben