Download - Objekte werden als Adressen (Referenzen) übergeben. Dies führt manchmal zu unerwarteten Ergebnissen
![Page 1: Objekte werden als Adressen (Referenzen) übergeben. Dies führt manchmal zu unerwarteten Ergebnissen](https://reader035.vdokument.com/reader035/viewer/2022062512/55204d6549795902118bac96/html5/thumbnails/1.jpg)
Objekte werden als Adressen (Referenzen) übergeben.Dies führt manchmal zu unerwarteten Ergebnissen ...
![Page 2: Objekte werden als Adressen (Referenzen) übergeben. Dies führt manchmal zu unerwarteten Ergebnissen](https://reader035.vdokument.com/reader035/viewer/2022062512/55204d6549795902118bac96/html5/thumbnails/2.jpg)
Hier nochmals ein Modell der Klasse Hund:
![Page 3: Objekte werden als Adressen (Referenzen) übergeben. Dies führt manchmal zu unerwarteten Ergebnissen](https://reader035.vdokument.com/reader035/viewer/2022062512/55204d6549795902118bac96/html5/thumbnails/3.jpg)
class Hund{ private String name; private double gewicht;
public void setName(String pName){ name = pName; } public String getName(){ return(name); } public void setGewicht(double pGewicht){ gewicht = pGewicht; }
public double getGewicht(){ return(gewicht); }}
Zur Abwechslung wurde hier mal kein Konstruktor
implementiert.
Was geschieht dann?
Der Compiler erzeugt einen Standard-Konstruktor, der als einzige Anweisug super() enthält.
![Page 4: Objekte werden als Adressen (Referenzen) übergeben. Dies führt manchmal zu unerwarteten Ergebnissen](https://reader035.vdokument.com/reader035/viewer/2022062512/55204d6549795902118bac96/html5/thumbnails/4.jpg)
myh1
Adresse Wert
...
0120...
public static void main(...){ Hund myh1; myh1=new Hund(); myh1.setName("Goldi"); myh1.setGewicht(12);}
?
Was veranlasst diese Deklaration im Arbeitsspeicher ?
Es wird im Arbeitsspeicher an einer bestimmten Adresse Platz für den Zeiger (Referenz, Verweis, Pointer) mit Namen myh1 reserviert.
Weil myh1 eine lokale Variable ist, ist der Wert undefiniert.
![Page 5: Objekte werden als Adressen (Referenzen) übergeben. Dies führt manchmal zu unerwarteten Ergebnissen](https://reader035.vdokument.com/reader035/viewer/2022062512/55204d6549795902118bac96/html5/thumbnails/5.jpg)
myh1
Adresse Wert
...
0120...
public static void main(...){ Hund myh1; myh1=new Hund(); myh1.setName("Goldi"); myh1.setGewicht(12);}
Was veranlasst diese Anweisung im Arbeitsspeicher ?
Es wird im Arbeitsspeicher an einer bestimmten Adresse Platz für das Objekt reserviert, auf das myh1 zeigen soll.
Adresse Wert
...
0470?0
null0471
Zeiger auf name
gewicht
Vereinfacht soll hier und im Folgenden angenommen werden, dass die Attribute nur 1 Byte Speicher benötigen und im Arbeitsspeicher direkt hintereinander vorkommen.
Die Werte der Attribute werden mit den Standardwerten belegt.
![Page 6: Objekte werden als Adressen (Referenzen) übergeben. Dies führt manchmal zu unerwarteten Ergebnissen](https://reader035.vdokument.com/reader035/viewer/2022062512/55204d6549795902118bac96/html5/thumbnails/6.jpg)
myh1
Adresse Wert
...
0120...
public static void main(...){ Hund myh1; myh1=new Hund(); myh1.setName("Goldi"); myh1.setGewicht(12);}
Was muss intern noch geschehen, damit man über myh1 auf den reservierten Speicher zugreifen kann?
Adresse Wert
...
0470?0
null0471
Zeiger auf name
gewicht
myh1 muss als Wert die Anfangsadresse des reservieren Speichers bekommen.
![Page 7: Objekte werden als Adressen (Referenzen) übergeben. Dies führt manchmal zu unerwarteten Ergebnissen](https://reader035.vdokument.com/reader035/viewer/2022062512/55204d6549795902118bac96/html5/thumbnails/7.jpg)
myh1
Adresse Wert
...
0120...
public static void main(...){ Hund myh1; myh1=new Hund(); myh1.setName("Goldi"); myh1.setGewicht(12);}
Was muss intern noch geschehen, damit man über myh1 auf den reservierten Speicher zugreifen kann?
Adresse Wert
...
04700
null0471
Zeiger auf name
gewicht
myh1 muss als Wert die Anfangsadresse des reservieren Speichers bekommen.
![Page 8: Objekte werden als Adressen (Referenzen) übergeben. Dies führt manchmal zu unerwarteten Ergebnissen](https://reader035.vdokument.com/reader035/viewer/2022062512/55204d6549795902118bac96/html5/thumbnails/8.jpg)
myh1
Adresse Wert
...
0120...
public static void main(...){ Hund myh1; myh1=new Hund(); myh1.setName("Goldi"); myh1.setGewicht(12);}
Was muss intern noch geschehen, damit man über myh1 auf den reservierten Speicher zugreifen kann?
Adresse Wert
...
04700
null0471
Zeiger auf name
gewicht
myh1 muss als Wert die Anfangsadresse des reservieren Speichers bekommen.
0470
![Page 9: Objekte werden als Adressen (Referenzen) übergeben. Dies führt manchmal zu unerwarteten Ergebnissen](https://reader035.vdokument.com/reader035/viewer/2022062512/55204d6549795902118bac96/html5/thumbnails/9.jpg)
myh1
Adresse Wert
...
0120...
public static void main(...){ Hund myh1; myh1=new Hund(); myh1.setName("Goldi"); myh1.setGewicht(12);}
Was veranlasst diese Anweisung im Arbeitsspeicher ?
Adresse Wert
...
04700
null0471
Zeiger auf name
gewicht
Es wird das Attribut name des Speicherbereichs angesprochen, auf den myh1 zeigt.
Dieses Attribut bekommt als Wert die Adresse des Speicherbereichs, wo die Zeichenkette "Goldi" im Arbeitsspeicher beginnt. Wir nehmen hier an, dass die Zeichenkette "Goldi" an der Adresse 0815 beginnen soll
0470
![Page 10: Objekte werden als Adressen (Referenzen) übergeben. Dies führt manchmal zu unerwarteten Ergebnissen](https://reader035.vdokument.com/reader035/viewer/2022062512/55204d6549795902118bac96/html5/thumbnails/10.jpg)
myh1
Adresse Wert
...
0120...
public static void main(...){ Hund myh1; myh1=new Hund(); myh1.setName("Goldi"); myh1.setGewicht(12);}
Was veranlasst diese Anweisung im Arbeitsspeicher ?
Adresse Wert
...
047000471
Zeiger auf name
gewicht
Es wird das Attribut name des Speicherbereichs angesprochen, auf den myh1 zeigt.
Dieses Attribut bekommt als Wert die Adresse des Speicherbereichs, wo die Zeichenkette "Goldi" im Arbeitsspeicher beginnt. Wir nehmen hier an, dass die Zeichenkette "Goldi" an der Adresse 0815 beginnen soll
0470
![Page 11: Objekte werden als Adressen (Referenzen) übergeben. Dies führt manchmal zu unerwarteten Ergebnissen](https://reader035.vdokument.com/reader035/viewer/2022062512/55204d6549795902118bac96/html5/thumbnails/11.jpg)
myh1
Adresse Wert
...
0120...
public static void main(...){ Hund myh1; myh1=new Hund(); myh1.setName("Goldi"); myh1.setGewicht(12);}
Was veranlasst diese Anweisung im Arbeitsspeicher ?
Adresse Wert
...
047000471
Zeiger auf name
gewicht
Es wird das Attribut name des Speicherbereichs angesprochen, auf den myh1 zeigt.
Dieses Attribut bekommt als Wert die Adresse des Speicherbereichs, wo die Zeichenkette "Goldi" im Arbeitsspeicher beginnt. Wir nehmen hier an, dass die Zeichenkette "Goldi" an der Adresse 0815 beginnen soll
08150470
![Page 12: Objekte werden als Adressen (Referenzen) übergeben. Dies führt manchmal zu unerwarteten Ergebnissen](https://reader035.vdokument.com/reader035/viewer/2022062512/55204d6549795902118bac96/html5/thumbnails/12.jpg)
myh1
Adresse Wert
...
0120...
public static void main(...){ Hund myh1; myh1=new Hund(); myh1.setName("Goldi"); myh1.setGewicht(12);}
Was veranlasst diese Anweisung im Arbeitsspeicher ?
Adresse Wert
...
047000471
Zeiger auf name
gewicht
Es wird das Attribut gewicht des Speicherbereichs angesprochen, auf den myh1 zeigt.
0815
Dieses Attribut bekommt als Wert den Wert 12
0470
![Page 13: Objekte werden als Adressen (Referenzen) übergeben. Dies führt manchmal zu unerwarteten Ergebnissen](https://reader035.vdokument.com/reader035/viewer/2022062512/55204d6549795902118bac96/html5/thumbnails/13.jpg)
myh1
Adresse Wert
...
0120...
public static void main(...){ Hund myh1; myh1=new Hund(); myh1.setName("Goldi"); myh1.setGewicht(12);}
Was veranlasst diese Anweisung im Arbeitsspeicher ?
Adresse Wert
...
04700471
Zeiger auf name
gewicht
Es wird das Attribut gewicht des Speicherbereichs angesprochen, auf den myh1 zeigt.
0815
Dieses Attribut bekommt als Wert den Wert 12
0470
![Page 14: Objekte werden als Adressen (Referenzen) übergeben. Dies führt manchmal zu unerwarteten Ergebnissen](https://reader035.vdokument.com/reader035/viewer/2022062512/55204d6549795902118bac96/html5/thumbnails/14.jpg)
myh1
Adresse Wert
...
0120...
public static void main(...){ Hund myh1; myh1=new Hund(); myh1.setName("Goldi"); myh1.setGewicht(12);}
Was veranlasst diese Anweisung im Arbeitsspeicher ?
Adresse Wert
...
04700471
Zeiger auf name
gewicht
Es wird das Attribut gewicht des Speicherbereichs angesprochen, auf den myh1 zeigt.
0815
Dieses Attribut bekommt als Wert den Wert 12
120470
![Page 15: Objekte werden als Adressen (Referenzen) übergeben. Dies führt manchmal zu unerwarteten Ergebnissen](https://reader035.vdokument.com/reader035/viewer/2022062512/55204d6549795902118bac96/html5/thumbnails/15.jpg)
Nach diesen Anweisungen werden jetzt danach noch ein paar neue Anweisungen gemacht ...
![Page 16: Objekte werden als Adressen (Referenzen) übergeben. Dies führt manchmal zu unerwarteten Ergebnissen](https://reader035.vdokument.com/reader035/viewer/2022062512/55204d6549795902118bac96/html5/thumbnails/16.jpg)
myh1
Adresse Wert
...
0120...
public static void main(...){ ... Hund myh2; myh2 = myh1; myh2.setName("Mastino"); myh2.setGewicht(100);}
Adresse Wert
...
04700471
Zeiger auf name
gewicht
081512
0470
![Page 17: Objekte werden als Adressen (Referenzen) übergeben. Dies führt manchmal zu unerwarteten Ergebnissen](https://reader035.vdokument.com/reader035/viewer/2022062512/55204d6549795902118bac96/html5/thumbnails/17.jpg)
myh1
Adresse Wert
...
01200121
Adresse Wert
...
04700471
Zeiger auf name
gewicht
081512
Was veranlasst diese Anweisung im Arbeitsspeicher ?
public static void main(...){ ... Hund myh2; myh2 = myh1; myh2.setName("Mastino"); myh2.setGewicht(100);}
Es wird im Arbeitsspeicher an einer bestimmten Adresse Platz für den Zeiger (Referenz, Verweis, Pointer) mit Namen myh2 reserviert.
myh2 ?
Weil myh2 eine lokale Variable ist, ist der Wert undefiniert.
0470
![Page 18: Objekte werden als Adressen (Referenzen) übergeben. Dies führt manchmal zu unerwarteten Ergebnissen](https://reader035.vdokument.com/reader035/viewer/2022062512/55204d6549795902118bac96/html5/thumbnails/18.jpg)
myh1
Adresse Wert
...
01200121
Adresse Wert
...
04700471
Zeiger auf name
gewicht
081512
Was veranlasst diese Anweisung im Arbeitsspeicher ? Der Wert von myh2
wird auf den Wert von myh1 gesetzt.
myh2 ?0470
public static void main(...){ ... Hund myh2; myh2 = myh1; myh2.setName("Mastino"); myh2.setGewicht(100);}
![Page 19: Objekte werden als Adressen (Referenzen) übergeben. Dies führt manchmal zu unerwarteten Ergebnissen](https://reader035.vdokument.com/reader035/viewer/2022062512/55204d6549795902118bac96/html5/thumbnails/19.jpg)
myh1
Adresse Wert
...
01200121
Adresse Wert
...
04700471
Zeiger auf name
gewicht
081512
Was veranlasst diese Anweisung im Arbeitsspeicher ? Der Wert von myh2
wird auf den Wert von myh1 gesetzt.
myh2
0470
public static void main(...){ ... Hund myh2; myh2 = myh1; myh2.setName("Mastino"); myh2.setGewicht(100);}
![Page 20: Objekte werden als Adressen (Referenzen) übergeben. Dies führt manchmal zu unerwarteten Ergebnissen](https://reader035.vdokument.com/reader035/viewer/2022062512/55204d6549795902118bac96/html5/thumbnails/20.jpg)
myh1
Adresse Wert
...
01200121
Adresse Wert
...
04700471
Zeiger auf name
gewicht
081512
Was veranlasst diese Anweisung im Arbeitsspeicher ? Der Wert von myh2
wird auf den Wert von myh1 gesetzt.
myh2
0470
public static void main(...){ ... Hund myh2; myh2 = myh1; myh2.setName("Mastino"); myh2.setGewicht(100);}
0470
![Page 21: Objekte werden als Adressen (Referenzen) übergeben. Dies führt manchmal zu unerwarteten Ergebnissen](https://reader035.vdokument.com/reader035/viewer/2022062512/55204d6549795902118bac96/html5/thumbnails/21.jpg)
myh1
Adresse Wert
...
01200121
Adresse Wert
...
04700471
Zeiger auf name
gewicht 12Was veranlasst diese Anweisung im Arbeitsspeicher ?
myh2
04700470
public static void main(...){ ... Hund myh2; myh2 = myh1; myh2.setName("Mastino"); myh2.setGewicht(100);}
Es wird das Attribut name des Speicherbereichs angesprochen, auf den myh2 zeigt.
Dieses Attribut bekommt als Wert die Adresse des Speicherbereichs, wo die Zeichenkette "Mastino" im Arbeitsspeicher beginnt. Wir nehmen hier an, dass die Zeichenkette "Mastino" an der Adresse 0870 beginnen soll
0815
![Page 22: Objekte werden als Adressen (Referenzen) übergeben. Dies führt manchmal zu unerwarteten Ergebnissen](https://reader035.vdokument.com/reader035/viewer/2022062512/55204d6549795902118bac96/html5/thumbnails/22.jpg)
myh1
Adresse Wert
...
01200121
Adresse Wert
...
04700471
Zeiger auf name
gewicht 12Was veranlasst diese Anweisung im Arbeitsspeicher ?
myh2
04700470
public static void main(...){ ... Hund myh2; myh2 = myh1; myh2.setName("Mastino"); myh2.setGewicht(100);}
Es wird das Attribut name des Speicherbereichs angesprochen, auf den myh2 zeigt.
Dieses Attribut bekommt als Wert die Adresse des Speicherbereichs, wo die Zeichenkette "Mastino" im Arbeitsspeicher beginnt. Wir nehmen hier an, dass die Zeichenkette "Mastino" an der Adresse 0870 beginnen soll
![Page 23: Objekte werden als Adressen (Referenzen) übergeben. Dies führt manchmal zu unerwarteten Ergebnissen](https://reader035.vdokument.com/reader035/viewer/2022062512/55204d6549795902118bac96/html5/thumbnails/23.jpg)
myh1
Adresse Wert
...
01200121
Adresse Wert
...
04700471
Zeiger auf name
gewicht 12Was veranlasst diese Anweisung im Arbeitsspeicher ?
myh2
04700470
public static void main(...){ ... Hund myh2; myh2 = myh1; myh2.setName("Mastino"); myh2.setGewicht(100);}
Es wird das Attribut name des Speicherbereichs angesprochen, auf den myh2 zeigt.
Dieses Attribut bekommt als Wert die Adresse des Speicherbereichs, wo die Zeichenkette "Mastino" im Arbeitsspeicher beginnt. Wir nehmen hier an, dass die Zeichenkette "Mastino" an der Adresse 0870 beginnen soll
0870
![Page 24: Objekte werden als Adressen (Referenzen) übergeben. Dies führt manchmal zu unerwarteten Ergebnissen](https://reader035.vdokument.com/reader035/viewer/2022062512/55204d6549795902118bac96/html5/thumbnails/24.jpg)
myh1
Adresse Wert
...
01200121
Adresse Wert
...
04700471
Zeiger auf name
gewicht 12Was veranlasst diese Anweisung im Arbeitsspeicher ?
myh2
04700470
public static void main(...){ ... Hund myh2; myh2 = myh1; myh2.setName("Mastino"); myh2.setGewicht(100);}
0870
Es wird das Attribut gewicht des Speicherbereichs angesprochen, auf den myh2 zeigt.
Dieses Attribut bekommt als Wert den Wert 100
![Page 25: Objekte werden als Adressen (Referenzen) übergeben. Dies führt manchmal zu unerwarteten Ergebnissen](https://reader035.vdokument.com/reader035/viewer/2022062512/55204d6549795902118bac96/html5/thumbnails/25.jpg)
myh1
Adresse Wert
...
01200121
Adresse Wert
...
04700471
Zeiger auf name
gewicht
Was veranlasst diese Anweisung im Arbeitsspeicher ?
myh2
04700470
public static void main(...){ ... Hund myh2; myh2 = myh1; myh2.setName("Mastino"); myh2.setGewicht(100);}
Es wird das Attribut gewicht des Speicherbereichs angesprochen, auf den myh2 zeigt.
Dieses Attribut bekommt als Wert den Wert 100
0870
![Page 26: Objekte werden als Adressen (Referenzen) übergeben. Dies führt manchmal zu unerwarteten Ergebnissen](https://reader035.vdokument.com/reader035/viewer/2022062512/55204d6549795902118bac96/html5/thumbnails/26.jpg)
myh1
Adresse Wert
...
01200121
Adresse Wert
...
04700471
Zeiger auf name
gewicht
Was veranlasst diese Anweisung im Arbeitsspeicher ?
myh2
04700470
public static void main(...){ ... Hund myh2; myh2 = myh1; myh2.setName("Mastino"); myh2.setGewicht(100);}
Es wird das Attribut gewicht des Speicherbereichs angesprochen, auf den myh2 zeigt.
Dieses Attribut bekommt als Wert den Wert 100
1000870
![Page 27: Objekte werden als Adressen (Referenzen) übergeben. Dies führt manchmal zu unerwarteten Ergebnissen](https://reader035.vdokument.com/reader035/viewer/2022062512/55204d6549795902118bac96/html5/thumbnails/27.jpg)
myh1
Adresse Wert
...
01200121
Adresse Wert
...
04700471
Zeiger auf name
gewicht
Warum ist die folgende Anweisung unnötig?
myh2
04700470
public static void main(...){ ... Hund myh2; myh2 = myh1; myh2.setName("Mastino"); myh2.setGewicht(100);}
1000870
myh2=new Hund();
Weil in diesem Programm der dadurch reservierte Speicher nicht verwendet wird.
![Page 28: Objekte werden als Adressen (Referenzen) übergeben. Dies führt manchmal zu unerwarteten Ergebnissen](https://reader035.vdokument.com/reader035/viewer/2022062512/55204d6549795902118bac96/html5/thumbnails/28.jpg)
Ergebnis:Wenn 2 Variablen (z.B. myh1, myh2) auf das gleiche Objekt zeigen, wirkt sich eine Änderung einer Variablen (z.B. myh2.setGewicht(100) ) auch auf die andere Variable (myh1) aus!
![Page 29: Objekte werden als Adressen (Referenzen) übergeben. Dies führt manchmal zu unerwarteten Ergebnissen](https://reader035.vdokument.com/reader035/viewer/2022062512/55204d6549795902118bac96/html5/thumbnails/29.jpg)
Weiteres Beispiel
![Page 30: Objekte werden als Adressen (Referenzen) übergeben. Dies führt manchmal zu unerwarteten Ergebnissen](https://reader035.vdokument.com/reader035/viewer/2022062512/55204d6549795902118bac96/html5/thumbnails/30.jpg)
Ein Hund besitzt mehrere Körperteile. Ein Körperteil davon ist der Schwanz. Zwecks einfacher Demonstration soll der Hund so
modelliert werden, dass er nur aus den Attributen Schwanz und Gewicht besteht.
Modellieren Sie in Java die Klassen Schwanz und Hund. Zwecks einfacher
Demonstration soll der Schwanz so modelliert werden, dass er nur aus dem
Attribut Länge besteht.
![Page 31: Objekte werden als Adressen (Referenzen) übergeben. Dies führt manchmal zu unerwarteten Ergebnissen](https://reader035.vdokument.com/reader035/viewer/2022062512/55204d6549795902118bac96/html5/thumbnails/31.jpg)
class Schwanz{ private int laenge;
public Schwanz(int plaenge){ laenge=plaenge; }
public void setLaenge(int plaenge){ laenge=plaenge; }
public int getLaenge(){ return(laenge); }}
![Page 32: Objekte werden als Adressen (Referenzen) übergeben. Dies führt manchmal zu unerwarteten Ergebnissen](https://reader035.vdokument.com/reader035/viewer/2022062512/55204d6549795902118bac96/html5/thumbnails/32.jpg)
class Hund{ private Schwanz s; private double gewicht;
public Hund(double pGewicht, Schwanz ps){ gewicht=pGewicht; s=ps; }
public void setGewicht(double pGewicht){ gewicht = pGewicht; }
s zeigt auf das Objekt ps
![Page 33: Objekte werden als Adressen (Referenzen) übergeben. Dies führt manchmal zu unerwarteten Ergebnissen](https://reader035.vdokument.com/reader035/viewer/2022062512/55204d6549795902118bac96/html5/thumbnails/33.jpg)
public double getGewicht(){ return(gewicht); }
public void setSchwanz(Schwanz ps){ s=ps; }
public Schwanz getSchwanz(){ return(s); }}
![Page 34: Objekte werden als Adressen (Referenzen) übergeben. Dies führt manchmal zu unerwarteten Ergebnissen](https://reader035.vdokument.com/reader035/viewer/2022062512/55204d6549795902118bac96/html5/thumbnails/34.jpg)
public class MainKlasseReferenz10 { public static void main() throws Exception{ Schwanz mys1=new Schwanz(15); Hund myh1=new Hund(13, mys1); System.out.println("Länge="+ myh1.getSchwanz().getLaenge()); mys1.setLaenge(30); System.out.println("Länge="+ myh1.getSchwanz().getLaenge()); }}
![Page 35: Objekte werden als Adressen (Referenzen) übergeben. Dies führt manchmal zu unerwarteten Ergebnissen](https://reader035.vdokument.com/reader035/viewer/2022062512/55204d6549795902118bac96/html5/thumbnails/35.jpg)
Hier nochmals der wesentliche Teil von main(...).Aus Platzgründen wird System.out.println durchprintlnabgekürzt. Für die Bezeichnungen im Arbeitsspeicher, usw. gilt das Gleiche wie im letzten Beispiel.
![Page 36: Objekte werden als Adressen (Referenzen) übergeben. Dies führt manchmal zu unerwarteten Ergebnissen](https://reader035.vdokument.com/reader035/viewer/2022062512/55204d6549795902118bac96/html5/thumbnails/36.jpg)
mys1
Adresse Wert
...
0120...
Es wird im Arbeitsspeicher an einer bestimmten Adresse Platz für das Objekt (und die Variable mys1) reserviert, auf das mys1 zeigen soll.
Adresse Wert
...
04700470 15laenge
public static void main(...){ Schwanz mys1=new Schwanz(15); Hund myh1=new Hund(13, mys1); println("L="+myh1.getSchwanz().getLaenge()); mys1.setLaenge(30); println("L="+myh1.getSchwanz().getLaenge());
Was veranlasst diese Anweisung im Arbeitsspeicher ?
![Page 37: Objekte werden als Adressen (Referenzen) übergeben. Dies führt manchmal zu unerwarteten Ergebnissen](https://reader035.vdokument.com/reader035/viewer/2022062512/55204d6549795902118bac96/html5/thumbnails/37.jpg)
mys1
Adresse Wert
...
0120...
Es wird im Arbeitsspeicher an einer bestimmten Adresse Platz für das Objekt (und die Variable myh1) reserviert, auf das myh1 zeigen soll.
Adresse Wert
...
04700470 15
myh1 0150 0800 Zeiger auf s 0800
laenge
0801gewicht
public static void main(...){ Schwanz mys1=new Schwanz(15); Hund myh1=new Hund(13, mys1); println("L="+myh1.getSchwanz().getLaenge()); mys1.setLaenge(30); println("L="+myh1.getSchwanz().getLaenge());
Was veranlasst diese Anweisung im Arbeitsspeicher ?
![Page 38: Objekte werden als Adressen (Referenzen) übergeben. Dies führt manchmal zu unerwarteten Ergebnissen](https://reader035.vdokument.com/reader035/viewer/2022062512/55204d6549795902118bac96/html5/thumbnails/38.jpg)
mys1
Adresse Wert
...
0120...
Adresse Wert
...
04700470 15
myh1 0150 0800 Zeiger auf s 0800
laenge
0801gewicht
public static void main(...){ Schwanz mys1=new Schwanz(15); Hund myh1=new Hund(13, mys1); println("L="+myh1.getSchwanz().getLaenge()); mys1.setLaenge(30); println("L="+myh1.getSchwanz().getLaenge());
Was veranlasst diese Anweisung im Arbeitsspeicher ?
Schauen wir uns nochmals den Konstruktor von Hund an:Parameter sind blau angegeben
[double pGewicht, Schwanz ps]
gewicht=pGewicht;s=ps;
![Page 39: Objekte werden als Adressen (Referenzen) übergeben. Dies führt manchmal zu unerwarteten Ergebnissen](https://reader035.vdokument.com/reader035/viewer/2022062512/55204d6549795902118bac96/html5/thumbnails/39.jpg)
mys1
Adresse Wert
...
0120...
Adresse Wert
...
04700470 15
myh1 0150 0800 Zeiger auf s 0800
laenge
0801gewicht
public static void main(...){ Schwanz mys1=new Schwanz(15); Hund myh1=new Hund(13, mys1); println("L="+myh1.getSchwanz().getLaenge()); mys1.setLaenge(30); println("L="+myh1.getSchwanz().getLaenge());
Was veranlasst diese Anweisung im Arbeitsspeicher ?
[double pGewicht, Schwanz ps]
gewicht=pGewicht;s=ps;
Was macht diese Anweisung?
![Page 40: Objekte werden als Adressen (Referenzen) übergeben. Dies führt manchmal zu unerwarteten Ergebnissen](https://reader035.vdokument.com/reader035/viewer/2022062512/55204d6549795902118bac96/html5/thumbnails/40.jpg)
mys1
Adresse Wert
...
0120...
Adresse Wert
...
04700470 15
myh1 0150 0800 Zeiger auf s 0800
laenge
0801gewicht
public static void main(...){ Schwanz mys1=new Schwanz(15); Hund myh1=new Hund(13, mys1); println("L="+myh1.getSchwanz().getLaenge()); mys1.setLaenge(30); println("L="+myh1.getSchwanz().getLaenge());
Was veranlasst diese Anweisung im Arbeitsspeicher ?
[double pGewicht, Schwanz ps]
gewicht=pGewicht;s=ps;
13 wird in pGewicht kopiert und pGewicht wird gewicht zugewiesen.
13
![Page 41: Objekte werden als Adressen (Referenzen) übergeben. Dies führt manchmal zu unerwarteten Ergebnissen](https://reader035.vdokument.com/reader035/viewer/2022062512/55204d6549795902118bac96/html5/thumbnails/41.jpg)
mys1
Adresse Wert
...
0120...
Adresse Wert
...
04700470 15
myh1 0150 0800 Zeiger auf s 0800
laenge
0801gewicht
public static void main(...){ Schwanz mys1=new Schwanz(15); Hund myh1=new Hund(13, mys1); println("L="+myh1.getSchwanz().getLaenge()); mys1.setLaenge(30); println("L="+myh1.getSchwanz().getLaenge());
Was veranlasst diese Anweisung im Arbeitsspeicher ?
13[double pGewicht, Schwanz ps]
gewicht=pGewicht;s=ps;
![Page 42: Objekte werden als Adressen (Referenzen) übergeben. Dies führt manchmal zu unerwarteten Ergebnissen](https://reader035.vdokument.com/reader035/viewer/2022062512/55204d6549795902118bac96/html5/thumbnails/42.jpg)
mys1
Adresse Wert
...
0120...
Adresse Wert
...
04700470 15
myh1 0150 0800 Zeiger auf s 0800
laenge
0801gewicht
public static void main(...){ Schwanz mys1=new Schwanz(15); Hund myh1=new Hund(13, mys1); println("L="+myh1.getSchwanz().getLaenge()); mys1.setLaenge(30); println("L="+myh1.getSchwanz().getLaenge());
Was veranlasst diese Anweisung im Arbeitsspeicher ?
13[double pGewicht, Schwanz ps]
gewicht=pGewicht;s=ps;
Was macht diese Anweisung?
![Page 43: Objekte werden als Adressen (Referenzen) übergeben. Dies führt manchmal zu unerwarteten Ergebnissen](https://reader035.vdokument.com/reader035/viewer/2022062512/55204d6549795902118bac96/html5/thumbnails/43.jpg)
mys1
Adresse Wert
...
0120...
Adresse Wert
...
04700470 15
myh1 0150 0800 Zeiger auf s 0800
laenge
0801gewicht
public static void main(...){ Schwanz mys1=new Schwanz(15); Hund myh1=new Hund(13, mys1); println("L="+myh1.getSchwanz().getLaenge()); mys1.setLaenge(30); println("L="+myh1.getSchwanz().getLaenge());
Was veranlasst diese Anweisung im Arbeitsspeicher ?
130470
[double pGewicht, Schwanz ps]
gewicht=pGewicht;s=ps;
Der Wert von mys1 (also 0470) wird in ps kopiert und wird s zugewiesen.
0470
0470
![Page 44: Objekte werden als Adressen (Referenzen) übergeben. Dies führt manchmal zu unerwarteten Ergebnissen](https://reader035.vdokument.com/reader035/viewer/2022062512/55204d6549795902118bac96/html5/thumbnails/44.jpg)
mys1
Adresse Wert
...
0120...
Adresse Wert
...
04700470 15
myh1 0150 0800 Zeiger auf s 0800
laenge
0801gewicht
public static void main(...){ Schwanz mys1=new Schwanz(15); Hund myh1=new Hund(13, mys1); println("L="+myh1.getSchwanz().getLaenge()); mys1.setLaenge(30); println("L="+myh1.getSchwanz().getLaenge());
Was veranlasst diese Anweisung?
130470
Auf dem Bildschirm wird ausgegeben:L=150800
0470 (=s)
15 (=laenge)
![Page 45: Objekte werden als Adressen (Referenzen) übergeben. Dies führt manchmal zu unerwarteten Ergebnissen](https://reader035.vdokument.com/reader035/viewer/2022062512/55204d6549795902118bac96/html5/thumbnails/45.jpg)
mys1
Adresse Wert
...
0120...
Adresse Wert
...
04700470
myh1 0150 0800 Zeiger auf s 0800
laenge
0801gewicht
public static void main(...){ Schwanz mys1=new Schwanz(15); Hund myh1=new Hund(13, mys1); println("L="+myh1.getSchwanz().getLaenge()); mys1.setLaenge(30); println("L="+myh1.getSchwanz().getLaenge());
Was veranlasst diese Anweisung im Arbeitsspeicher ?
130470
15
![Page 46: Objekte werden als Adressen (Referenzen) übergeben. Dies führt manchmal zu unerwarteten Ergebnissen](https://reader035.vdokument.com/reader035/viewer/2022062512/55204d6549795902118bac96/html5/thumbnails/46.jpg)
mys1
Adresse Wert
...
0120...
Adresse Wert
...
04700470
myh1 0150 0800 Zeiger auf s 0800
laenge
0801gewicht
public static void main(...){ Schwanz mys1=new Schwanz(15); Hund myh1=new Hund(13, mys1); println("L="+myh1.getSchwanz().getLaenge()); mys1.setLaenge(30); println("L="+myh1.getSchwanz().getLaenge());
Was veranlasst diese Anweisung im Arbeitsspeicher ?
130470
0470 30 (=laenge)
![Page 47: Objekte werden als Adressen (Referenzen) übergeben. Dies führt manchmal zu unerwarteten Ergebnissen](https://reader035.vdokument.com/reader035/viewer/2022062512/55204d6549795902118bac96/html5/thumbnails/47.jpg)
mys1
Adresse Wert
...
0120...
Adresse Wert
...
04700470
myh1 0150 0800 Zeiger auf s 0800
laenge
0801gewicht
public static void main(...){ Schwanz mys1=new Schwanz(15); Hund myh1=new Hund(13, mys1); println("L="+myh1.getSchwanz().getLaenge()); mys1.setLaenge(30); println("L="+myh1.getSchwanz().getLaenge());
Was veranlasst diese Anweisung im Arbeitsspeicher ?
13Die Schwanzlänge wird auf 30 gesetzt.
0470
30
![Page 48: Objekte werden als Adressen (Referenzen) übergeben. Dies führt manchmal zu unerwarteten Ergebnissen](https://reader035.vdokument.com/reader035/viewer/2022062512/55204d6549795902118bac96/html5/thumbnails/48.jpg)
mys1
Adresse Wert
...
0120...
Adresse Wert
...
04700470
myh1 0150 0800 Zeiger auf s 0800
laenge
0801gewicht
public static void main(...){ Schwanz mys1=new Schwanz(15); Hund myh1=new Hund(13, mys1); println("L="+myh1.getSchwanz().getLaenge()); mys1.setLaenge(30); println("L="+myh1.getSchwanz().getLaenge());
Was veranlasst diese Anweisung im Arbeitsspeicher ?
130470
30
![Page 49: Objekte werden als Adressen (Referenzen) übergeben. Dies führt manchmal zu unerwarteten Ergebnissen](https://reader035.vdokument.com/reader035/viewer/2022062512/55204d6549795902118bac96/html5/thumbnails/49.jpg)
mys1
Adresse Wert
...
0120...
Adresse Wert
...
04700470
myh1 0150 0800 Zeiger auf s 0800
laenge
0801gewicht
public static void main(...){ Schwanz mys1=new Schwanz(15); Hund myh1=new Hund(13, mys1); println("L="+myh1.getSchwanz().getLaenge()); mys1.setLaenge(30); println("L="+myh1.getSchwanz().getLaenge());
130470
30
Auf dem Bildschirm wird ausgegeben:L=30
08000470 (=s) 30
(=laenge)
![Page 50: Objekte werden als Adressen (Referenzen) übergeben. Dies führt manchmal zu unerwarteten Ergebnissen](https://reader035.vdokument.com/reader035/viewer/2022062512/55204d6549795902118bac96/html5/thumbnails/50.jpg)
mys1
Adresse Wert
...
0120...
Adresse Wert
...
04700470
myh1 0150 0800 Zeiger auf s 0800
laenge
0801gewicht
public static void main(...){ Schwanz mys1=new Schwanz(15); Hund myh1=new Hund(13, mys1); println("L="+myh1.getSchwanz().getLaenge()); mys1.setLaenge(30); println("L="+myh1.getSchwanz().getLaenge());
Das bedeutet also:
130470
30
Ergebnis:Eine Veränderung im Objekt mys1 hat Auswirkungen auf das Objekt myh1.
![Page 51: Objekte werden als Adressen (Referenzen) übergeben. Dies führt manchmal zu unerwarteten Ergebnissen](https://reader035.vdokument.com/reader035/viewer/2022062512/55204d6549795902118bac96/html5/thumbnails/51.jpg)
Wie kann man erreichen, daß eine Änderung im Objekt mys1 keine Auswirkung mehr auf das Objekt myh1 hat?
Welche Änderung muss im Konstruktor von Hund vorgenommen werden?
![Page 52: Objekte werden als Adressen (Referenzen) übergeben. Dies führt manchmal zu unerwarteten Ergebnissen](https://reader035.vdokument.com/reader035/viewer/2022062512/55204d6549795902118bac96/html5/thumbnails/52.jpg)
class Hund{ private double gewicht; private Schwanz s;
public Hund(double pGewicht, Schwanz ps){ gewicht=pGewicht; s=new Schwanz(ps.getLaenge()); }
public void setGewicht(double pGewicht){ gewicht = pGewicht; }
Es wird ein neues Objekt angelegt.
In dieses Objekt wird die Schwanzlänge des Objekts ps kopiert.
![Page 53: Objekte werden als Adressen (Referenzen) übergeben. Dies führt manchmal zu unerwarteten Ergebnissen](https://reader035.vdokument.com/reader035/viewer/2022062512/55204d6549795902118bac96/html5/thumbnails/53.jpg)
Was machen nun die gleichen Anweisungen in
main?
![Page 54: Objekte werden als Adressen (Referenzen) übergeben. Dies führt manchmal zu unerwarteten Ergebnissen](https://reader035.vdokument.com/reader035/viewer/2022062512/55204d6549795902118bac96/html5/thumbnails/54.jpg)
mys1
Adresse Wert
...
0120...
Es wird im Arbeitsspeicher an einer bestimmten Adresse Platz für das Objekt (und die Variable mys1) reserviert, auf das mys1 zeigen soll.
Adresse Wert
...
04700470 15laenge
public static void main(...){ Schwanz mys1=new Schwanz(15); Hund myh1=new Hund(13, mys1); println("L="+myh1.getSchwanz().getLaenge()); mys1.setLaenge(30); println("L="+myh1.getSchwanz().getLaenge());
Was veranlasst diese Anweisung im Arbeitsspeicher ?
![Page 55: Objekte werden als Adressen (Referenzen) übergeben. Dies führt manchmal zu unerwarteten Ergebnissen](https://reader035.vdokument.com/reader035/viewer/2022062512/55204d6549795902118bac96/html5/thumbnails/55.jpg)
mys1
Adresse Wert
...
0120...
Es wird im Arbeitsspeicher an einer bestimmten Adresse Platz für das Objekt (und die Variable myh1) reserviert, auf das myh1 zeigen soll.
Adresse Wert
...
04700470 15
myh1 0150 0800 Zeiger auf s 0800
laenge
0801gewicht
public static void main(...){ Schwanz mys1=new Schwanz(15); Hund myh1=new Hund(13, mys1); println("L="+myh1.getSchwanz().getLaenge()); mys1.setLaenge(30); println("L="+myh1.getSchwanz().getLaenge());
Was veranlasst diese Anweisung im Arbeitsspeicher ?
![Page 56: Objekte werden als Adressen (Referenzen) übergeben. Dies führt manchmal zu unerwarteten Ergebnissen](https://reader035.vdokument.com/reader035/viewer/2022062512/55204d6549795902118bac96/html5/thumbnails/56.jpg)
mys1
Adresse Wert
...
0120...
Welchen Wert hat das Attribut gewicht?
Adresse Wert
...
04700470 15
myh1 0150 0800 Zeiger auf s 0800
laenge
0801gewicht
public static void main(...){ Schwanz mys1=new Schwanz(15); Hund myh1=new Hund(13, mys1); println("L="+myh1.getSchwanz().getLaenge()); mys1.setLaenge(30); println("L="+myh1.getSchwanz().getLaenge());
Welchen Wert (und warum) hat das Attribut s?
Was veranlasst diese Anweisung im Arbeitsspeicher ?
![Page 57: Objekte werden als Adressen (Referenzen) übergeben. Dies führt manchmal zu unerwarteten Ergebnissen](https://reader035.vdokument.com/reader035/viewer/2022062512/55204d6549795902118bac96/html5/thumbnails/57.jpg)
mys1
Adresse Wert
...
0120...
Adresse Wert
...
04700470 15
myh1 0150 0800 Zeiger auf s 0800
laenge
0801gewicht
public static void main(...){ Schwanz mys1=new Schwanz(15); Hund myh1=new Hund(13, mys1); println("L="+myh1.getSchwanz().getLaenge()); mys1.setLaenge(30); println("L="+myh1.getSchwanz().getLaenge());
Was veranlasst diese Anweisung im Arbeitsspeicher ?
Schauen wir uns nochmals den Konstruktor von Hund an:Parameter sind blau angegeben
[double pGewicht, Schwanz ps]gewicht=pGewicht;s=new Schwanz(ps.getLaenge());
![Page 58: Objekte werden als Adressen (Referenzen) übergeben. Dies führt manchmal zu unerwarteten Ergebnissen](https://reader035.vdokument.com/reader035/viewer/2022062512/55204d6549795902118bac96/html5/thumbnails/58.jpg)
mys1
Adresse Wert
...
0120...
Adresse Wert
...
04700470 15
myh1 0150 0800 Zeiger auf s 0800
laenge
0801gewicht
public static void main(...){ Schwanz mys1=new Schwanz(15); Hund myh1=new Hund(13, mys1); println("L="+myh1.getSchwanz().getLaenge()); mys1.setLaenge(30); println("L="+myh1.getSchwanz().getLaenge());
Was veranlasst diese Anweisung im Arbeitsspeicher ?
[double pGewicht, Schwanz ps]gewicht=pGewicht;s=new Schwanz(ps.getLaenge());
Was macht diese Anweisung?
1313
![Page 59: Objekte werden als Adressen (Referenzen) übergeben. Dies führt manchmal zu unerwarteten Ergebnissen](https://reader035.vdokument.com/reader035/viewer/2022062512/55204d6549795902118bac96/html5/thumbnails/59.jpg)
mys1
Adresse Wert
...
0120...
Adresse Wert
...
04700470 15
myh1 0150 0800 Zeiger auf s 0800
laenge
0801gewicht
public static void main(...){ Schwanz mys1=new Schwanz(15); Hund myh1=new Hund(13, mys1); println("L="+myh1.getSchwanz().getLaenge()); mys1.setLaenge(30); println("L="+myh1.getSchwanz().getLaenge());
13
Was veranlasst diese Anweisung im Arbeitsspeicher ?
[double pGewicht, Schwanz ps]gewicht=pGewicht;s=new Schwanz(ps.getLaenge());
Was macht diese Anweisung?
047015
![Page 60: Objekte werden als Adressen (Referenzen) übergeben. Dies führt manchmal zu unerwarteten Ergebnissen](https://reader035.vdokument.com/reader035/viewer/2022062512/55204d6549795902118bac96/html5/thumbnails/60.jpg)
mys1
Adresse Wert
...
0120...
Adresse Wert
...
04700470 15
myh1 0150 0800 Zeiger auf s 0800
laenge
0801gewicht
public static void main(...){ Schwanz mys1=new Schwanz(15); Hund myh1=new Hund(13, mys1); println("L="+myh1.getSchwanz().getLaenge()); mys1.setLaenge(30); println("L="+myh1.getSchwanz().getLaenge());
13
Was veranlasst diese Anweisung im Arbeitsspeicher ?
[double pGewicht, Schwanz ps]gewicht=pGewicht;s=new Schwanz(ps.getLaenge());
15
Es wird ein Objekt der Klasse Schwanz (mit Länge 15) angelegt.
0900
Dieses Objekt zeigt auf s
laenge0900
0900
15
![Page 61: Objekte werden als Adressen (Referenzen) übergeben. Dies führt manchmal zu unerwarteten Ergebnissen](https://reader035.vdokument.com/reader035/viewer/2022062512/55204d6549795902118bac96/html5/thumbnails/61.jpg)
mys1
Adresse Wert
...
0120...
Adresse Wert
...
04700470 15
myh1 0150 0800 Zeiger auf s 0800
laenge
0801gewicht
public static void main(...){ Schwanz mys1=new Schwanz(15); Hund myh1=new Hund(13, mys1); println("L="+myh1.getSchwanz().getLaenge()); mys1.setLaenge(30); println("L="+myh1.getSchwanz().getLaenge());
13
0900
0900
15Was veranlasst diese Anweisung?
Auf dem Bildschirm wird ausgegeben:L=15
laenge
08000900 (=s)
15 (=laenge)
![Page 62: Objekte werden als Adressen (Referenzen) übergeben. Dies führt manchmal zu unerwarteten Ergebnissen](https://reader035.vdokument.com/reader035/viewer/2022062512/55204d6549795902118bac96/html5/thumbnails/62.jpg)
mys1
Adresse Wert
...
0120...
Adresse Wert
...
04700470 15
myh1 0150 0800 Zeiger auf s 0800
laenge
0801gewicht
public static void main(...){ Schwanz mys1=new Schwanz(15); Hund myh1=new Hund(13, mys1); println("L="+myh1.getSchwanz().getLaenge()); mys1.setLaenge(30); println("L="+myh1.getSchwanz().getLaenge());
13
0900
0900
15
Was veranlasst diese Anweisung im Arbeitsspeicher ?
0470 30 (=laenge)
laenge
![Page 63: Objekte werden als Adressen (Referenzen) übergeben. Dies führt manchmal zu unerwarteten Ergebnissen](https://reader035.vdokument.com/reader035/viewer/2022062512/55204d6549795902118bac96/html5/thumbnails/63.jpg)
mys1
Adresse Wert
...
0120...
04700470
myh1 0150 0800 Zeiger auf s 0800
laenge
0801gewicht
public static void main(...){ Schwanz mys1=new Schwanz(15); Hund myh1=new Hund(13, mys1); println("L="+myh1.getSchwanz().getLaenge()); mys1.setLaenge(30); println("L="+myh1.getSchwanz().getLaenge());
13
0900
0900
15
Was veranlasst diese Anweisung im Arbeitsspeicher ?
Adresse Wert
...
laenge
![Page 64: Objekte werden als Adressen (Referenzen) übergeben. Dies führt manchmal zu unerwarteten Ergebnissen](https://reader035.vdokument.com/reader035/viewer/2022062512/55204d6549795902118bac96/html5/thumbnails/64.jpg)
mys1
Adresse Wert
...
0120...
Adresse Wert
...
04700470 30
myh1 0150 0800 Zeiger auf s 0800
laenge
0801gewicht
public static void main(...){ Schwanz mys1=new Schwanz(15); Hund myh1=new Hund(13, mys1); println("L="+myh1.getSchwanz().getLaenge()); mys1.setLaenge(30); println("L="+myh1.getSchwanz().getLaenge());
13
0900
0900
15
Was veranlasst diese Anweisung im Arbeitsspeicher ?
Die Schwanzlänge wird auf 30 gesetzt.
laenge
![Page 65: Objekte werden als Adressen (Referenzen) übergeben. Dies führt manchmal zu unerwarteten Ergebnissen](https://reader035.vdokument.com/reader035/viewer/2022062512/55204d6549795902118bac96/html5/thumbnails/65.jpg)
mys1
Adresse Wert
...
0120...
Adresse Wert
...
04700470 30
myh1 0150 0800 Zeiger auf s 0800
laenge
0801gewicht
public static void main(...){ Schwanz mys1=new Schwanz(15); Hund myh1=new Hund(13, mys1); println("L="+myh1.getSchwanz().getLaenge()); mys1.setLaenge(30); println("L="+myh1.getSchwanz().getLaenge());
13
0900
0900
15
Was veranlasst diese Anweisung im Arbeitsspeicher ?
Auf dem Bildschirm wird ausgegeben:L=15
laenge
08000900 (=s)
15 (=laenge)
![Page 66: Objekte werden als Adressen (Referenzen) übergeben. Dies führt manchmal zu unerwarteten Ergebnissen](https://reader035.vdokument.com/reader035/viewer/2022062512/55204d6549795902118bac96/html5/thumbnails/66.jpg)
mys1
Adresse Wert
...
0120...
Adresse Wert
...
04700470 30
myh1 0150 0800 Zeiger auf s 0800
laenge
0801gewicht
public static void main(...){ Schwanz mys1=new Schwanz(15); Hund myh1=new Hund(13, mys1); println("L="+myh1.getSchwanz().getLaenge()); mys1.setLaenge(30); println("L="+myh1.getSchwanz().getLaenge());
13
0900
0900
15
Das bedeutet also
Ergebnis:Eine Veränderung im Objekt mys1 hat keine Auswirkungen auf das Objekt myh1. laenge