Equals Downcast?

sousou

Bekanntes Mitglied
Guten abend,


Ich habe eine Frage zu einer Folie bei mir im Skript. Da steht nämlich folgendes:

Leider war ich an dem Tag nicht in der Vorlesung besucht und weiß nicht so genau was hiermit gemeint ist:

public boolean equals(Object obj)

1. nur mit meinem Typ vergleichen
2. downcast auf meinen Typ
3. meine Attribute vergleichen


Das ist aufjeden fall die Methode equals in der Klasse object.
Aber was meinen die mit punkt 1,2,3 *~*



Java:
Identität und Gleichheit

==  Operator prüft auf Identität
		-  Primitive:   identischer Inhalt
		-  Referenztyp:  identische Referenz zum Speicher
		
equals  inhaltliche Gleichheit
		Klasse muss equals überschreiben (Klasse Object)
		
Original equals in Objekt ist dasselbe wie ==


		
public boolean equals(Object obj)			

      1. nur mit meinem Typ vergleichen
      2. downcast auf meinen Typ
      3. meine Attribute vergleichen




equals  ist eine Äquivalenzrelation

seien  x, y,z  Objekte  != null

1. reflexiv:    x.equals(x) ist true

2. symmetrisch:   wenn  x.equals(y) == true							
	 dann gilt auch 	y.equals(x) == true
								
3. transitiv:  wenn x.equals(y) == true  und  y.equals(z)==true
	 dann gilt auch 	x.equals(z) == true								
								
(4.)  x.equals(null)  ist immer false

 	
	====================
	
	gleiche Objekte müssen denselben hashcode haben!!!
	=> Methode   int hashCode()  muss überschrieben werden


lg
 

eRaaaa

Top Contributor
Naja, mit equals legst du halt fest, wann deine Objekte inhaltlich gleich sind...da die Methode aber als Paramter ein Objekt als Object(also der Oberklasse) bekommt musst du das erstmal auf den Typen der Klasse bringen, um dann auf Methoden, Attribute etc. dieser Klasse zugreifen zu können...
1. bedeutet, dass wenn eben jmd deiner Klasse x, eine Instanz von y übergibt, das immer false ergeben soll, weil sie eben nicht die gleichen Typen haben, somit eben nicht gleich sein können...

-->
Galileo Computing :: Java ist auch eine Insel (8. Auflage) – 10.2 Object ist die Mutter aller Klassen
 
Zuletzt bearbeitet:

sousou

Bekanntes Mitglied
Ich verstanden das wenn man ein Objekt der Oberklasse mit ein Objekt der Unterklasse nicht vergleichen kann. Deswegen muss man ein Downcast des objekts der Oberklasse auf die unterklasse machen und dann können die objekte verglichen werden.


Meinst du das?

ansonsten wärs sehr korrekt wenn du mir bitte ein beispiel geben könntest...


LG
 

eRaaaa

Top Contributor
Ähm ich verstehe deinen Satz leider nicht :D

Du willst doch die Attribute deiner Klasse vergleichen..um das zu können, musst du eben Object downcasten!

Beispiel: (mal auf null-checks und ähnliches der Übersichtlichkeit verzichtet)
Java:
public class Apfel {
    private String sorte;

    @Override
    public boolean equals(Object obj) {
	if (!(obj instanceof Apfel)) {
	    return false;
	}
	Apfel other = (Apfel) obj;
	if (!sorte.equals(other.sorte)) {
	    return false;
	}
	return true;
    }
}

Zuerst wird geprüft, ob obj überhaupt ein Apfel ist (mittels instanceof)
Danach erfolgt eben der Downcast, damit man danach halt auf das Attribut sorte zugreifen und vergleichen kann...ohne den Cast, wäre obj halt noch vom Typ Object..und Object hat nunmal kein Attribut sorte...

War das deine Frage? :D
 

sousou

Bekanntes Mitglied
omg mein Satz da oben is ja komisch^^


obj ist aber kein Apfel, deswegen erfolgt der downcast. Das ist völlig richtig. Aber der downcast wird nicht ausgeführt, da die Methode ja false zurück gibt. Und wenn false zurückgegeben wird dann wird der programmcode nicht weiter drunter ausgeführt. Soweit ich weis. Müsste man also nicht den downcast in einer anderen Methode machen, oder geht das so?


