Objekte mittels equals vergleichen

Diskutiere Objekte mittels equals vergleichen im Java Basics - Anfänger-Themen Bereich.
M

MarkusFromBerne

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);
}
}
 
J

JustNobody

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

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

MarkusFromBerne

@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

@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

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

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

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

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

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

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

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
 
Thema: 

Objekte mittels equals vergleichen

Passende Stellenanzeigen aus deiner Region:
Anzeige

Neue Themen

Anzeige

Anzeige
Oben