Objekte werden als Adressen (Referenzen) übergeben. Dies führt manchmal zu unerwarteten...

Preview:

Citation preview

Objekte werden als Adressen (Referenzen) übergeben.Dies führt manchmal zu unerwarteten Ergebnissen ...

Hier nochmals ein Modell der Klasse Hund:

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.

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.

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.

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.

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.

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

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

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

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

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

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

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

Nach diesen Anweisungen werden jetzt danach noch ein paar neue Anweisungen gemacht ...

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

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

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);}

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);}

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

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

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

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

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

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

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

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.

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!

Weiteres Beispiel

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.

class Schwanz{ private int laenge;

public Schwanz(int plaenge){ laenge=plaenge; }

public void setLaenge(int plaenge){ laenge=plaenge; }

public int getLaenge(){ return(laenge); }}

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

public double getGewicht(){ return(gewicht); }

public void setSchwanz(Schwanz ps){ s=ps; }

public Schwanz getSchwanz(){ return(s); }}

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()); }}

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.

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 ?

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 ?

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;

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?

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

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;

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?

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

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)

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

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)

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

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

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)

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.

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?

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.

Was machen nun die gleichen Anweisungen in

main?

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 ?

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 ?

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 ?

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());

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

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

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

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)

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

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

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

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)

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

Recommended