Und letzte frage... Die klasse Objekt hat kein Attribut namens sorte. Weswegen ist es bei dem vergleich dann so wichtig, das man obj downcastet. Warum erstellt man nicht einfach ein objekt der Klasse Apfel
also so:

Java:
Apfel neuesobjekt = new Apfel();

if (!sorte.equals(neuesobjekt.sorte))


oder man machts ohne ganz einfach:

if (!sorte.equals(sorte))


Lg
 

eRaaaa

Top Contributor
obj ist aber kein Apfel, deswegen erfolgt der downcast. Das ist völlig richtig. Aber der downcast wird nicht ausgeführt, da die Methode ja false zurück gibt. Und wenn false zurückgegeben wird dann wird der programmcode nicht weiter drunter ausgeführt. Soweit ich weis. Müsste man also nicht den downcast in einer anderen Methode machen, oder geht das so?
Also das verstehe ich jetzt auch wieder nicht, was du damit meinst. Es kommt ja darauf an, mit welchem Objekt du das aufrufst, in der Regel rufst du das natürlich mit einem Objekt vom Typ Apfel auf!
Du willst ja schließlich die Äpfel vergleichen!
Java:
Apfel a = new Apfel();
Apfel b = new Apfel();
boolean sindGleich = a.equals(b); // b ist ja ein Apfel! Allerdings innerhalb der Methode erstmal noch nicht, da ist es dann ein Object...man muss daher downcasten !!!!

Und letzte frage... Die klasse Objekt hat kein Attribut namens sorte. Weswegen ist es bei dem vergleich dann so wichtig, das man obj downcastet. Warum erstellt man nicht einfach ein objekt der Klasse Apfel
also so:

Java:
Apfel neuesobjekt = new Apfel();

if (!sorte.equals(neuesobjekt.sorte))


oder man machts ohne ganz einfach:

if (!sorte.equals(sorte))

Das macht ja beides keinen Sinn...wieso willst du ein neues Objekt erstellen? Das wäre ja dann immer gleich (oder auch nicht, also es würde halt immer das selbe Ergebnis liefenr, egal auf was, mit was man das aufrufen würde??) Ich glaube du verstehst die Methode an sich noch nicht..es ist nicht Ziel immer true zu erreichen..sondenr man will eben ein Objekt mit einem anderen (übergebenden) vergleichen.
So wie du das mit Strings auch machst
Java:
String a = "hallo";
String b = "welt";
boolean sindGleich = a.equals(b); //false ! Weil die Strings nicht gleich sind
(man könnte auch hier irgend ein Objekt übergeben)
man könnte als auch [c]"hallo".equals(new Apfel());[/c] schreiben..würde keinen Kompilerfehler geben, weil die Methode halt ALLE Objekte annimmt...Apfel lässt sich aber nunmal nicht zu String downcasten, weil die eben gar nichts mit einander zu tun haben, also vorher der Check !

Auch dein zweiter Vorschlag macht rein gar keinen Sinn, denn du vergleichst ja immer das selbe "sorte" ?!
 
Zuletzt bearbeitet:

sousou

Bekanntes Mitglied
Also ich sag mal so:

obj ist ein Objekt der Oberklasse Object. Um aber die äquivalenz zu überprüfen muss man die Typen der der Objekte auf der selben Klasse bringen. Sprich obj muss vom Typ Apfel sein und other muss von Typ Apfel sein.

