Objekte und Arbeitsspeicher

Slides:



Advertisements
Ähnliche Präsentationen
Imperative Programmierung
Advertisements

Imperative Programmierung
der Universität Oldenburg
DVG Einfache Klassen Einfache Klassen. DVG Einfache Klassen 2 Strukturen Beispiel: Personendaten bestehen aus –String name –String vorname.
Funktionen.
Kapselung , toString , equals , Java API
der Universität Oldenburg
Java: Objektorientierte Programmierung
Java: Dynamische Datentypen
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: Grundlagen der Sprache
Java: Referenzen und Zeichenketten
Java: Grundlagen der Objektorientierung
Vererbung.
Datentyp- umwandlung. Literale sind: Bezeichner mit einem festen Wert wie z.B:
Strukturen. In einer Struktur kann eine beliebige Anzahl von Komponenten (Daten) mit unterschiedlichen Datentypen (im Gegensatz zu Feldern) zusammengefaßt.
ARRAY oder FELD oder VEKTOR
Ein Beispiel in Java.
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.
Objekte werden als Adressen (Referenzen) übergeben. Dies führt manchmal zu unerwarteten Ergebnissen...
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.
Polymorphie (Vielgestaltigkeit)
Assoziationen (Beziehungen). Zwischen Objekten kann es eine Beziehung geben.
Polymorphie (Vielgestaltigkeit)
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.
ARRAY oder FELD oder VEKTOR
Praktikum Entwicklung und Einsatz von Geosoftware I - Sitzung 3 Klassen, Objekte, Arrays und Kontrollstrukturen Sommersemester 2003 Lars Bernard.
Java-Kurs - 2. Übung Entwicklungsumgebung Struktur von Programmen
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
EDV1 - Komplexe Datentypen
DVG Felder1 Felder. DVG Felder 2 Was sind Felder? Felder sind Reihungen aus endlich vielen Elementen gleichen Typs. Z.B.: Vektoren : (x.
Arrays,Strings&Pointer in C/C++
DVG Klassen und Objekte
DVG Einfache Klassen 1 Einfache Klassen. 2DVG Einfache KlassenStrukturen Beispiel: Personendaten bestehen aus String name String name.
Java programmieren mit JavaKara
Einführung in die Programmiersprache C 3.Tag Institut für Mathematische Optimierung - Technische Universität Braunschweig.
Javakurs FSS 2012 Lehrstuhl Stuckenschmidt
Institut für Wirtschaftsinformatik – Software Engineering, JKU Linz 1 Algorithmen und Datenstrukturen SS 2005 Mag.Th. Hilpold u. Dr. A.Stritzinger Institut.
Variablenkonzept Klassisch, in Java Basistyp
Die Klasse String und ihre Methoden
CuP - Java Vierte Vorlesung Entspricht ungefähr Kapitel 2.1 des Skriptums Montag, 14. Oktober 2002.
CuP - Java Achte Vorlesung Entspricht ungefähr Kapitel 4.1 des Skriptums Montag, 28. Oktober 2002.
Polymorphie (Vielgestaltigkeit). Wenn eine Methode, wie z.B. print für verschiedene Programmteile steht (und z.B. einmal Objekte verschiedener Klassen.
Informatik I : Software höhere Programmiersprachen Java Klassen: hat Methoden (Funktionen) und Daten (Variablen) es kann mehrere Klassen geben nur eine.
Java Syntaxdiagramme Buchstabe A B Z a z ... Ziffer
Einführung Blue J. Inhaltsverzeichnis  Definition  Vokabeln.
Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 1 Algorithmen und Datenstrukturen 1 SS 2002 Mag.Thomas.
Pointer. Grundsätzliches: Im Arbeitsspeicher werden Daten gespeichert. Um auf die Daten eindeutig zugreifen zu können, werden diesen Daten Adressen zugeordnet.
Tutorium Software-Engineering SS14 Florian Manghofer.
Java Programme nur ein bisschen objektorientiert.
Konstruktoren.
ARRAY oder FELD oder VEKTOR
Variable: typ varName = Wert Kiste: Art Aufschrift  Inhalt
Es gibt Klassen, die mit der Entwicklungsumgebung ausgeliefert werden
Arrays in Java Ein Array ist eine Variable, die aus einer An-zahl von Elementen des gleichen Datentyps besteht, die aufeinanderfolgend im Speicher liegen.
Implementieren von Klassen
 Präsentation transkript:

Objekte und Arbeitsspeicher

Grundsätzliches:

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.

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).

Man kann sich einen Arbeitsspeicher schematisch wie folgt vorstellen:

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. 0815 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.

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

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

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.

Beispiel

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?

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.

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:

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

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).

Beispiel einer Variablen mit primitivem Datentyp:

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. 0815 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

Noch ein Beispiel einer Variablen mit primitivem Datentyp:

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=3.14159; //... } 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 3.14159 der Variablen myGewicht zugewiesen. 0123 3 . 1 4 1 5 9 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. 0815 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

Beispiel einer Variablen mit einem Klassentyp:

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. 0815 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 ?

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. 0815 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 ?

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. 0815 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)

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. 0815 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.

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. 0815 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.

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. 0815 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?

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

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

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. 0815 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)?

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

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. 0815 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?

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. 0815 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 ?

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. 0815 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

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. 0815 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

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. 0815 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

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

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

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

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. 0815 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?

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. 0815 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?

Wann werden Variablen automatisch initialisiert, wann nicht?

Merke

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.

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:

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