Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

Objekte und Arbeitsspeicher. Grundsätzliches: Im Arbeitsspeicher werden Daten gespeichert. Um auf die Daten eindeutig zugreifen zu können, werden diesen.

Ähnliche Präsentationen


Präsentation zum Thema: "Objekte und Arbeitsspeicher. Grundsätzliches: Im Arbeitsspeicher werden Daten gespeichert. Um auf die Daten eindeutig zugreifen zu können, werden diesen."—  Präsentation transkript:

1 Objekte und Arbeitsspeicher

2 Grundsätzliches:

3 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 AdresseWert Fest eingebrannte, unveränderliche Werte 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.

7 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 } Welches sind die lokalen Variablen des Programms (der Methode main)? Welche Fehler hat also dieses Programm? Dies sind die lokalen Variablen

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: j wird ausgelesen (ausgewertet), ohne vorher initialisiert worden zu sein und wird dann i zugewiesen. Fehler: auf getGewicht() wird zugegriffen; damit wird auch myh1 ausgelesen (ausgewertet), ohne vorher initialisiert worden zu sein. Fehler: myh1 (exakter: Adresse) wird ausgelesen (ausgewertet), ohne vorher initialisiert worden zu sein.

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 Datentypstandardmäßige Vorbelegung boolean false char \u0000 byte 0 short 0 int 0 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 myGewicht AdresseWert... ? ? ? ? Auf die (Anfangs)Adresse dieses Speicherbereichs hat der Programmierer keinen Einfluß. Diese legt der Interpreter bzw. Programmlader fest. 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 Was veranlasst diese Anweisung im Arbeitsspeicher ? public static void main(...){ double myGewicht; //... } Die unbekannte double Zahl braucht 8 Byte.

18 Noch ein Beispiel einer Variablen mit primitivem Datentyp:

19 myGewicht AdresseWert Auf die (Anfangs)Adresse dieses Speicherbereichs hat der Programmierer keinen Einfluß. Diese legt der Interpreter bzw. Programmlader fest. 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. Was veranlasst diese Anweisung im Arbeitsspeicher ? public static void main(...){ double myGewicht= ; //... } double braucht 8 Byte. Wie diese Zahl auf die 8 Byte verteilt wird, ist für uns uninteressant

20 Beispiel einer Variablen mit einem Klassentyp:

21 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. 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. Ein Zeiger ist eine Variable, deren Wert die Anfangsadresse eines Speicherplatzes (z.B. einer Variable oder Objekt) ist.

22 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. ? 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. Weil myh1 eine lokale Variable ist, ist der Wert undefiniert. Ein Zeiger ist eine Variable, deren Wert die Anfangsadresse eines Speicherplatzes (z.B. einer Variable oder Objekt) ist. Auf die (Anfangs)Adresse dieses Speicherbereichs hat der Programmierer keinen Einfluß. Diese legt der Interpreter bzw. Programmlader fest.

23 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 erzeugt, auf das myh1 zeigen soll. AdresseWert ? Speicherbedarf für das Objekt (Näheres dazu gleich) Aus Platzgründen wird hier der Arbeitsspeicher auf 2 Tabellen verteilt, obwohl eigentlich der ganze Speicher durch eine Tabelle dargestellt wird! ? Auf die (Anfangs)Adresse dieses Speicherbereichs hat der Programmierer keinen Einfluß. Diese legt der Interpreter bzw. Programmlader fest.

24 MERKE Bei einer Variablen mit einem Klassentyp wird beim Zugriff auf diese Variable nicht das Objekt, sondern ein Zeiger auf dieses Objekt verwendet.

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.

26 myh1 AdresseWert public static void main(...){ Hund myh1; myh1=new Hund(); myh1.setName("Goldi"); myh1.setGewicht(12); } AdresseWert ? Welchen Wert muss myh1 bekommen, damit es auf das gerade angelegte Objekt zeigt? ?

27 myh1 AdresseWert public static void main(...){ Hund myh1; myh1=new Hund(); myh1.setName("Goldi"); myh1.setGewicht(12); } AdresseWert ?

28 myh1 AdresseWert public static void main(...){ Hund myh1; myh1=new Hund(); myh1.setName("Goldi"); myh1.setGewicht(12); } AdresseWert ?

29 myh1 AdresseWert public static void main(...){ Hund myh1; myh1=new Hund(); myh1.setName("Goldi"); myh1.setGewicht(12); } AdresseWert ? Wir erinnern uns... Die Klasse Hund hat die Attribute: private String name; private double gewicht; Aus was besteht dann dieser Speicherbereich (Struktur)? 0470

30 myh1 AdresseWert public static void main(...){ Hund myh1; myh1=new Hund(); myh1.setName("Goldi"); myh1.setGewicht(12); } AdresseWert Hier wird das Attribut gewicht vom Typ double abgespeichert. Da dem Attribut noch kein Wert zugewiesen wurde, bekommt es standardmäßig den Wert 0 (siehe Merksatz frühere Folie) gewicht 0470

31 myh1 AdresseWert public static void main(...){ Hund myh1; myh1=new Hund(); myh1.setName("Goldi"); myh1.setGewicht(12); } AdresseWert Was steht als Wert in diesem Speicherbereich? 0. 0 Hier wird nicht das Attribut name vom Typ String abgespeichert, weil String eine Klasse ist. Bei Variablen mit einem Klassentyp wird nicht das Objekt, sondern... ein Zeiger auf ein Objekt abgespeichert. Da für das Objekt noch kein Speicher angelegt wurde, hat der Zeiger den Wert... null Zeiger auf name gewicht

32 AdresseWert AdresseWert 0470 AdresseWert null public static void main(...){ Hund myh1; myh1=new Hund(); myh1.setName("Goldi"); myh1.setGewicht(12); myh1 Was veranlasst diese Anweisung im Arbeitsspeicher ?

33 AdresseWert AdresseWert 0470 AdresseWert null public static void main(...){ Hund myh1; myh1=new Hund(); myh1.setName("Goldi"); myh1.setGewicht(12); Die Zeichenkette (=Objekt) "Goldi" steht irgendwo im Arbeitsspeicher (wo, wissen wir nicht, dies legt Interpreter bzw. Programmlader fest "Goldi" Speicherbereich für Objekt Goldi Was geschieht beim Aufruf dieser Methode? Wir erinnern uns... Wie viel Byte die Zeichenkette "Goldi" belegt, weiß ich nicht. Dies ist für uns auch uninteressant.

34 AdresseWert AdresseWert 0470 AdresseWert null public static void main(...){ Hund myh1; myh1=new Hund(); myh1.setName("Goldi"); myh1.setGewicht(12); public void setName(String pName){ name = pName; } "Goldi" Was geschieht jetzt? Der konkrete Wert des Input-Parameters (nämlich die Adresse des Objekts "Goldi") wird in den formalen Parameter pName kopiert. Welchen Wert hat also pName? 0800 Warum hat pname nicht den Wert "Goldi"? 0800 MERKE Bei einer Variablen mit einem Klassentyp wird beim Zugriff auf diese Variable nicht das Objekt, sondern ein Zeiger auf dieses Objekt verwendet.

35 AdresseWert AdresseWert 0470 AdresseWert public static void main(...){ Hund myh1; myh1=new Hund(); myh1.setName("Goldi"); myh1.setGewicht(12); public void setName(String pName){ name = pName; } "Goldi" Welche Variable befindet sich hier? 0800 Welchen Wert hat also das Attribut name? Attribut name 0800

36 public static void main(...){ Hund myh1; myh1=new Hund(); myh1.setName("Goldi"); myh1.setGewicht(12); } AdresseWert gewicht Was veranlasst diese Anweisung im Arbeitsspeicher ? Der konkrete Wert des Input-Parameters (nämlich 12) wird in den formalen Parameter pGewicht kopiert. myh1 AdresseWert

37 myh1 AdresseWert public static void main(...){ Hund myh1; myh1=new Hund(); myh1.setName("Goldi"); myh1.setGewicht(12); } AdresseWert gewicht public void setGewicht(double pGewicht){ gewicht = pGewicht; } Wir erinnern uns...

38 myh1 AdresseWert public static void main(...){ Hund myh1; myh1=new Hund(); myh1.setName("Goldi"); myh1.setGewicht(12); } AdresseWert gewicht public void setGewicht(double pGewicht){ gewicht = pGewicht; } 12 Welchen Wert hat also pGewicht? 12

39 myh1 AdresseWert public static void main(...){ Hund myh1; myh1=new Hund(); myh1.setName("Goldi"); myh1.setGewicht(12); } AdresseWert gewicht public void setGewicht(double pGewicht){ gewicht = pGewicht; } 12 Welchen Wert hat also das Attribut gewicht? 12

40 myh1 AdresseWert public static void main(...){ Hund myh1; myh1=new Hund(); myh1.setName("Goldi"); myh1.setGewicht(12); } AdresseWert gewicht public void setGewicht(double pGewicht){ gewicht = pGewicht; } 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. 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 Datentypstandardmäßige Vorbelegung boolean false char \u0000 byte 0 short 0 int 0 long 0L float 0.0f double 0.0 Referenz null


Herunterladen ppt "Objekte und Arbeitsspeicher. Grundsätzliches: Im Arbeitsspeicher werden Daten gespeichert. Um auf die Daten eindeutig zugreifen zu können, werden diesen."

Ähnliche Präsentationen


Google-Anzeigen