heisst das also auch ich könnte dann ebenfalls:
anstatt das hier
if (!sorte.equals(other.sorte)) {

auch folgendes schreiben:
if (!sorte.equals(obj.sorte)) {


wenn ich ein downcast vorgenommen habe das so aussähe: Apfel other = (Apfel) obj;
Weil hier wird ja obj von der Klasse Object in der Klasse Apfel downgecasted. Sprich der Typ von obj ist jetzt Apfe.


Ich hoffe du verstehst mich kleines problemschen bzw, hoffe es so richtig erklärt zu haben.





das sind nur die Zitate von denen ich meine Aussagen teilweise habe:
Naja, mit equals legst du halt fest, wann deine Objekte inhaltlich gleich sind...da die Methode aber als Paramter ein Objekt als Object(also der Oberklasse) bekommt musst du das erstmal auf den Typen der Klasse bringen, um dann auf Methoden, Attribute etc. dieser Klasse zugreifen zu können...
-->
Galileo Computing :: Java ist auch eine Insel (8. Auflage) – 10.2 Object ist die Mutter aller Klassen



Java:
public class Apfel {
    private String sorte;
 
    @Override
    public boolean equals(Object obj) {
    if (!(obj instanceof Apfel)) {
        return false;
    }
    Apfel other = (Apfel) obj;
    if (!sorte.equals(other.sorte)) {
        return false;
    }
    return true;
    }
}
 

eRaaaa

Top Contributor
heisst das also auch ich könnte dann ebenfalls:
anstatt das hier
if (!sorte.equals(other.sorte)) {

auch folgendes schreiben:
if (!sorte.equals(obj.sorte)) {

wenn ich ein downcast vorgenommen habe das so aussähe: Apfel other = (Apfel) obj;
Weil hier wird ja obj von der Klasse Object in der Klasse Apfel downgecasted. Sprich der Typ von obj ist jetzt Apfe.

Nein eben nicht, obj ist immer noch Object :) Schreib`s doch mal in deine Entwicklungsumgebung...obj.sorte kennt er nicht, weil sorte wie oben schon erwähnt nun mal kein Attribut von Object ist !

Was ginge wäre
Java:
if (!sorte.equals(((Apfel)obj).sorte)) {
Hier im Beispiel bei einem Attribut wäre das sogar imo okay, aber stell dir mal vor du hast nun mehr als ein Attribut, dann müsstest du vor jedem dieser immer casten..daher macht man das meistens einmal vorher
Apfel other = (Apfel) obj;
....

puh...vllt erkläre ich auch einfach nur richtig schlecht ?! Vllt kann wer anderes übernehmen dann =)
 

sousou

Bekanntes Mitglied
Der Compiler gibt ne Fehlermeldung aus. habs eigentlich verstanden aber bleibt wohl Phänomen. Weil ich bis heut imer dachte wenn ich ein Objekt der Oberklasse downcaste, das es in der Unterklasse die gleichen Rechte hat wie ein Objekt das von der Unterklasse erstellt worden ist.



und wenn ich dann nicht obj.sorte machen kann obwohls gedowncastet ist aber ( ( Apfel ) obj).sorte funktioniert dann is das komisch.


Trozdem danke, hab dich anscheinend einwenig zu sehr überbeschäftigt mit der erklärung.
 

eRaaaa

Top Contributor
Okay einen Versuch mache ich noch, dann bin ich im Bett...Das Objekt ist und bleibt die ganze Zeit ein Apfel!(es wurde ja schließlich irgendwann mal mit new Apfel() erzeugt. Nur lokal, für die Methode hat obj den Typ Object ! Es wurde also eingeschränkt)
Wenn du dann schreibst
Apfel other = (Apfel)obj;
änderst du nichts an der Referenz/Typ von obj.
Die neue Referenz, da weiß jetzt die Methode,: Ah Okay, other hat den Typ Apfel.

Vllt hilft dir das ja weiter(aber auch wirklich lesen :D ) :

Galileo Computing :: Java ist auch eine Insel (8. Auflage) – 6.9 Typen in Hierarchien

Gute Nacht :D
 
M

munzurOva

Gast
das Thema ist zwar ziemlich alt aber man soll ja die Suchfunktion verwenden.
Ich habe ein Problem mit dem Downcast.

Ich habe eine überarbeitete equals-Methode. Wenn ich ein Vergleich zweiter String Variablen durchführe, so bekomme ich ein ClassCastException. Warum?

Mein Problem ist unter dem Thema: Gegenseitiger Ausschluss von XOR-Beziehung nur für Hinrichtung ausgeben
( Java Basics - Anfänger-Themen - java-forum.org ) zu finden.
 

Painii

Bekanntes Mitglied
das Thema ist zwar ziemlich alt aber man soll ja die Suchfunktion verwenden.
Ja, um Antworten zu finden, die schonmal geschrieben wurden...
Einen 1-Jahr alten Thread wieder zu beleben nennt sich z.b. necro und ist nicht so toll :p
Wenn du keine Antwort findest, DANN mach nen neuen Thread mit deiner Frage.

Ich habe ein Problem mit dem Downcast.

Ich habe eine überarbeitete equals-Methode. Wenn ich ein Vergleich zweiter String Variablen durchführe, so bekomme ich ein ClassCastException. Warum?

Mein Problem ist unter dem Thema: Gegenseitiger Ausschluss von XOR-Beziehung nur für Hinrichtung ausgeben
( Java Basics - Anfänger-Themen - java-forum.org ) zu finden.

Schau mal welche Klasse o ist... Seh grad den Fehler aber nicht.

Wie gesagt, bitte mach nen neuen Thread auf :)
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
Say Equals Java Basics - Anfänger-Themen 6
W LocalDate vergleichen mit Equals? Java Basics - Anfänger-Themen 7
W Equals-Methode überschreiben bei composition Java Basics - Anfänger-Themen 20
W Wann und warum hashcode und equals? Java Basics - Anfänger-Themen 14
X Datentypen String.equals funktioniert nicht Java Basics - Anfänger-Themen 5
C Long value an Stringbuilder übergeben, equals Methode funktioniert nicht Java Basics - Anfänger-Themen 2
J compareTo()- und equals-Methode Java Basics - Anfänger-Themen 3
S 2 Strings mit Equals vergleichen Java Basics - Anfänger-Themen 11
lallmichnichtzu Methoden Überladen des .equals-Operators Java Basics - Anfänger-Themen 6
C Objekt1.equals(Objekt2) = immer false. Wieso? Java Basics - Anfänger-Themen 22
NeoLexx equals()-Methode Verständnis Frage anhand Code Beispiel Java Basics - Anfänger-Themen 22
M Objekte mittels equals vergleichen Java Basics - Anfänger-Themen 14
S Interface Equals und hashCode Java Basics - Anfänger-Themen 16
G Java equals() Methode Java Basics - Anfänger-Themen 9
J equals funktioniert nicht - Warum Java Basics - Anfänger-Themen 13
B Date - Vergleich (equals / after) ? Java Basics - Anfänger-Themen 3
G Ratlosigkeit zur Aufgabe im Anhang (boolean, equals.) Java Basics - Anfänger-Themen 20
D Unterschied == und equals in Arrays Java Basics - Anfänger-Themen 2
O equals Methode möglichst effizient Java Basics - Anfänger-Themen 13
H equals methode Java Basics - Anfänger-Themen 1
L Logistiksystem Methode equals und hashcode Java Basics - Anfänger-Themen 20
J Methoden Equals Methode für Integer und Objekte überschreiben? Java Basics - Anfänger-Themen 9
M Erste Schritte Mehrere eingaben in einer Line vergleichen (if equals...) Java Basics - Anfänger-Themen 6
I equals (Override) mit eigener Exception (keine Runtime-Exception) Java Basics - Anfänger-Themen 9
A OOP Richtige Verwendung von ArrayList und equals Java Basics - Anfänger-Themen 24
E equals Prüfung fehlgeschlagen Java Basics - Anfänger-Themen 3
C Objekt equals Java Basics - Anfänger-Themen 2
L String überprüfen mit .equals .contains oder .matches? Java Basics - Anfänger-Themen 1
H equals Methode Java Basics - Anfänger-Themen 1
F String equals NULL Problem Java Basics - Anfänger-Themen 4
D Auf equals von Vaterklasse zugreifen Java Basics - Anfänger-Themen 4
S Methoden equals(object o) / toString Java Basics - Anfänger-Themen 15
E Calender - Equals Problem Java Basics - Anfänger-Themen 14
T Datentypen compareTo() u. equals() bei Strings Java Basics - Anfänger-Themen 3
Psypsy hashCode, equals und toString Java Basics - Anfänger-Themen 3
K hashCode, compareTo vs. equals Java Basics - Anfänger-Themen 3
M Vergleich zweier Array Stellen mit equals/NullpointerException Java Basics - Anfänger-Themen 9
S Unterschiede zwischen equals und contains Java Basics - Anfänger-Themen 2
F Erste Schritte Hilfe bei Übung zu String equals() und Schleifen Java Basics - Anfänger-Themen 8
A Probleme mit equals und get.Text Java Basics - Anfänger-Themen 12
S compareTo() und equals() Java Basics - Anfänger-Themen 6
S equals Methode bei String Java Basics - Anfänger-Themen 5
R illegal start of expression - 3 Strings vergleichen mit .equals () Java Basics - Anfänger-Themen 5
K Cast bei equals Java Basics - Anfänger-Themen 2
T SQL equals Java Basics - Anfänger-Themen 4
OnDemand Methoden Equals Methde Java Basics - Anfänger-Themen 3
D if block mit equals im rumpf Java Basics - Anfänger-Themen 11
K Vererbung equals-Methode bei Vererbung abstrakter Klassen Java Basics - Anfänger-Themen 8
SexyPenny90 Wieso ist diese eigene Equals-Methode schlecht? Java Basics - Anfänger-Themen 17
K String - Equals Java Basics - Anfänger-Themen 2
J Klassen Warum ist (a.equals(b)) gleich (a==b)? Java Basics - Anfänger-Themen 13
B Warum gibst hier Equals false zurück ? Java Basics - Anfänger-Themen 23
S Verständnissfrage equals() Java Basics - Anfänger-Themen 2
R compareTo & equals Java Basics - Anfänger-Themen 10
M Verschiedene Möglichkeiten mit 'equals' abdecken? Java Basics - Anfänger-Themen 9
M Collections Problem bei Überschreibung von hashcode() und equals() bei Hashset-Implementierung Java Basics - Anfänger-Themen 5
W Stringvergleich mit equals Java Basics - Anfänger-Themen 13
C equals() Java Basics - Anfänger-Themen 4
D Problem mit string.equals bzw string.contains Java Basics - Anfänger-Themen 4
T Problem mit der while(!string.equals("x")) Java Basics - Anfänger-Themen 2
E Equals-Methode auf Class-Object Java Basics - Anfänger-Themen 17
X problem mit equals.gelöst Java Basics - Anfänger-Themen 2
J Methode equals() Java Basics - Anfänger-Themen 7
M Equals überschreiben Java Basics - Anfänger-Themen 3
K equals() und hashcode() überschreiben Java Basics - Anfänger-Themen 5
K equals in Hashmap() Java Basics - Anfänger-Themen 4
B if equals(irgendeine Zahl+Buchstabe) Java Basics - Anfänger-Themen 6
T equals() und hashCode() Java Basics - Anfänger-Themen 7
D probs mit clone und equals Java Basics - Anfänger-Themen 10
3 Collections containsKey() liefert false obwohl equals() true liefert Java Basics - Anfänger-Themen 6
N Vergleich per equals Java Basics - Anfänger-Themen 5
S comparable und equals Java Basics - Anfänger-Themen 7
M Frage zu Textvergleich (equals) Java Basics - Anfänger-Themen 8
G Strings vergleichen mit equals, geht das kürzer? Java Basics - Anfänger-Themen 4
B Frage zu Funktion mit equals Java Basics - Anfänger-Themen 17
D Eigene equals methode schreiben Java Basics - Anfänger-Themen 4
J Gibt es eine möglichkeit ähnlich wie .equals(bedingung1 ||bedingung ..n) ? Java Basics - Anfänger-Themen 5
D "2010–03–12".equals( "2010-03-12" ) Java Basics - Anfänger-Themen 6
X Frage zur Implementierung von equals() Java Basics - Anfänger-Themen 2
T Problem mit equals Java Basics - Anfänger-Themen 5
K Equals,Instanceof und "==" Java Basics - Anfänger-Themen 7
C warum liefert equals kein TRUE Java Basics - Anfänger-Themen 12
E Java hashCode equals Problem Java Basics - Anfänger-Themen 2
S equals vergleich Java Basics - Anfänger-Themen 10
H Equals hascode Java Basics - Anfänger-Themen 5
D equals Vergleiche Java Basics - Anfänger-Themen 7
L String mit equals vergleichen Java Basics - Anfänger-Themen 6
neurox Tutorial equals und hashCode überschreiben Java Basics - Anfänger-Themen 33
F String equals null wird nicht angenommen. Java Basics - Anfänger-Themen 24
A Reihenfolge bei equals() Java Basics - Anfänger-Themen 2
P Toleranz bei equals Java Basics - Anfänger-Themen 4
B Frage zu equals() und hashCode() Java Basics - Anfänger-Themen 28
A veränderbar kanonische Klassen: Methode equals, hashcode, serializable Java Basics - Anfänger-Themen 5
D String#equals + String#charAt Java Basics - Anfänger-Themen 5
S equals() - hashCode() - Contract Java Basics - Anfänger-Themen 54
G mehrere Werte für .equals ? Java Basics - Anfänger-Themen 22
T [SOLVED] Java String equals funktioniert nicht Java Basics - Anfänger-Themen 5
C 2 Objekte (mathematisch) vergleichen in der equals Methode Java Basics - Anfänger-Themen 10
B String.equals(Object) anstatt "=" Java Basics - Anfänger-Themen 3
R Vergleiche mit Equals(), hashCode() und == Java Basics - Anfänger-Themen 10

Ähnliche Java Themen

Neue Themen


Oben