[Progra] Frage zu Kopier-Konstruktor

[Progra] Programmierung
[DSAL] Datenstrukturen und Algorithmen
[SWT] Softwaretechnik
[DB] Datenbanken und Informationssysteme

Frage zu Kopier-Konstruktor

Beitragvon Anand » 25.11.08 14:58

Hi...

Wenn ich aus einer bestehenden Objekt x eine Kopie also ein neues Objekt y erzeuge, wie sieht es aus wenn ich überprüfen will, ob die
Objekt-Attribute gleich sind? Dazu haben wir ja == und equals() kennengelernt.

== Testet zwei Variablen auf Gleichheit
equals() prüft ja ob die inhalt gleich ist

Wenn ich x.attribut1 == y.attribut1 aufrufe, wird true geliefert :? , muss doch eingentlich false liefern oder??
Weil die referenzvariablen x und y ja auf verschiedene speicherplatz verweisen bzw zeigen!!

x.equals(y) liefert true , das ist ok!
Anand
 
Beiträge: 90
Registriert: 15.01.07 20:56

Beitragvon oxygen » 25.11.08 15:10

das hängt vom Datentyp ab. bei simplen Datentyp wie int kann der inhalt trivial überprüft werden.
oxygen
 
Beiträge: 1054
Registriert: 16.12.05 23:05
Wohnort: Bergheim
Studiengang: Informatik (Dipl.)
Studiert seit: fertig
Anwendungsfach: Medizin

Beitragvon AGo » 25.11.08 15:10

Schon, aber mit x.attribut1 == y.attribut1 vergleichst du ja nicht die referenzen x und y, sondern die Inhalte von attribut1, also meinetwegen integers oder booleans, und die können sehr wohl den gleichen Wert haben, nämlich wenn du z.B. beiden den Wert 3 zuweist. So kannst du ja auch dem attribut1 von x einen anderen wert als dem von y zuweisen, ohne das die sich irgendwie gegenseitig beeinflussen.

Wenn attribut1 jedoch eine Referenz auf ein Objekt (also einen nicht-primitiven Datentyp) ist sieht die sache natürlich anders aus, da kann es dir sehr wohl passieren, dass beide referenzen auf das selbe Objekt, sprich den selben Speicherbereich, zeigen, und damit würde eine Änderung von x.attribut1 auch automatisch eine Änderung von y.attribut1 sein.

Hoffe das hilft weiter...
Benutzeravatar
AGo
0x41476F
 
Beiträge: 2181
Registriert: 09.09.05 18:21
Wohnort: Awf
Studiengang: Informatik (Dipl.)
Anwendungsfach: BWL

Beitragvon MaoDelinSc » 25.11.08 17:52

AGo hat geschrieben:Wenn attribut1 jedoch eine Referenz auf ein Objekt (also einen nicht-primitiven Datentyp) ist sieht die sache natürlich anders aus, da kann es dir sehr wohl passieren, dass beide referenzen auf das selbe Objekt, sprich den selben Speicherbereich, zeigen, und damit würde eine Änderung von x.attribut1 auch automatisch eine Änderung von y.attribut1 sein.


Wenn er vernünftig kopiert hat, dann sollte das eigentlich nicht passieren ;)

Das ist ja gerade der Grund, weshalb == versagt... Weil x.attribut1 einen Zeiger auf das Objekt "Prof Giesl" enthält und y.attribut1 einen Zeiger auf das Objekt "Originalgetreue Kopie von Prof Giesl"
Mache ich == dann wird erkannt, dass der eine woanders ist als der andere (anderer Speicherplatz, == liefert false), bei equals wird der Inhalt verglichen und da die Kopie exakt ist, wird true geliefert.
Wenn ich y.attribut1 nun verändere zB y.attribut1 = "Carsten Otto", dann bleibt x.attribut1 gleich "Prof Giesl"

Bei den sogenannten primitiven Datentypen wie integer, die keine Referenzen enthalten, sondern eine Information ist das anders. Das liegt dadran, dass in x.attribut1 keine Speicheradresse, also ein Zeiger auf ein kreiertes Integer-Objekt gespeichert wird, sondern direkt die binär codierte int-Zahl...
Es gibt auch den Datentyp Integer, wo eine Adresse gespeichert wird, aber das wird später noch in der VL kommen ;)
Bis jetzt habt ihr ja nur den primitiven Datentyp int (int <> Integer)
Wenn ich jetzt == mache bei x.attribut1 und y.attribut1, dann steht in beiden dasselbe, nämlich die binär codierte int-Zahl (== liefert true)... Wenn ich eins verändere, dann das andere nicht...

Was AGo meinte, ist, wenn du bei der Kopie Fehler machst, also keine Kopie von "Prof Giesl" machst, sondern einfach y.attribut1 = x.attribut1 setzt, womit y.attribut1 die Speicheradresse von "Prof Giesl" enthält, also dasselbe wie x.attribut1 (== liefert true)... Ändere ich jedoch x.attribut1 = "Carsten Otto", dann zeigt y.attribut1 (hat ja immer noch dieselbe Speicheradresse wie x.attribut1) auf "Carsten Otto"
Das nennt man dann Seiteneffekt ;)
Was macht man, wenn man ein ungelöstes Problem hat?
Man gibt ihm einfach einen Namen!

