Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   [Java] Equals und Typen mit Wertesemantik (https://www.delphipraxis.net/104577-%5Bjava%5D-equals-und-typen-mit-wertesemantik.html)

phXql 6. Dez 2007 17:19


[Java] Equals und Typen mit Wertesemantik
 
Hallo Leute,

ich sitze gerade an meiner Hausaufgabe. In dieser soll man einen Klassengenerator für Java schreiben. Dieser muss auch die equals()-Methode für die zu erzeugende Klasse generieren.
Wie vergleiche ich in equals() zwei Objekte, die Wertetyp-Semantik (also keine veränderlichen Instanzvariablen) haben? Mit equals() oder mit ==?

also
Code:
if (this.o != other.o)
  return false;
oder

Code:
if (!this.o.equals(other.o))
  return false;
?

Der_Unwissende 6. Dez 2007 17:32

Re: [Java] Equals und Typen mit Wertesemantik
 
Hi,
Objekte vergleicht man an sich immer mit equals. Der Operator == vergleicht, angewendet auf Objekte, immer nur ob diese die selbe Instanz referenzieren (also ob hier auf den gleichen Speicherbereich gezeigt wird). Nur bei primitiven Datentypen (byte, short, int, long, boolean, double, float, char) führt == einen Vergleich der Belegung durch. Selbst für den Vergleich von zwei Integer - Werten (also der Typ ist die Klasse Integer) sollte equals verwendet werden (keine Ahnung was durch Autoboxing aus == gemacht werden würde).

Gruß Der Unwissende

phXql 6. Dez 2007 18:23

Re: [Java] Equals und Typen mit Wertesemantik
 
Mh okay, das hab ich mir gedacht. Danke. (Hab zur Sicherheit nochmal meinem Prof ne Mail geschrieben, aber ich denke der wird das selbe sagen.)

yankee 6. Dez 2007 18:24

Re: [Java] Equals und Typen mit Wertesemantik
 
Zitat:

Zitat von Der_Unwissende
Nur bei primitiven Datentypen (byte, short, int, long, boolean, double, float, char) führt == einen Vergleich der Belegung durch.

Oberlehrermodus An: :warn:
Es wird immer ein Vergleich der Belegung durchgeführt. Delphi und Java verhalten sich da auch gleich.

Der Punkt ist: Ein Objekt ist ein Pointer. Also in Java eigentlich 'ne Referenz, aber eine Referenz ist auch nur ein "abgespeckter" Pointer :-). Und wenn du so einen Quelltext hast:
Delphi-Quellcode:
var i,i2: ^integer;
begin
  new(i); new(i2);
  i^ :=5;
  i2^ :=5;
  i = i2 //false
  i^ = i2^ //true
end;
dann sieht man, dass man zwei Variabeln nicht gleich sind, obwohl sie auf den gleichen Wert zeigen.
Ich hoffe das konnte man jetzt verstehen...


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:58 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz