# Anfänger: 2 Objekte vergleichen?



## SirNibo (11. Nov 2008)

Hi, kann mir das jemand mit dem Objektevergleichen in Java erklären

class lol
{
    int a = 1;

    getA()
    {
        return a;
    }
}

class lolTest
{
    public static void main (String args[])
    {
        lol a = new lol();
        lol b = new lol();

        System.out.println(a.getA() == b.getA());    //ausgabe true (verstehe ich)
        System.out.println(a == b);    //ausgabe false (wieso false, beide Objekte sind doch gleich)     :?: 
        System.out.println(a.equals(b));    //ausgabe false (wieso false, beide Objekte sind doch gleich)     :?: 
    }
}

Kann man zwei Objekte nicht vergleichen?


----------



## Ark (11. Nov 2008)

Ein == bei Objekten vergleicht die Referenzen auf die Objekte, nicht die Objektinhalte. Mit == prüft man eher auf "Selbstheit" als auf "Gleichheit" von Objekten. Wenn == true ergibt, zeigen beide Objekte auf dasselbe Objekt, aber nicht zwangsläufig auf ein nur gleiches.

Für Test auf Gleichheit gibt die Methode equals(), die in Object das erste Mal definiert wird und du in deiner Klasse überschreiben musst.

Ark


----------



## ARadauer (12. Nov 2008)

Klassen schreibt man groß und ja das ist wichtig ;-)


----------



## DellCapone (12. Nov 2008)

Kannst dir am besten so vorstellen.
du LEITEST von einer Klasse eine Referenz und erstellst ein NEUES Objekt.
lol ab = new lol
lol ba = new lol
und wenn du nun ab==ba vergleichst bekommst du false. Zwar sind die Objekte von der gleichen Klasse abgeleitet aber sind nicht gleich, auch wenn sie den gleichen inhalt haben.

Beispiel
Stell dir vor die Klasse lol ist ein Bauplan für ein Auto.
nun erstellst du nach diesem Bauplan ein auto ab und ba.

beim verlgeich der beiden autos stellst du fest, dass die nie gleich sind aber von dem selben Bauplan erstellt wurden.


----------



## maki (12. Nov 2008)

DellCapone,

das hat rein gar nichts mit ableiten zu tun, und mit Gleichheit auch nicht wirklich...


----------



## DellCapone (12. Nov 2008)

maki hat gesagt.:
			
		

> DellCapone,
> 
> das hat rein gar nichts mit ableiten zu tun, und mit Gleichheit auch nicht wirklich...



Dann sag mir mal bitte was das ist?

String str = "ja";
String str2 = new String("ja");

verlgeich die mal?

str == str2;   false
str = str2;
str == str2; true (weil die nun auf das gleiche verweisen)

Objekte kann man nur verlgeichen, wenn die auf das gleiche verweisen.


----------



## maki (12. Nov 2008)

>> Objekte kann man nur verlgeichen, wenn die auf das gleiche verweisen.

Falsch, komplett falsch sogar.

Strings sind speziell, nicht nur dass sie immutable sind, sie werden vom Kompiler auch gesondert behandelt wenn es sich um literale handelt.

== vergleicht nur die Referenz, sonst nix.

equals(..) kann mehr als nur referenzen vergleichen, je nach Implementierung, einfach mal die Api Doku dazu lesen, wenn es danach nicht klar ist etwas von Bloch.
Da ist es dann wichtig, denn Vergleich zu definieren (referentiell, wertegleichheit).

Ableiten heisst Vererben, was du meintest ist instanziieren.


----------



## Templon (12. Nov 2008)

DellCapone hat gesagt.:
			
		

> maki hat gesagt.:
> 
> 
> 
> ...



Bei Strings funktioniert das sowieso mal anders. Vergleich mal:

String str = "ja";
String str2 = "ja";
str==str2 // ergibt true (Mit meiner Java Version, irgendwer hat mal gesagt, dass es nicht unbedingt so sein muss^^)

(String-Pool)

---

Um die Objekte zu vergleichen (Nach derem Inhalt), verwendet man normalerweise equals().


----------



## DellCapone (12. Nov 2008)

Templon hat gesagt.:
			
		

> DellCapone hat gesagt.:
> 
> 
> 
> ...



String str = "ja";
String str2 = new Strin("ja");

str==str2;  //ergibt false, weil das verschiedene Objekte im Heap sind


----------