(copyright Hawi)
MaoDelinSc
 
Beiträge: 296
Registriert: 07.12.07 10:28
Wohnort: Aachen
Studiengang: Informatik (B.Sc.)
Studiert seit: WS 09/10
Anwendungsfach: Medizin

Re: Frage zu Kopier-Konstruktor

Beitragvon thana » 25.11.08 19:29

Was genau willst du jetzt eigentlich wissen?
thana
 
Beiträge: 264
Registriert: 18.10.07 17:01

Beitragvon C-Otto » 25.11.08 19:37

Ich fuehle mich persoenlich angesprochen. Oder sollte ich "referenziert" sagen? :)
Dr. rer. nat. Carsten Otto
http://verify.rwth-aachen.de/otto/
Benutzeravatar
C-Otto
 
Beiträge: 568
Registriert: 10.08.06 00:20
Wohnort: Schwalbach am Taunus
Studiert seit: fertig
Anwendungsfach: BWL

Beitragvon MaoDelinSc » 25.11.08 20:04

C-Otto hat geschrieben:Ich fuehle mich persoenlich angesprochen. Oder sollte ich "referenziert" sagen? :)


Das bringt mich auf die Idee eines Beispiels ;)

class Progra {

int findetstatt;
String wirdgehaltenvon;

}

Vorlesung = new Progra();

Am Anfang habe ich ein Objekt Vorlesung (vom Typ Progra) mit den Attributen findetstatt (int, da Tag und Uhrzeit binär codiert werden) und wirdgehaltenvon (String)

Jetzt setze ich Vorlesung.findetstatt = 05815 (Freitag, 8h15)
Vorlesung.wirdgehaltenvon = "Prof Giesl"

Also: Vorlesung.findetstatt == 05815
Vorlesung.wirdgehaltenvon == Adresse von "Prof Giesl"

Kopiere ich jetzt Vorlesung in Globalübung, dann habe ich
Globalübung.findetstatt == 05815
Globalübung.wirdgehaltenvon == Adresse von "copy of Prof Giesl"

Schreibe jetzt V für VL und G für GÜ, fs für findetstatt und wgv für wirdgehaltenvon^^

== und equals liefern beide true für fs
== liefert false für wgv, aber equals liefert true (andere Adresse, selber Inhalt)

G.fs = 051545 (Freitag, 15h45)
G.wgv = "Carsten Otto"

ändert nichts an V

Setze ich nun V.wgv = G.wgv dann steht in beiden die Adresse von "Carsten Otto" (xD)

G.wgv = "Peter Schneider-Kamp" dann zieht Carsten aus seinem Haus aus und Peter ein, also steht in V.wgv ebenfalls "Peter Schneider-Kamp"

Seiteneffekt ;)

Komisches Beispiel, aber naja^^
Was macht man, wenn man ein ungelöstes Problem hat?
Man gibt ihm einfach einen Namen!

(copyright Hawi)
MaoDelinSc
 
Beiträge: 296
Registriert: 07.12.07 10:28
Wohnort: Aachen
Studiengang: Informatik (B.Sc.)
Studiert seit: WS 09/10
Anwendungsfach: Medizin

Beitragvon Tempest » 25.11.08 22:29

MaoDelinSc hat geschrieben:Setze ich nun V.wgv = G.wgv dann steht in beiden die Adresse von "Carsten Otto" (xD)

G.wgv = "Peter Schneider-Kamp" dann zieht Carsten aus seinem Haus aus und Peter ein, also steht in V.wgv ebenfalls "Peter Schneider-Kamp"

Funktioniert das wirklich so in Java? :shock:

Temp
Benutzeravatar
Tempest
 
Beiträge: 76
Registriert: 13.05.07 22:17
Studiengang: Informatik (M.Sc.)
Studiert seit: SS 07
Anwendungsfach: BWL

Beitragvon cracki » 25.11.08 23:13

Tempest hat geschrieben:
MaoDelinSc hat geschrieben:Setze ich nun V.wgv = G.wgv dann steht in beiden die Adresse von "Carsten Otto" (xD)

G.wgv = "Peter Schneider-Kamp" dann zieht Carsten aus seinem Haus aus und Peter ein, also steht in V.wgv ebenfalls "Peter Schneider-Kamp"

Funktioniert das wirklich so in Java? :shock:

Temp

Nur, falls G und V das gleiche objekt referenzieren.
"I suppose if what you said had any merit it would occasion hostility." -- Kenny Tilton
Frische Vorlesungen! -- video.rwth-aachen.de
Benutzeravatar
cracki
 
Beiträge: 537
Registriert: 22.02.08 14:51
Wohnort: Aachen
Studiengang: Informatik (M.Sc.)
Studiert seit: ?
Anwendungsfach: Medizin

