Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

Objekte und Arbeitsspeicher

Ähnliche Präsentationen


Präsentation zum Thema: "Objekte und Arbeitsspeicher"—  Präsentation transkript:

1 Objekte und Arbeitsspeicher

2 Grundsätzliches:

3 Im Arbeitsspeicher werden Daten gespeichert
Im Arbeitsspeicher werden Daten gespeichert. Um auf die Daten eindeutig zugreifen zu können, werden diesen Daten Adressen zugeordnet. Diese sind fest eingebrannt und können nicht durch ein Programm verändert werden. Verändert werden können nur die Daten.

4 Vergleich: Jedes Haus hat eine feste Adresse, die von einem Amt fest vorgegeben werden und vom Hauseigentümer nicht verändert werden dürfen. Nur die in jedem Haus wohnenden Menschen können geändert werden (z.B. Wohnungswechsel).

5 Man kann sich einen Arbeitsspeicher schematisch wie folgt vorstellen:

6 Ausschnitt aus einem Arbeitsspeicher
Fest eingebrannte, unveränderliche Werte Adresse Wert ... 1 2 3 4 veränderliche Werte (die durch ein Programm geändert werden können). Wenn nichts anderes angegeben wird, besteht der Wert immer aus 1 Byte. Also ist 1 Byte die kleinste adressierbare Speichereinheit. Aufgabe: Die Schüler sollen das Teilprogramm abschreiben. Dann wird das Programm gemeinsam besprochen. Frage: Was geschieht programmintern durch die Deklaration int x = 5 ? Antwort: Es wird eine Speicherzelle mit dem Namen x, der Adresse 0123 und dem Wert 5 angelegt. int *ptr ? Es wird eine Speicherzelle mit dem Namen ptr, der Adsresse 0456 und dem Wert einer Adresse, z.B angelegt. Was geschieht durch die Anweisung ptr = &x; Der Wert der Variablen ptr (Speicherzelle mit Namen ptr) bekommt die Adresse der Variablen x zugewiesen. *ptr = 13; Der Inhalt der Adresse 0123 wird auf 13 gesetzt.

7 Wann werden Variablen automatisch initialisiert (d. h
Wann werden Variablen automatisch initialisiert (d.h. einer Variable das erste Mal ein Wert zugewiesen)

8 d.h. wann werden Variablen automatisch initialisiert, wann nicht?

9 1) Jede lokale Variable (innerhalb einer Methode) hat - wenn ihr kein Wert zugewiesen wurde - einen unbestimmten, undefinierten, dem Programmierer nicht bekannten Wert. Deshalb muss sie vom Programmierer vor einer lesenden Verwendung initialisiert werden, da es sonst einen Fehler beim Kompilieren gibt.

10 Beispiel

