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

Slides:



Advertisements
Ähnliche Präsentationen
PKJ 2005/1 Stefan Dissmann Vorwoche - Klasse public class Studierende { private String name, vorname, studiengang; private int matNr, semester; private.
Advertisements

Kapselung , toString , equals , Java API
Ausnahmen HS Merseburg (FH) WS 06/07.
Java: Objektorientierte Programmierung
Indirekte Adressierung
FH-Hof Indirekte Adressierung Richard Göbel. FH-Hof Einfache Speicherung von Daten Eine "einfache" Deklaration definiert direkt eine Speicherplatz für.
Java: Referenzen und Zeichenketten
Java: Grundlagen der Objektorientierung
Vererbung.
SWITCH - Anweisung.
Verzweigung oder bedingte Anweisung Weiter mit PP.
Abstrakte Klassen.
Klassenvariable (auch Klassendaten bzw. statische Attribute genannt) und statische Methoden.
Strukturen. In einer Struktur kann eine beliebige Anzahl von Komponenten (Daten) mit unterschiedlichen Datentypen (im Gegensatz zu Feldern) zusammengefaßt.
Ein Beispiel in Java.
Dynamisches Array als "verkettete Liste". Ein Vergleich.
Erweiterte Zuweisungskompatibilität
Objektorientierte Programmierung
Dynamischer Speicher und Struktur
Pointer. Grundsätzliches: Im Arbeitsspeicher werden Daten gespeichert. Um auf die Daten eindeutig zugreifen zu können, werden diesen Daten Adressen zugeordnet.
Klassenvariable. Da man für jede Kuh bzw. jede Henne auf dem Markt den gleichen Preis für ein Liter Milch, bzw. den gleichen Preis für ein Ei bekommt,
Konstruktoren.
Parameterübergabe von zweidimensionalen Feldern in Funktionen.
Assoziationen (Beziehungen) 1 : n. Zu einem Auto gibt es mehrere Fahrer (2) und zu diesen 2 Fahrern gibt es genau dieses Auto.
WHILE - Anweisung. Aufgabe : Ausgabe aller ganzen Zahlen von 0 bis 100 auf dem Bildschirm.
Polymorphie (Vielgestaltigkeit)
Assoziationen (Beziehungen). Zwischen Objekten kann es eine Beziehung geben.
Polymorphie (Vielgestaltigkeit)
Objekte und Arbeitsspeicher
V AdresseWert public static void main(...){ int[] v; v=new int[2]; } Was veranlasst diese Anweisung im Arbeitsspeicher ? Es wird im Arbeitsspeicher.
Interface bzw. Schnittstelle anschaulich: Hüllenklasse
FOR Anweisung. Aufgabe : Ausgabe aller ganzen Zahlen von 0 bis 100 auf dem Bildschirm.
Dynamischer Speicher. In einer Funktion wird z.B. mit der Deklaration int i; Speicher auf dem sogenannten Stack reserviert. Wenn die Funktion verlassen.
DO...WHILE Anweisung.
ARRAY oder FELD oder VEKTOR
Praktikum Entwicklung und Einsatz von Geosoftware I - Sitzung 3 Klassen, Objekte, Arrays und Kontrollstrukturen Sommersemester 2003 Lars Bernard.
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Kapitel 5 Claudio Moraga; Gisbert Dittrich FBI Unido
Programmieren mit JAVA
Programmieren mit JAVA
PRJ 2007/1 Stefan Dissmann Motivation Problem: gleiche Datenstrukturen werden für verschiedene Objekte gebraucht: z.B. Listen von Studierenden, Kunden,
PKJ 2005/1 Stefan Dissmann Ausblick Es fehlen noch: Möglichkeiten zum Strukturieren größerer Programme Umgang mit variabler Zahl von Elementen Umgang mit.
PKJ 2005/1 Stefan Dissmann Zusammenfassung Vorwoche Programm besteht aus mehreren Bestandteilen: Schlüsselwörter Sonderzeichen Bezeichner Kommentare Texte.
Zusammenfassung Vorwoche
DVG Kommentare1 Kommentare. DVG Kommentare 2 Kommentare Es gibt zwei Arten von Kommentaren: einzeilige Kommentare // der Kommentar geht.
DVG Einführung in Java1 Einführung in JAVA.
DVG Kommentare 1 Kommentare. 2 Kommentare Es gibt zwei Arten von Kommentaren: einzeilige Kommentare // der Kommentar geht bis zum Ende der Zeile.
Java in 9 Folien Besser: Online-Buch Go to Java 2.
© 2005 Pohlig - Taulien Datenströme GK Informatik 1 Datenströme.
Seite 1 Interface - Konzept Ein Interface führt einen neuen Datentyp ein: interface Frau {... } Das Interface enthält Deklarationen ( keine Definitionen.
Javakurs FSS 2012 Lehrstuhl Stuckenschmidt
Variablenkonzept Klassisch, in Java Basistyp
Die Klasse String und ihre Methoden
Aufruf einer Methode eines Objektes vom Typ „Bruch“
Programmiervorkurs WS 2014/15 Instanzmethoden
Programmiervorkurs WS 2014 Referenzdatentypen
CuP - Java Achte Vorlesung Entspricht ungefähr Kapitel 4.1 des Skriptums Montag, 28. Oktober 2002.
early binding (frühe Bindung) late binding (späte Bindung)
Informatik I : Software höhere Programmiersprachen Java Klassen: hat Methoden (Funktionen) und Daten (Variablen) es kann mehrere Klassen geben nur eine.
Erweiterte Zuweisungskompatibilität. Wie kann man Objekte verschiedener Klassen einer Klassenhierarchie einander zuweisen ?
Dynamisches Array als "verkettete Liste". Ein Vergleich.
Pointer. Grundsätzliches: Im Arbeitsspeicher werden Daten gespeichert. Um auf die Daten eindeutig zugreifen zu können, werden diesen Daten Adressen zugeordnet.
Funktionen, Felder und Parameter- übergabe. Funktionsaufruf mit Feld als Parameter: Parameter = Name des Feldes.
Tutorium Software-Engineering SS14 Florian Manghofer.
Tutorium Software-Engineering SS14 Florian Manghofer.
Tutorium Software-Engineering SS14 Florian Manghofer.
Tutorium Software-Engineering SS14 Florian Manghofer.
Konstruktoren.
ARRAY oder FELD oder VEKTOR
Von Cem, Maurice und lars
Es gibt Klassen, die mit der Entwicklungsumgebung ausgeliefert werden
 Präsentation transkript:

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 AdresseWert 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 AdresseWert 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. AdresseWert ? 0 null 0471 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 AdresseWert 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? AdresseWert ? 0 null 0471 Zeiger auf name gewicht myh1 muss als Wert die Anfangsadresse des reservieren Speichers bekommen.

myh1 AdresseWert 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? AdresseWert null 0471 Zeiger auf name gewicht myh1 muss als Wert die Anfangsadresse des reservieren Speichers bekommen.

myh1 AdresseWert 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? AdresseWert null 0471 Zeiger auf name gewicht myh1 muss als Wert die Anfangsadresse des reservieren Speichers bekommen. 0470

myh1 AdresseWert public static void main(...){ Hund myh1; myh1=new Hund(); myh1.setName("Goldi"); myh1.setGewicht(12); } Was veranlasst diese Anweisung im Arbeitsspeicher ? AdresseWert null 0471 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 AdresseWert public static void main(...){ Hund myh1; myh1=new Hund(); myh1.setName("Goldi"); myh1.setGewicht(12); } Was veranlasst diese Anweisung im Arbeitsspeicher ? AdresseWert 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 AdresseWert public static void main(...){ Hund myh1; myh1=new Hund(); myh1.setName("Goldi"); myh1.setGewicht(12); } Was veranlasst diese Anweisung im Arbeitsspeicher ? AdresseWert 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

myh1 AdresseWert public static void main(...){ Hund myh1; myh1=new Hund(); myh1.setName("Goldi"); myh1.setGewicht(12); } Was veranlasst diese Anweisung im Arbeitsspeicher ? AdresseWert Zeiger auf name gewicht Es wird das Attribut gewicht des Speicherbereichs angesprochen, auf den myh1 zeigt Dieses Attribut bekommt als Wert den Wert

myh1 AdresseWert public static void main(...){ Hund myh1; myh1=new Hund(); myh1.setName("Goldi"); myh1.setGewicht(12); } Was veranlasst diese Anweisung im Arbeitsspeicher ? AdresseWert Zeiger auf name gewicht Es wird das Attribut gewicht des Speicherbereichs angesprochen, auf den myh1 zeigt Dieses Attribut bekommt als Wert den Wert

myh1 AdresseWert public static void main(...){ Hund myh1; myh1=new Hund(); myh1.setName("Goldi"); myh1.setGewicht(12); } Was veranlasst diese Anweisung im Arbeitsspeicher ? AdresseWert Zeiger auf name gewicht Es wird das Attribut gewicht des Speicherbereichs angesprochen, auf den myh1 zeigt Dieses Attribut bekommt als Wert den Wert

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

myh1 AdresseWert public static void main(...){... Hund myh2; myh2 = myh1; myh2.setName("Mastino"); myh2.setGewicht(100); } AdresseWert Zeiger auf name gewicht

myh1 AdresseWert AdresseWert Zeiger auf name gewicht 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 AdresseWert AdresseWert Zeiger auf name gewicht 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 AdresseWert AdresseWert Zeiger auf name gewicht Was veranlasst diese Anweisung im Arbeitsspeicher ? Der Wert von myh2 wird auf den Wert von myh1 gesetzt. myh public static void main(...){... Hund myh2; myh2 = myh1; myh2.setName("Mastino"); myh2.setGewicht(100); }

myh1 AdresseWert AdresseWert Zeiger auf name gewicht Was veranlasst diese Anweisung im Arbeitsspeicher ? Der Wert von myh2 wird auf den Wert von myh1 gesetzt. myh public static void main(...){... Hund myh2; myh2 = myh1; myh2.setName("Mastino"); myh2.setGewicht(100); } 0470

myh1 AdresseWert AdresseWert Zeiger auf name gewicht 12 Was veranlasst diese Anweisung im Arbeitsspeicher ? myh 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 AdresseWert AdresseWert Zeiger auf name gewicht 12 Was veranlasst diese Anweisung im Arbeitsspeicher ? myh 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 AdresseWert AdresseWert Zeiger auf name gewicht 12 Was veranlasst diese Anweisung im Arbeitsspeicher ? myh 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 AdresseWert AdresseWert Zeiger auf name gewicht 12 Was veranlasst diese Anweisung im Arbeitsspeicher ? myh 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 AdresseWert AdresseWert Zeiger auf name gewicht Was veranlasst diese Anweisung im Arbeitsspeicher ? myh 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

myh1 AdresseWert AdresseWert Zeiger auf name gewicht Was veranlasst diese Anweisung im Arbeitsspeicher ? myh 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

myh1 AdresseWert AdresseWert Zeiger auf name gewicht Warum ist die folgende Anweisung unnötig? myh public static void main(...){... Hund myh2; myh2 = myh1; myh2.setName("Mastino"); myh2.setGewicht(100); } 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 durch println abgekürzt. Für die Bezeichnungen im Arbeitsspeicher, usw. gilt das Gleiche wie im letzten Beispiel.

mys1 AdresseWert Es wird im Arbeitsspeicher an einer bestimmten Adresse Platz für das Objekt (und die Variable mys1) reserviert, auf das mys1 zeigen soll. AdresseWert laenge 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 AdresseWert Es wird im Arbeitsspeicher an einer bestimmten Adresse Platz für das Objekt (und die Variable myh1) reserviert, auf das myh1 zeigen soll. AdresseWert myh Zeiger auf s 0800 laenge 0801 gewicht 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 AdresseWert AdresseWert myh Zeiger auf s 0800 laenge 0801 gewicht 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 AdresseWert AdresseWert myh Zeiger auf s 0800 laenge 0801 gewicht 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 AdresseWert AdresseWert myh Zeiger auf s 0800 laenge 0801 gewicht 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 AdresseWert AdresseWert myh Zeiger auf s 0800 laenge 0801 gewicht 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 AdresseWert AdresseWert myh Zeiger auf s 0800 laenge 0801 gewicht 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 AdresseWert AdresseWert myh Zeiger auf s 0800 laenge 0801 gewicht 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; Der Wert von mys1 (also 0470) wird in ps kopiert und wird s zugewiesen. 0470

mys1 AdresseWert AdresseWert myh Zeiger auf s 0800 laenge 0801 gewicht 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? Auf dem Bildschirm wird ausgegeben: L= (=s) 15 (=laenge)

mys1 AdresseWert AdresseWert myh Zeiger auf s 0800 laenge 0801 gewicht 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 AdresseWert AdresseWert myh Zeiger auf s 0800 laenge 0801 gewicht 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 ? (=laenge)

mys1 AdresseWert AdresseWert myh Zeiger auf s 0800 laenge 0801 gewicht 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 Die Schwanzlänge wird auf 30 gesetzt

mys1 AdresseWert AdresseWert myh Zeiger auf s 0800 laenge 0801 gewicht 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 AdresseWert AdresseWert myh Zeiger auf s 0800 laenge 0801 gewicht 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()); Auf dem Bildschirm wird ausgegeben: L= (=s) 30 (=laenge)

mys1 AdresseWert AdresseWert myh Zeiger auf s 0800 laenge 0801 gewicht 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: 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 AdresseWert Es wird im Arbeitsspeicher an einer bestimmten Adresse Platz für das Objekt (und die Variable mys1) reserviert, auf das mys1 zeigen soll. AdresseWert laenge 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 AdresseWert Es wird im Arbeitsspeicher an einer bestimmten Adresse Platz für das Objekt (und die Variable myh1) reserviert, auf das myh1 zeigen soll. AdresseWert myh Zeiger auf s 0800 laenge 0801 gewicht 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 AdresseWert Welchen Wert hat das Attribut gewicht? AdresseWert myh Zeiger auf s 0800 laenge 0801 gewicht 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 AdresseWert AdresseWert myh Zeiger auf s 0800 laenge 0801 gewicht 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 AdresseWert AdresseWert myh Zeiger auf s 0800 laenge 0801 gewicht 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? 13

mys1 AdresseWert AdresseWert myh Zeiger auf s 0800 laenge 0801 gewicht 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?

mys1 AdresseWert AdresseWert myh Zeiger auf s 0800 laenge 0801 gewicht 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 Dieses Objekt zeigt auf s laenge

mys1 AdresseWert AdresseWert myh Zeiger auf s 0800 laenge 0801 gewicht 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? Auf dem Bildschirm wird ausgegeben: L=15 laenge (=s) 15 (=laenge)

mys1 AdresseWert AdresseWert myh Zeiger auf s 0800 laenge 0801 gewicht 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 ? (=laenge) laenge

mys1 AdresseWert myh Zeiger auf s 0800 laenge 0801 gewicht 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 ? AdresseWert... laenge

mys1 AdresseWert AdresseWert myh Zeiger auf s 0800 laenge 0801 gewicht 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 ? Die Schwanzlänge wird auf 30 gesetzt. laenge

mys1 AdresseWert AdresseWert myh Zeiger auf s 0800 laenge 0801 gewicht 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 ? Auf dem Bildschirm wird ausgegeben: L=15 laenge (=s) 15 (=laenge)

mys1 AdresseWert AdresseWert myh Zeiger auf s 0800 laenge 0801 gewicht 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 Ergebnis: Eine Veränderung im Objekt mys1 hat keine Auswirkungen auf das Objekt myh1. laenge