Beitragvon MaoDelinSc » 26.11.08 03:22

cracki hat geschrieben:
Tempest hat geschrieben:
MaoDelinSc hat geschrieben:Setze ich nun V.wgv = G.wgv dann steht in beiden die Adresse von "Carsten Otto" (xD)

G.wgv = "Peter Schneider-Kamp" dann zieht Carsten aus seinem Haus aus und Peter ein, also steht in V.wgv ebenfalls "Peter Schneider-Kamp"

Funktioniert das wirklich so in Java? :shock:

Temp

Nur, falls G und V das gleiche objekt referenzieren.


...was sie tun, da ich mit G.wgv = "Carsten Otto" und V.wgv = G.wgv sichergestellt habe, dass beide dasselbe Objekt referenzieren ;)

@Tempest Also ja

Wenn ich jedoch V.wgv ="Prof Giesl" und G.wgv = "copy of Prof Giesl" habe, also equals zwar true liefert, == jedoch false, also nicht dasselbe Objekt referenziert wird, dann wird bei G.wgv = "Peter Schneider-Kamp" nur der Klon von Prof Giesl aus dem Haus geworfen, wo Peter einzieht... Der echte Prof Giesl bleibt wohnen, wo er ist (andere Adresse, anderes Haus), das meinte cracki bestimmt...
Was macht man, wenn man ein ungelöstes Problem hat?
Man gibt ihm einfach einen Namen!

(copyright Hawi)
MaoDelinSc
 
Beiträge: 296
Registriert: 07.12.07 10:28
Wohnort: Aachen
Studiengang: Informatik (B.Sc.)
Studiert seit: WS 09/10
Anwendungsfach: Medizin

Beitragvon cracki » 26.11.08 14:47

MaoDelinSc hat geschrieben:
cracki hat geschrieben:Nur, falls G und V das gleiche objekt referenzieren.


...was sie tun, da ich mit G.wgv = "Carsten Otto" und V.wgv = G.wgv sichergestellt habe, dass beide dasselbe Objekt referenzieren ;)


aeh, was?

mach mal korrekte, kompilierbare codebeispiele.
"I suppose if what you said had any merit it would occasion hostility." -- Kenny Tilton
Frische Vorlesungen! -- video.rwth-aachen.de
Benutzeravatar
cracki
 
Beiträge: 537
Registriert: 22.02.08 14:51
Wohnort: Aachen
Studiengang: Informatik (M.Sc.)
Studiert seit: ?
Anwendungsfach: Medizin

Beitragvon Anand » 26.11.08 16:41

cracki hat geschrieben:
mach mal korrekte, kompilierbare codebeispiele.


Hi..

Nehmen wir doch mal das Beispiel aus der Vorlesung die auf der Seite http://verify.rwth-aachen.de/programmierungWS08/ unter Konstruktoren zu finden ist.
Dot gibt es ja eine vollständige Java Quellcode: Rechteck_Programm und Rechteck.

Wenn man unter rechteck_Programm zusätzlich noch
System.out.println(u.laenge== v.laenge);
einfügt, bekommt true raus. Sollte eigentlich false sein :wink:
Anand
 
Beiträge: 90
Registriert: 15.01.07 20:56

Beitragvon biza » 26.11.08 16:48

Ich hoffe ich hab das Beispiel noch richtig im Kopf:

Du vergleichst da ja in diesem Fall nicht die Objekte miteinander, sondern den (primitiven) Datentyp int von den in den objekten u und v.

Beim Vergleich von primitiven Datentypen die man in Java immer am kleinen Anfangsbuchstaben erkennt (also boolean, int, float, double etc.) vergleichst du auch immer den jeweiligen Wert. Lediglich bei nicht-primitiven, also Anfangsbuchstabe ist groß, (z.B.: String oder Rechteck) vergleichst du mit "==" die Speicheradresse. Aber nur weil es für die Klasse gilt, die diese primitiven Datentypen beisammen hält, heißt das nicht, dass diese Eigenschaft auf die kleinen ints und doubles übertragen wird.

So verständlich?
huch, war ich das?
Benutzeravatar
biza
 
Beiträge: 139
Registriert: 20.11.08 21:02
Studiengang: Informatik (M.Sc.)
Studiert seit: WS 09/10
Anwendungsfach: Medizin

Beitragvon Anand » 26.11.08 16:52

danke!!
Anand
 
Beiträge: 90
Registriert: 15.01.07 20:56

Beitragvon C-Otto » 26.11.08 17:28

Wobei auch Stringliterale fuer Objekte stehen (stark vereinfacht ausgedrueckt). Es gibt also Falle, in denen "xxx" == "xxx" nicht true ist.
Dr. rer. nat. Carsten Otto
http://verify.rwth-aachen.de/otto/
Benutzeravatar
C-Otto
 
Beiträge: 568
Registriert: 10.08.06 00:20
Wohnort: Schwalbach am Taunus
Studiert seit: fertig
Anwendungsfach: BWL

Nächste

Zurück zu Praktische Informatik