11 public class MainKlassen1 { public static void main(String[] args){ int j; int i; System.out.println("i= "+i); i=j; Hund myh1; System.out.println("myh1= "+myh1); System.out.println("myh1.getGewicht()" myh1.getGewicht()); i=5; j=7; } } class Hund{ // wie vorher } Dies sind die lokalen Variablen Welches sind die lokalen Variablen des Programms (der Methode main)? Welche Fehler hat also dieses Programm?

12 public class MainKlassen1 { public static void main(String[] args){ int j; int i; System.out.println("i= "+i); i=j; Hund myh1; System.out.println("myh1= "+myh1); System.out.println("myh1.getGewicht()" myh1.getGewicht()); i=5; j=7; } } class Hund{ // wie vorher } Fehler: i wird ausgelesen (ausgewertet), ohne vorher initialisiert worden zu sein. Fehler: myh1 (exakter: Adresse) wird ausgelesen (ausgewertet), ohne vorher initialisiert worden zu sein. Fehler: auf getGewicht() wird zugegriffen; damit wird auch myh1 ausgelesen (ausgewertet), ohne vorher initialisiert worden zu sein. Fehler: j wird ausgelesen (ausgewertet), ohne vorher initialisiert worden zu sein und wird dann i zugewiesen.

13 2) Wenn dagegen (mit new) ein Objekt einer Klasse erzeugt wird, werden automatisch (d.h. ohne Zutun des Programmierers) alle Attribute dieses gerade erzeugten Objekts wie folgt initialisiert:

14 standardmäßige Vorbelegung
Datentyp standardmäßige Vorbelegung boolean false char \u0000 byte short int long 0L float 0.0f double 0.0 Referenz null wird später erklärt

15 Durch die Deklaration einer Variable (mit primitivem Datentyp) wird im Arbeitsspeicher an einer bestimmten Adresse Platz reserviert. Wird zusätzlich bei der Deklaration die Variable noch z.B. mit 5 initialisiert, bekommt der Wert an dieser Adresse 5 zugewiesen. Wird die Variable nicht initialisiert, ist der Wert an dieser Adresse unbestimmt (undefiniert).

16 Beispiel einer Variablen mit primitivem Datentyp:

17 Die unbekannte double Zahl braucht 8 Byte.
Adresse Wert ... public static void main(...){ double myGewicht; //... } 0120 myGewicht 0121 Was veranlasst diese Anweisung im Arbeitsspeicher ? 0122 Es wird im Arbeitsspeicher an einer bestimmten Adresse Platz für die double-Zahl mit Namen myGewicht reserviert, die einen dem Programmierer nicht bekannten Wert hat 0123 ? ? ? ? ? ? ? ? 0124 Aufgabe: Die Schüler sollen das Teilprogramm abschreiben. Dann wird das Programm gemeinsam besprochen. Frage: Was geschieht programmintern durch die Deklaration int x = 5 ? Antwort: Es wird eine Speicherzelle mit dem Namen x, der Adresse 0123 und dem Wert 5 angelegt. int *ptr ? Es wird eine Speicherzelle mit dem Namen ptr, der Adsresse 0456 und dem Wert einer Adresse, z.B angelegt. Was geschieht durch die Anweisung ptr = &x; Der Wert der Variablen ptr (Speicherzelle mit Namen ptr) bekommt die Adresse der Variablen x zugewiesen. *ptr = 13; Der Inhalt der Adresse 0123 wird auf 13 gesetzt. 0125 0126 Auf die (Anfangs)Adresse dieses Speicherbereichs hat der Programmierer keinen Einfluß. Diese legt der Interpreter bzw. Programmlader fest. 0127

18 Noch ein Beispiel einer Variablen mit primitivem Datentyp:

19 double braucht 8 Byte. Wie diese Zahl auf die 8 Byte verteilt wird, ist für uns uninteressant
Adresse Wert ... public static void main(...){ double myGewicht= ; //... } 0120 myGewicht 0121 Was veranlasst diese Anweisung im Arbeitsspeicher ? 0122 Es wird im Arbeitsspeicher an einer bestimmten Adresse Platz für die double-Zahl mit Namen myGewicht reserviert und die Zahl der Variablen myGewicht zugewiesen. 0123 0124 Aufgabe: Die Schüler sollen das Teilprogramm abschreiben. Dann wird das Programm gemeinsam besprochen. Frage: Was geschieht programmintern durch die Deklaration int x = 5 ? Antwort: Es wird eine Speicherzelle mit dem Namen x, der Adresse 0123 und dem Wert 5 angelegt. int *ptr ? Es wird eine Speicherzelle mit dem Namen ptr, der Adsresse 0456 und dem Wert einer Adresse, z.B angelegt. Was geschieht durch die Anweisung ptr = &x; Der Wert der Variablen ptr (Speicherzelle mit Namen ptr) bekommt die Adresse der Variablen x zugewiesen. *ptr = 13; Der Inhalt der Adresse 0123 wird auf 13 gesetzt. 0125 0126 Auf die (Anfangs)Adresse dieses Speicherbereichs hat der Programmierer keinen Einfluß. Diese legt der Interpreter bzw. Programmlader fest. 0127

20 Beispiel einer Variablen mit einem Klassentyp:

21 Adresse Wert ... Ein Zeiger ist vergleichbar mit einer Verknüpfung auf dem Desktop, mit einem Link auf einer Website oder mit einer Hundeleine, die auf den Hund zeigt. myh1 0120 ? ... Ein Zeiger ist eine Variable, deren Wert die Anfangsadresse eines Speicherplatzes (z.B. einer Variable oder Objekt) ist. Es wird im Arbeitsspeicher an einer bestimmten Adresse Platz für den Zeiger (Referenz, Verweis, Pointer) mit Namen myh1 reserviert. Aufgabe: Die Schüler sollen das Teilprogramm abschreiben. Dann wird das Programm gemeinsam besprochen. Frage: Was geschieht programmintern durch die Deklaration int x = 5 ? Antwort: Es wird eine Speicherzelle mit dem Namen x, der Adresse 0123 und dem Wert 5 angelegt. int *ptr ? Es wird eine Speicherzelle mit dem Namen ptr, der Adsresse 0456 und dem Wert einer Adresse, z.B angelegt. Was geschieht durch die Anweisung ptr = &x; Der Wert der Variablen ptr (Speicherzelle mit Namen ptr) bekommt die Adresse der Variablen x zugewiesen. *ptr = 13; Der Inhalt der Adresse 0123 wird auf 13 gesetzt. public static void main(...){ Hund myh1; myh1=new Hund(); myh1.setName("Goldi"); myh1.setGewicht(12); } Was veranlasst diese Deklaration im Arbeitsspeicher ?

22 Weil myh1 eine lokale Variable ist, ist der Wert undefiniert.
Adresse Wert ... ? hat natürlich einen konkreten, uns unbekannten Wert, der mehrere Bytes groß ist (und nicht wie hier angedeutet nur 1 Byte verbraucht). Diese Interna brauchen uns nicht zu interessieren. myh1 0120 ? ... Ein Zeiger ist eine Variable, deren Wert die Anfangsadresse eines Speicherplatzes (z.B. einer Variable oder Objekt) ist. Es wird im Arbeitsspeicher an einer bestimmten Adresse Platz für den Zeiger (Referenz, Verweis, Pointer) mit Namen myh1 reserviert. Aufgabe: Die Schüler sollen das Teilprogramm abschreiben. Dann wird das Programm gemeinsam besprochen. Frage: Was geschieht programmintern durch die Deklaration int x = 5 ? Antwort: Es wird eine Speicherzelle mit dem Namen x, der Adresse 0123 und dem Wert 5 angelegt. int *ptr ? Es wird eine Speicherzelle mit dem Namen ptr, der Adsresse 0456 und dem Wert einer Adresse, z.B angelegt. Was geschieht durch die Anweisung ptr = &x; Der Wert der Variablen ptr (Speicherzelle mit Namen ptr) bekommt die Adresse der Variablen x zugewiesen. *ptr = 13; Der Inhalt der Adresse 0123 wird auf 13 gesetzt. public static void main(...){ Hund myh1; myh1=new Hund(); myh1.setName("Goldi"); myh1.setGewicht(12); } Auf die (Anfangs)Adresse dieses Speicherbereichs hat der Programmierer keinen Einfluß. Diese legt der Interpreter bzw. Programmlader fest. Was veranlasst diese Deklaration im Arbeitsspeicher ?

23 Adresse Wert ... Adresse Wert ... Auf die (Anfangs)Adresse dieses Speicherbereichs hat der Programmierer keinen Einfluß. Diese legt der Interpreter bzw. Programmlader fest. myh1 0120 ? 0470 ... Was veranlasst diese Anweisung im Arbeitsspeicher ? Es wird im Arbeitsspeicher an einer bestimmten Adresse Platz für das Objekt erzeugt, auf das myh1 zeigen soll. ? Aufgabe: Die Schüler sollen das Teilprogramm abschreiben. Dann wird das Programm gemeinsam besprochen. Frage: Was geschieht programmintern durch die Deklaration int x = 5 ? Antwort: Es wird eine Speicherzelle mit dem Namen x, der Adresse 0123 und dem Wert 5 angelegt. int *ptr ? Es wird eine Speicherzelle mit dem Namen ptr, der Adsresse 0456 und dem Wert einer Adresse, z.B angelegt. Was geschieht durch die Anweisung ptr = &x; Der Wert der Variablen ptr (Speicherzelle mit Namen ptr) bekommt die Adresse der Variablen x zugewiesen. *ptr = 13; Der Inhalt der Adresse 0123 wird auf 13 gesetzt. public static void main(...){ Hund myh1; myh1=new Hund(); myh1.setName("Goldi"); myh1.setGewicht(12); } Aus Platzgründen wird hier der Arbeitsspeicher auf 2 Tabellen verteilt, obwohl eigentlich der ganze Speicher durch eine Tabelle dargestellt wird! Speicherbedarf für das Objekt (Näheres dazu gleich)

24 MERKE Bei einer Variablen mit einem Klassentyp wird beim Zugriff auf diese Variable nicht das Objekt, sondern ein Zeiger auf dieses Objekt verwendet. Aufgabe: Die Schüler sollen das Teilprogramm abschreiben. Dann wird das Programm gemeinsam besprochen. Frage: Was geschieht programmintern durch die Deklaration int x = 5 ? Antwort: Es wird eine Speicherzelle mit dem Namen x, der Adresse 0123 und dem Wert 5 angelegt. int *ptr ? Es wird eine Speicherzelle mit dem Namen ptr, der Adsresse 0456 und dem Wert einer Adresse, z.B angelegt. Was geschieht durch die Anweisung ptr = &x; Der Wert der Variablen ptr (Speicherzelle mit Namen ptr) bekommt die Adresse der Variablen x zugewiesen. *ptr = 13; Der Inhalt der Adresse 0123 wird auf 13 gesetzt.

25 Wie viel Byte Speicher ein Zeiger (=Adresse) benötigt ist in der JLS (Java Language Specification) nicht festgelegt und braucht uns nicht zu interessieren. Aufgabe: Die Schüler sollen das Teilprogramm abschreiben. Dann wird das Programm gemeinsam besprochen. Frage: Was geschieht programmintern durch die Deklaration int x = 5 ? Antwort: Es wird eine Speicherzelle mit dem Namen x, der Adresse 0123 und dem Wert 5 angelegt. int *ptr ? Es wird eine Speicherzelle mit dem Namen ptr, der Adsresse 0456 und dem Wert einer Adresse, z.B angelegt. Was geschieht durch die Anweisung ptr = &x; Der Wert der Variablen ptr (Speicherzelle mit Namen ptr) bekommt die Adresse der Variablen x zugewiesen. *ptr = 13; Der Inhalt der Adresse 0123 wird auf 13 gesetzt.

26 Adresse Wert ... Adresse Wert ... myh1 0120 ? 0470 ... ? Aufgabe: Die Schüler sollen das Teilprogramm abschreiben. Dann wird das Programm gemeinsam besprochen. Frage: Was geschieht programmintern durch die Deklaration int x = 5 ? Antwort: Es wird eine Speicherzelle mit dem Namen x, der Adresse 0123 und dem Wert 5 angelegt. int *ptr ? Es wird eine Speicherzelle mit dem Namen ptr, der Adsresse 0456 und dem Wert einer Adresse, z.B angelegt. Was geschieht durch die Anweisung ptr = &x; Der Wert der Variablen ptr (Speicherzelle mit Namen ptr) bekommt die Adresse der Variablen x zugewiesen. *ptr = 13; Der Inhalt der Adresse 0123 wird auf 13 gesetzt. public static void main(...){ Hund myh1; myh1=new Hund(); myh1.setName("Goldi"); myh1.setGewicht(12); } Welchen Wert muss myh1 bekommen, damit es auf das gerade angelegte Objekt zeigt?

27 Adresse Wert ... Adresse Wert ... myh1 0120 0470 ... ? Aufgabe: Die Schüler sollen das Teilprogramm abschreiben. Dann wird das Programm gemeinsam besprochen. Frage: Was geschieht programmintern durch die Deklaration int x = 5 ? Antwort: Es wird eine Speicherzelle mit dem Namen x, der Adresse 0123 und dem Wert 5 angelegt. int *ptr ? Es wird eine Speicherzelle mit dem Namen ptr, der Adsresse 0456 und dem Wert einer Adresse, z.B angelegt. Was geschieht durch die Anweisung ptr = &x; Der Wert der Variablen ptr (Speicherzelle mit Namen ptr) bekommt die Adresse der Variablen x zugewiesen. *ptr = 13; Der Inhalt der Adresse 0123 wird auf 13 gesetzt. public static void main(...){ Hund myh1; myh1=new Hund(); myh1.setName("Goldi"); myh1.setGewicht(12); }

28 Adresse Wert ... Adresse Wert ... myh1 0120 0470 0470 ... ? Aufgabe: Die Schüler sollen das Teilprogramm abschreiben. Dann wird das Programm gemeinsam besprochen. Frage: Was geschieht programmintern durch die Deklaration int x = 5 ? Antwort: Es wird eine Speicherzelle mit dem Namen x, der Adresse 0123 und dem Wert 5 angelegt. int *ptr ? Es wird eine Speicherzelle mit dem Namen ptr, der Adsresse 0456 und dem Wert einer Adresse, z.B angelegt. Was geschieht durch die Anweisung ptr = &x; Der Wert der Variablen ptr (Speicherzelle mit Namen ptr) bekommt die Adresse der Variablen x zugewiesen. *ptr = 13; Der Inhalt der Adresse 0123 wird auf 13 gesetzt. public static void main(...){ Hund myh1; myh1=new Hund(); myh1.setName("Goldi"); myh1.setGewicht(12); }

29 Adresse Wert ... Adresse Wert ... myh1 0120 0470 0470 ... Wir erinnern uns... Die Klasse Hund hat die Attribute: private String name; private double gewicht; ? Aufgabe: Die Schüler sollen das Teilprogramm abschreiben. Dann wird das Programm gemeinsam besprochen. Frage: Was geschieht programmintern durch die Deklaration int x = 5 ? Antwort: Es wird eine Speicherzelle mit dem Namen x, der Adresse 0123 und dem Wert 5 angelegt. int *ptr ? Es wird eine Speicherzelle mit dem Namen ptr, der Adsresse 0456 und dem Wert einer Adresse, z.B angelegt. Was geschieht durch die Anweisung ptr = &x; Der Wert der Variablen ptr (Speicherzelle mit Namen ptr) bekommt die Adresse der Variablen x zugewiesen. *ptr = 13; Der Inhalt der Adresse 0123 wird auf 13 gesetzt. public static void main(...){ Hund myh1; myh1=new Hund(); myh1.setName("Goldi"); myh1.setGewicht(12); } Aus was besteht dann dieser Speicherbereich (Struktur)?

30 Adresse Wert ... Adresse Wert ... myh1 0120 0470 0470 Da dem Attribut noch kein Wert zugewiesen wurde, bekommt es standardmäßig den Wert 0 (siehe Merksatz frühere Folie) ... ... 0473 0474 Hier wird das Attribut gewicht vom Typ double abgespeichert. ... gewicht 0 . 0 0481 Aufgabe: Die Schüler sollen das Teilprogramm abschreiben. Dann wird das Programm gemeinsam besprochen. Frage: Was geschieht programmintern durch die Deklaration int x = 5 ? Antwort: Es wird eine Speicherzelle mit dem Namen x, der Adresse 0123 und dem Wert 5 angelegt. int *ptr ? Es wird eine Speicherzelle mit dem Namen ptr, der Adsresse 0456 und dem Wert einer Adresse, z.B angelegt. Was geschieht durch die Anweisung ptr = &x; Der Wert der Variablen ptr (Speicherzelle mit Namen ptr) bekommt die Adresse der Variablen x zugewiesen. *ptr = 13; Der Inhalt der Adresse 0123 wird auf 13 gesetzt. public static void main(...){ Hund myh1; myh1=new Hund(); myh1.setName("Goldi"); myh1.setGewicht(12); }

31 Adresse Wert ... Da für das Objekt noch kein Speicher angelegt wurde, hat der Zeiger den Wert... Adresse Wert ... 0470 Zeiger auf name myh1 0120 0470 ... null ... 0473 ein Zeiger auf ein Objekt abgespeichert. 0474 ... eine Klasse ist. Bei Variablen mit einem Klassentyp wird nicht das Objekt, sondern ... ... gewicht 0 . 0 0481 Aufgabe: Die Schüler sollen das Teilprogramm abschreiben. Dann wird das Programm gemeinsam besprochen. Frage: Was geschieht programmintern durch die Deklaration int x = 5 ? Antwort: Es wird eine Speicherzelle mit dem Namen x, der Adresse 0123 und dem Wert 5 angelegt. int *ptr ? Es wird eine Speicherzelle mit dem Namen ptr, der Adsresse 0456 und dem Wert einer Adresse, z.B angelegt. Was geschieht durch die Anweisung ptr = &x; Der Wert der Variablen ptr (Speicherzelle mit Namen ptr) bekommt die Adresse der Variablen x zugewiesen. *ptr = 13; Der Inhalt der Adresse 0123 wird auf 13 gesetzt. public static void main(...){ Hund myh1; myh1=new Hund(); myh1.setName("Goldi"); myh1.setGewicht(12); } Hier wird nicht das Attribut name vom Typ String abgespeichert, weil String ... Was steht als Wert in diesem Speicherbereich?

32 myh1 Adresse Wert ... Adresse Wert Adresse Wert ... 0470 0120 0470 ... null ... 0473 0474 ... 0 . 0 0481 Aufgabe: Die Schüler sollen das Teilprogramm abschreiben. Dann wird das Programm gemeinsam besprochen. Frage: Was geschieht programmintern durch die Deklaration int x = 5 ? Antwort: Es wird eine Speicherzelle mit dem Namen x, der Adresse 0123 und dem Wert 5 angelegt. int *ptr ? Es wird eine Speicherzelle mit dem Namen ptr, der Adsresse 0456 und dem Wert einer Adresse, z.B angelegt. Was geschieht durch die Anweisung ptr = &x; Der Wert der Variablen ptr (Speicherzelle mit Namen ptr) bekommt die Adresse der Variablen x zugewiesen. *ptr = 13; Der Inhalt der Adresse 0123 wird auf 13 gesetzt. public static void main(...){ Hund myh1; myh1=new Hund(); myh1.setName("Goldi"); myh1.setGewicht(12); Was veranlasst diese Anweisung im Arbeitsspeicher ?

33 Wir erinnern uns... Adresse Wert ... Adresse Wert Adresse Wert ... Wie viel Byte die Zeichenkette "Goldi" belegt, weiß ich nicht. Dies ist für uns auch uninteressant. 0470 0800 0120 0470 ... null ... "Goldi" ... 0473 ... 0474 Die Zeichenkette (=Objekt) "Goldi" steht irgendwo im Arbeitsspeicher (wo, wissen wir nicht, dies legt Interpreter bzw. Programmlader fest. Was geschieht beim Aufruf dieser Methode? ... 0 . 0 0481 Aufgabe: Die Schüler sollen das Teilprogramm abschreiben. Dann wird das Programm gemeinsam besprochen. Frage: Was geschieht programmintern durch die Deklaration int x = 5 ? Antwort: Es wird eine Speicherzelle mit dem Namen x, der Adresse 0123 und dem Wert 5 angelegt. int *ptr ? Es wird eine Speicherzelle mit dem Namen ptr, der Adsresse 0456 und dem Wert einer Adresse, z.B angelegt. Was geschieht durch die Anweisung ptr = &x; Der Wert der Variablen ptr (Speicherzelle mit Namen ptr) bekommt die Adresse der Variablen x zugewiesen. *ptr = 13; Der Inhalt der Adresse 0123 wird auf 13 gesetzt. public static void main(...){ Hund myh1; myh1=new Hund(); myh1.setName("Goldi"); myh1.setGewicht(12); Speicherbereich für Objekt Goldi

34 Was geschieht jetzt? Warum hat pname nicht den Wert "Goldi"? Adresse Wert ... Adresse Wert Der konkrete Wert des Input-Parameters (nämlich die Adresse des Objekts "Goldi") wird in den formalen Parameter pName kopiert. Adresse Wert ... 0470 0800 0120 0470 ... null ... "Goldi" MERKE Bei einer Variablen mit einem Klassentyp wird beim Zugriff auf diese Variable nicht das Objekt, sondern ein Zeiger auf dieses Objekt verwendet. ... 0473 ... 0474 ... 0 . 0 Welchen Wert hat also pName? 0481 Aufgabe: Die Schüler sollen das Teilprogramm abschreiben. Dann wird das Programm gemeinsam besprochen. Frage: Was geschieht programmintern durch die Deklaration int x = 5 ? Antwort: Es wird eine Speicherzelle mit dem Namen x, der Adresse 0123 und dem Wert 5 angelegt. int *ptr ? Es wird eine Speicherzelle mit dem Namen ptr, der Adsresse 0456 und dem Wert einer Adresse, z.B angelegt. Was geschieht durch die Anweisung ptr = &x; Der Wert der Variablen ptr (Speicherzelle mit Namen ptr) bekommt die Adresse der Variablen x zugewiesen. *ptr = 13; Der Inhalt der Adresse 0123 wird auf 13 gesetzt. public void setName(String pName){ name = pName; } public static void main(...){ Hund myh1; myh1=new Hund(); myh1.setName("Goldi"); myh1.setGewicht(12); 0800 0800 0800

35 Attribut name Adresse Wert ... Adresse Wert Adresse Wert ... 0470 0800 0800 0120 0470 ... ... "Goldi" ... 0473 ... 0474 Welche Variable befindet sich hier? ... 0 . 0 Welchen Wert hat also das Attribut name? 0481 Aufgabe: Die Schüler sollen das Teilprogramm abschreiben. Dann wird das Programm gemeinsam besprochen. Frage: Was geschieht programmintern durch die Deklaration int x = 5 ? Antwort: Es wird eine Speicherzelle mit dem Namen x, der Adresse 0123 und dem Wert 5 angelegt. int *ptr ? Es wird eine Speicherzelle mit dem Namen ptr, der Adsresse 0456 und dem Wert einer Adresse, z.B angelegt. Was geschieht durch die Anweisung ptr = &x; Der Wert der Variablen ptr (Speicherzelle mit Namen ptr) bekommt die Adresse der Variablen x zugewiesen. *ptr = 13; Der Inhalt der Adresse 0123 wird auf 13 gesetzt. public void setName(String pName){ name = pName; } public static void main(...){ Hund myh1; myh1=new Hund(); myh1.setName("Goldi"); myh1.setGewicht(12); 0800 0800 0800

36 Was veranlasst diese Anweisung im Arbeitsspeicher ?
Adresse Wert ... Der konkrete Wert des Input-Parameters (nämlich 12) wird in den formalen Parameter pGewicht kopiert. 0470 ... 0800 Adresse Wert ... 0473 0474 myh1 0120 0470 ... gewicht 0 . 0 ... 0481 Aufgabe: Die Schüler sollen das Teilprogramm abschreiben. Dann wird das Programm gemeinsam besprochen. Frage: Was geschieht programmintern durch die Deklaration int x = 5 ? Antwort: Es wird eine Speicherzelle mit dem Namen x, der Adresse 0123 und dem Wert 5 angelegt. int *ptr ? Es wird eine Speicherzelle mit dem Namen ptr, der Adsresse 0456 und dem Wert einer Adresse, z.B angelegt. Was geschieht durch die Anweisung ptr = &x; Der Wert der Variablen ptr (Speicherzelle mit Namen ptr) bekommt die Adresse der Variablen x zugewiesen. *ptr = 13; Der Inhalt der Adresse 0123 wird auf 13 gesetzt. public static void main(...){ Hund myh1; myh1=new Hund(); myh1.setName("Goldi"); myh1.setGewicht(12); }

37 public void setGewicht(double pGewicht){ gewicht = pGewicht; }
Adresse Wert ... 0470 Wir erinnern uns... ... 0800 Adresse Wert ... 0473 0474 myh1 0120 0470 ... gewicht 0 . 0 ... 0481 Aufgabe: Die Schüler sollen das Teilprogramm abschreiben. Dann wird das Programm gemeinsam besprochen. Frage: Was geschieht programmintern durch die Deklaration int x = 5 ? Antwort: Es wird eine Speicherzelle mit dem Namen x, der Adresse 0123 und dem Wert 5 angelegt. int *ptr ? Es wird eine Speicherzelle mit dem Namen ptr, der Adsresse 0456 und dem Wert einer Adresse, z.B angelegt. Was geschieht durch die Anweisung ptr = &x; Der Wert der Variablen ptr (Speicherzelle mit Namen ptr) bekommt die Adresse der Variablen x zugewiesen. *ptr = 13; Der Inhalt der Adresse 0123 wird auf 13 gesetzt. public static void main(...){ Hund myh1; myh1=new Hund(); myh1.setName("Goldi"); myh1.setGewicht(12); }

38 public void setGewicht(double pGewicht){ gewicht = pGewicht; }
Adresse Wert ... 12 12 12 0470 Welchen Wert hat also pGewicht? ... 0800 Adresse Wert ... 0473 0474 myh1 0120 0470 ... gewicht 0 . 0 ... 0481 Aufgabe: Die Schüler sollen das Teilprogramm abschreiben. Dann wird das Programm gemeinsam besprochen. Frage: Was geschieht programmintern durch die Deklaration int x = 5 ? Antwort: Es wird eine Speicherzelle mit dem Namen x, der Adresse 0123 und dem Wert 5 angelegt. int *ptr ? Es wird eine Speicherzelle mit dem Namen ptr, der Adsresse 0456 und dem Wert einer Adresse, z.B angelegt. Was geschieht durch die Anweisung ptr = &x; Der Wert der Variablen ptr (Speicherzelle mit Namen ptr) bekommt die Adresse der Variablen x zugewiesen. *ptr = 13; Der Inhalt der Adresse 0123 wird auf 13 gesetzt. public static void main(...){ Hund myh1; myh1=new Hund(); myh1.setName("Goldi"); myh1.setGewicht(12); }

39 public void setGewicht(double pGewicht){ gewicht = pGewicht; }
Adresse Wert ... 12 12 12 0470 ... 0800 Adresse Wert ... 0473 0474 myh1 0120 0470 ... gewicht ... 0481 Aufgabe: Die Schüler sollen das Teilprogramm abschreiben. Dann wird das Programm gemeinsam besprochen. Frage: Was geschieht programmintern durch die Deklaration int x = 5 ? Antwort: Es wird eine Speicherzelle mit dem Namen x, der Adresse 0123 und dem Wert 5 angelegt. int *ptr ? Es wird eine Speicherzelle mit dem Namen ptr, der Adsresse 0456 und dem Wert einer Adresse, z.B angelegt. Was geschieht durch die Anweisung ptr = &x; Der Wert der Variablen ptr (Speicherzelle mit Namen ptr) bekommt die Adresse der Variablen x zugewiesen. *ptr = 13; Der Inhalt der Adresse 0123 wird auf 13 gesetzt. public static void main(...){ Hund myh1; myh1=new Hund(); myh1.setName("Goldi"); myh1.setGewicht(12); } Welchen Wert hat also das Attribut gewicht?

40 public void setGewicht(double pGewicht){ gewicht = pGewicht; }
Adresse Wert ... 12 12 12 0470 ... 0800 Adresse Wert ... 0473 0474 myh1 0120 0470 ... gewicht 12 . 0 ... 0481 Aufgabe: Die Schüler sollen das Teilprogramm abschreiben. Dann wird das Programm gemeinsam besprochen. Frage: Was geschieht programmintern durch die Deklaration int x = 5 ? Antwort: Es wird eine Speicherzelle mit dem Namen x, der Adresse 0123 und dem Wert 5 angelegt. int *ptr ? Es wird eine Speicherzelle mit dem Namen ptr, der Adsresse 0456 und dem Wert einer Adresse, z.B angelegt. Was geschieht durch die Anweisung ptr = &x; Der Wert der Variablen ptr (Speicherzelle mit Namen ptr) bekommt die Adresse der Variablen x zugewiesen. *ptr = 13; Der Inhalt der Adresse 0123 wird auf 13 gesetzt. public static void main(...){ Hund myh1; myh1=new Hund(); myh1.setName("Goldi"); myh1.setGewicht(12); } Welchen Wert hat also das Attribut gewicht?

41 Wann werden Variablen automatisch initialisiert, wann nicht?

42 Merke

43 Lokale Variablen Jede lokale Variable (innerhalb einer Methode) hat (wenn ihr kein Wert zugewiesen wurde) einen dem Programmierer unbekannten, undefinierten Wert. Deshalb muss ihr vor einer lesenden Verwendung vom Programmierer ein Wert zugewiesen werden, da es sonst beim Kompilieren eine Fehlermeldung gibt.

44 Attribute, Felder Wenn dagegen ein Attribut einer Klasse bzw
Attribute, Felder Wenn dagegen ein Attribut einer Klasse bzw. die Komponenten (Elemente, Zellen) eines mit new erzeugten Arrays (siehe später) vom Programmierer nicht initialisiert wird, dann werden das Attribut bzw. die Komponenten des Arrays automatisch (d.h. ohne Zutun des Programmierers) wie folgt initialisiert:

45 standardmäßige Vorbelegung
Datentyp standardmäßige Vorbelegung boolean false char \u0000 byte short int long 0L float 0.0f double 0.0 Referenz null


Herunterladen ppt "Objekte und Arbeitsspeicher"

Ähnliche Präsentationen


Google-Anzeigen