Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

ARRAY oder FELD oder VEKTOR. Aufgabe : Drei über Tastatur eingegebene ganzzahlige Zahlen sollen in umgekehrter Reihenfolge der Eingabe wieder auf dem.

Ähnliche Präsentationen


Präsentation zum Thema: "ARRAY oder FELD oder VEKTOR. Aufgabe : Drei über Tastatur eingegebene ganzzahlige Zahlen sollen in umgekehrter Reihenfolge der Eingabe wieder auf dem."—  Präsentation transkript:

1 ARRAY oder FELD oder VEKTOR

2 Aufgabe : Drei über Tastatur eingegebene ganzzahlige Zahlen sollen in umgekehrter Reihenfolge der Eingabe wieder auf dem Bildschirm ausgegeben werden.

3 import java.io.*; public class MainArray1{ public static void main(String argv[]) throws IOException{ int z1, z2, z3; String mystr; BufferedReader myinput = new BufferedReader(new InputStreamReader(System.in));

4 System.out.println("1. Zahl eingeben"); mystr = myinput.readLine(); z1=Integer.parseInt(mystr); System.out.println("2. Zahl eingeben"); mystr = myinput.readLine(); z2=Integer.parseInt(mystr); System.out.println("3. Zahl eingeben"); mystr = myinput.readLine(); z3=Integer.parseInt(mystr); System.out.println(z3+" "+z2+" "+z1+" "); } }

5 Schreibaufwendige Lösung ! Was ist der Nachteil ?

6 keine "nächste" Variable: z1 z2 z3 Warum nicht mit Schleife lösbar ?

7 Man benötigt: Eine Variable, die aus mehreren Zellen (Elementen, Komponenten) besteht und deshalb gleichzeitig mehrere Werte speichern kann. Dies ist eine indizierte Variable, ein sogenanntes Feld (Array, Vektor).

8 1317192327 Der Index der ersten Zelle (Element) ist 0 Die Feldlänge ist 5 01234

9 Java-Syntax

10 int[] v;... v = new int[3]; Datentyp: Jede Zelle hat den gleichen Datentyp Variablenname Länge des Feldes: KONSTANTE !!! Diese Feldlänge ist (nach dem Anlegen des Speichers) eine Konstante und darf danach nicht mehr verändert werden. Sie kann NICHT während des Programmlaufs (z.B. durch den Anwender über Tastatur) verändert werden !!! Variable deklarieren Speicher für Variable reservieren

11 int[] v;... v = new int[3]; Statt dieser Schreibweise wäre auch folgendes möglich:

12 ... v = new int[3];

13 int v[];... v = new int[3]; Diese Schreibweise wird hier nicht so oft verwendet, weil...

14 Merke: Ein Feld ist in Java als ein Objekt realisiert. int[] v;... v = new int[3]; Bei dieser Schreibweise sieht man besser, dass int[] eine Klasse und v eine Objektvariable ist.

15 import java.io.*; public class MainArray3{ public static void main(String argv[]) throws IOException{ int[] v; int x; int y; v = new int [3]; // irgendwelche Anweisungen } WICHTIG v, x, y sind lokale Variablen. Deshalb haben sie an dieser Stelle einen undefinierten, dem Programmierer unbekannten Wert. Erst in der nächsten Anweisung bekommt v einen Wert (Referenzwert = Adresse) zugewiesen

16 Merke Wenn ein Feld erzeugt wird (Speicher reserviert), werden alle Elemente dieses Feldes automatisch mit den Standartwerten belegt, d.h:

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

18 Zur Wiederholung: Beim Objekt ist es analog. Dort werden sämtliche Attribute mit den Standardwerten initialisiert.

19 import java.io.*; public class MainArray3{ public static void main(String argv[]) throws IOException{ int[] v; int x; int y; v = new int [3];... } In diesem Programm werden an dieser Stelle in der nächsten Folie bestimmte Anweisungen gemacht. Aber zuerst die Frage: Welchen Wert haben x, y und die Elemente von v an dieser Stelle ?

20 v[2]=19; int main(){ 000 0019 v[0]=17; 17019 v[1]=13; 171319 x=2; 171319 ?? v xy v[x]=23; 171323 y=v[1]; 171323 v[x]=y; 1713 ?? ?? ?? 2? 2? 2 2

21 Aufgabe Welche Anweisungen des folgenden Programms sind semantisch falsch (Compiler meldet keinen Fehler, aber Interpreter)?

22 import java.io.*; public class MainArray4{ public static void main(String argv[]) throws IOException{ int len; int[] v; String mystr; BufferedReader myinput = new BufferedReader(newInputStreamReader (System.in)); System.out.println("Bitte Länge eingeben"); mystr = myinput.readLine(); len=Integer.parseInt(mystr); v = new int [len]; v[len-1]=13; len=len+15; System.out.println(v[len-1]+" "); } Das Feld v hat die Länge 10. v[9] bekommt den Wert 13 zugewiesen. Das ist korrekt. Angenommen, der Anwender gibt über Tastatur die Zahl 10 ein. Wo gibt es dann Probleme? len hat an dieser Stelle den Wert 25. Das ist auch noch korrekt. An dieser Stelle wird auf das 24. Element des Feldes zugegriffen (also auf nicht reservierten Speicher). Das ist nicht korrekt, weil das Feld nur die Länge 10 hat.

23 Deklaration und Speicher anlegen in einer Anweisung

24 import java.io.*; public class MainArray4{ public static void main(String argv[]) throws IOException{ int[] v; v = new int [7]; } Statt der Deklaration und dem Anlegen von Speicher, kann man dies in einer Anweisung gemeinsam machen...

25 import java.io.*; public class MainArray4{ public static void main(String argv[]) throws IOException{ }

26 import java.io.*; public class MainArray4{ public static void main(String argv[]) throws IOException{ int[] v = new int[7]; }... eine Anweisung

27 Deklaration, Speicher anlegen und initialisieren in einer Anweisung

28 import java.io.*; public class MainArray4{ public static void main(String argv[]) throws IOException{ int[] v = {10, 20, 30}; } Da hier 3 Elemente angegeben werden, hat das Feld die Länge 3

29 import java.io.*; public class MainArray4{ public static void main(String argv[]) throws IOException{ int[] v; v = new int [7]; } WICHTIG v ist eine lokale Variable. Deshalb hat v an dieser Stelle einen undefinierten, dem Programmierer unbekannten Wert. Erst in der nächsten Anweisung bekommt v einen Wert (Referenzwert = Adresse) zugewiesen

30 Was veranlasst also der folgende Programmausschnitt im Arbeitsspeicher?

31 v AdresseWert... 0120... public static void main(...){ int[] v; v=new int[2]; } ? Was veranlasst diese Deklaration im Arbeitsspeicher ? Es wird im Arbeitsspeicher an einer bestimmten Adresse Platz für den Zeiger (Referenz, Verweis, Pointer) mit Namen v 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 v 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.

32 v AdresseWert... 0120... public static void main(...){ int[] v; v=new int[2]; } Was veranlasst diese Anweisung im Arbeitsspeicher ? Es wird im Arbeitsspeicher an einer bestimmten Adresse Platz für das Objekt erzeugt, auf das v zeigen soll. AdresseWert... 0470 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. Wie viel Byte Speicher werden reserviert? (Antwort nächste Folie)

33 v AdresseWert... 0120... public static void main(...){ int[] v; v=new int[2]; } AdresseWert... 0471 0472 0473 0474 0475 0476 0477... 0470 ? Welchen Wert muss v bekommen, damit es auf das gerade angelegte Objekt zeigt? Das Feld besteht aus 2 integer-Werten. Für jeden werden 4 Byte reserviert. Standardmäßig wird ein für einen integer-Wert erzeugter Speicher mit 0 vorbelegt. 0 0

34 v AdresseWert... 0120... public static void main(...){ int[] v; v=new int[2]; } AdresseWert... 0471 0472 0473 0474 0475 0476 0477... 0470 0 0

35 v AdresseWert... 0120... public static void main(...){ int[] v; v=new int[2]; } AdresseWert... 0471 0472 0473 0474 0475 0476 0477... 0470 0 0

36 Merke Wenn ein Feld erzeugt wird (Speicher reserviert), werden alle Elemente dieses Feldes automatisch mit den Standartwerten belegt, d.h:

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

38 Bemerkung: Dass für einen integer-Wert 4 Byte reserviert werden, steht nicht in der JLS (dort steht nur der Wertebereich für integer). Wir nehmen hier an, dass 4 Byte für einen integer-Wert verwendet werden.

39 Aufgabe Drei über Tastatur eingegebene Zahlen sollen in umgekehrter Reihenfolge der Eingabe wieder auf dem Bildschirm ausgegeben werden. EVA beachten !!

40 import java.io.*; public class MainArray5{ public static void main(String argv[]) throws IOException{ int i=0; int zahl; int[] v; String mystr; v = new int[3]; BufferedReader myinput = new BufferedReader (new InputStreamReader(System.in)); // Gleich geht es weiter

41 // Eingabe der Zahlen while(i<3){ System.out.println("Bitte Zahl eingeben"); mystr = myinput.readLine(); zahl=Integer.parseInt(mystr); v[i]=zahl; i=i+1; } // Ausgabe der Zahlen i=2; while (i>=0){ System.out.print(v[i]+" "); i=i-1; }

42 Aufgabe Verändern Sie das letzte Programm so, daß 10 über Tastatur eingegebene Zahlen in umgekehrter Reihenfolge der Eingabe wieder auf dem Bildschirm ausgegeben werden. EVA beachten !!

43 import java.io.*; public class MainArray5{ public static void main(String argv[]) throws IOException{ int i=0; int zahl; int[] v; String mystr; v = new int[3]; BufferedReader myinput = new BufferedReader (new InputStreamReader(System.in)); // Gleich geht es weiter hier muß eine Änderung gemacht werden

44 // Eingabe der Zahlen while(i<3){ System.out.println("Bitte Zahl eingeben"); mystr = myinput.readLine(); zahl=Integer.parseInt(mystr); v[i]=zahl; i=i+1; } // Ausgabe der Zahlen i=2; while (i>=0){ System.out.print(v[i]+" "); i=i-1; } hier muß eine Änderung gemacht werden Welchen Nachteil haben diese vielen Änderungen für den Programmierer ? Der Programmierer kann eine zu tätigende Änderung einfach übersehen.

45 Deswegen ist es besser mit sogenannten Konstanten zu arbeiten. (Die Feldlänge muß eine Konstante sein !)

46 ... final int len=3;... Eine Konstante erzeugt man in Java wie folgt:

47 ... final int len=3;... Eine Konstante erzeugt man in Java wie folgt: Falls die Konstante innerhalb einer Methode deklariert wird (oder als formaler Parameter) nennt man dies eine lokale Konstante. Objektkonstanten bzw. Klassenkonstanten --> siehe später.

48 ... final int len=3;... Eine Konstante erzeugt man in Java wie folgt: Während man Objektkonstanten bzw. Klassenkonstanten durchgehend groß schreibt, gibt es zur Schreibweise von lokalen Konstanten keine Empfehlung.

49 Eine Konstante kann man als eine schreibgeschützte Variable auffassen. (Deswegen ist sie im eigentlichen Sinne des Worts keine Variable mehr).

50 Aufgabe: Benutzen Sie beim letzten Programm statt der Feldlänge 10 eine Konstante.

51 import java.io.*; public class MainArray5{ public static void main(String argv[]) throws IOException{ final int len=10; int i=0; int zahl; int[] v; String mystr; v = new int[len]; BufferedReader myinput = new BufferedReader (new InputStreamReader(System.in)); // Gleich geht es weiter falls die Feldlänge z.B. auf 100 verändert werden soll, muß der Programmierer nur noch die 10 durch die 100 ersetzen (eine einzige Änderung machen).

52 // Eingabe der Zahlen while(i=0){ System.out.print(v[i]+" "); i=i-1; }

53 Aufgabe: Verändern Sie das Java- Programm so, dass der Anwender die Anzahl der einzugebenden Zahlen festlegen kann.

54 import java.io.*; public class MainArray6{ public static void main(String argv[]) throws IOException{ int len; int i=0; int zahl; int[] v; String mystr; BufferedReader myinput = new BufferedReader(new InputStreamReader(System.in)); System.out.println("Feldlänge eingeben"); mystr = myinput.readLine(); len=Integer.parseInt(mystr); v = new int[len]; In len steht der über Tastatur eingegebene Wert Es wird Speicher für len integer- Werte angelegt (reserviert)

55 // Genau das Gleiche wie vorher: while(i=0){ System.out.print(v[i]+" "); i=i-1; }

56 import java.io.*; public class MainArray6{ public static void main(String argv[]) throws IOException{ int len; int i=0; int zahl; int[] v; String mystr; BufferedReader myinput = new BufferedReader(new InputStreamReader(System.in)); System.out.println("Feldlänge eingeben"); mystr = myinput.readLine(); len=Integer.parseInt(mystr); v = new int[len]; Wie kann man wieder mit einer Konstanten arbeiten?

57 import java.io.*; public class MainArray6{ public static void main(String argv[]) throws IOException{ // int len; int i=0; int zahl; int[] v; String mystr; BufferedReader myinput = new BufferedReader(new InputStreamReader(System.in)); System.out.println("Feldlänge eingeben"); mystr = myinput.readLine(); final int len = Integer.parseInt(mystr); v = new int[len]; len wird an dieser Stelle deklariert und initialisiert. Wenn man len schon hier oben als Konstante deklarieren würde, könnte man unten den Wert nicht mehr auf den Wert von Integer.parseInt(mystr) setzen.

58 Merke Mit dem zu jedem Array automatisch zugehörigem public Attribut length kann man die Länge eines Array bestimmen.

59 Aufgabe: Lösen Sie die letzte Aufgabe mit Verwendung des Attributs length. Was muss im letzten Programm nur verändert werden?

60 // Genau das Gleiche wie vorher: import java.io.*; public class MainArray6{ public static void main(String argv[]) throws IOException{ int len; int i=0; int zahl; int[] v; String mystr; BufferedReader myinput = new BufferedReader(new InputStreamReader(System.in)); System.out.println("Feldlänge eingeben"); mystr = myinput.readLine(); len=Integer.parseInt(mystr); v = new int[len];

61 // Hier ändern sich 2 Zeilen while(i=0){ System.out.print(v[i]+" "); i=i-1; }

62 Aufgabe: Bestimmen Sie das Maximum und das Minimum der in der vorigen Aufgabe eingegebenen Zahlen. EVA beachten !!

63 // Programm von vorher import java.io.*; public class MainArray6{ public static void main(String argv[]) throws IOException{ int min, max; int len; int i=0; int zahl; int[] v; String mystr; BufferedReader myinput = new BufferedReader(new InputStreamReader(System.in)); System.out.println("Feldlänge eingeben"); mystr = myinput.readLine(); len=Integer.parseInt(mystr); v = new int[len]; Das ist neu (zu vorher)

64 // Immer noch das Gleiche wie vorher: while(i { "@context": "http://schema.org", "@type": "ImageObject", "contentUrl": "http://images.slideplayer.org/647704/1/slides/slide_63.jpg", "name": "// Immer noch das Gleiche wie vorher: while(i

65 i = 0; max = v[0]; min = v[0]; do{ if(v[i]>max) max = v[i]; if(v[i] { "@context": "http://schema.org", "@type": "ImageObject", "contentUrl": "http://images.slideplayer.org/647704/1/slides/slide_64.jpg", "name": "i = 0; max = v[0]; min = v[0]; do{ if(v[i]>max) max = v[i]; if(v[i]max) max = v[i]; if(v[i]

66 Arrays, deren Komponenten,(Elemente, Zellen) aus Objekten (und nicht aus primitiven Datentypen) bestehen.

67 Wir benutzen wieder die schon bekannte Klasse Hund. Herr H. kauft den Hund "Goldi" mit 10 Kg und den Hund "Dicki" mit 20 Kg Gewicht und speichert diese in seiner Variable hunde ab. Wie muss hunde deklariert werden. Erstellen Sie das zugehörige Programm in Java.

68 import java.io.*; public class MainArray8{ public static void main(String argv[]) throws IOException{ final int len=2; Hund[] hunde; hunde=new Hund[len]; hunde[0]=new Hund("Goldi", 10); hunde[1]=new Hund("Dicki", 20); System.out.println(hunde[0].getName()+" "+ hunde[0].getGewicht()); System.out.println(hunde[1].getName()+" "+ hunde[1].getGewicht()); } // Klasse Hund wie früher, kommt gleich...

69 class Hund{ private String name; private int gewicht; public Hund(String pName, int pGewicht){ name=pName; gewicht=pGewicht; } public void setName(String pName){ name = pName; } public String getName(){ return(name); } public void setGewicht(int pGewicht){ gewicht = pGewicht; } public int getGewicht(){ return(gewicht); }

70 Was veranlasst also der folgende Programmausschnitt im Arbeitsspeicher?

71 hunde AdresseWert... 0120... public static void main(...){ final int len=2; Hund[] hunde; hunde=new Hund[len]; hunde[0]=new Hund("Goldi",10); hunde[1]=new Hund("Dicki",20); } ? Was veranlasst diese Deklaration im Arbeitsspeicher ? Es wird im Arbeitsspeicher an einer bestimmten Adresse Platz für den Zeiger (Referenz, Verweis, Pointer) mit Namen hunde 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 hunde 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.

72 AdresseWert... 0120... Was veranlasst diese Anweisung im Arbeitsspeicher ? Es wird im Arbeitsspeicher an einer bestimmten Adresse Platz für das Objekt erzeugt, auf das hunde zeigen soll. AdresseWert... 0470 ? public static void main(...){ final int len=2; Hund[] hunde; hunde=new Hund[len]; hunde[0]=new Hund("Goldi",10); hunde[1]=new Hund("Dicki",20); } Aus Platzgründen wird hier und im Folgendender Arbeitsspeicher auf mehrere Tabellen verteilt, obwohl eigentlich der ganze Speicher durch eine Tabelle dargestellt wird! hunde Wie viel Byte Speicher werden reserviert? (Antwort nächste Folie) Auf die (Anfangs)Adresse dieses Speicherbereichs hat der Programmierer keinen Einfluß. Diese legt der Interpreter bzw. Programmlader fest.

73 AdresseWert... 0120... AdresseWert... 0473 0474... 0477 0470 ? public static void main(...){ final int len=2; Hund[] hunde; hunde=new Hund[len]; hunde[0]=new Hund("Goldi",10); hunde[1]=new Hund("Dicki",20); } Welchen Wert muss hunde bekommen, damit es auf das gerade angelegte Objekt zeigt? hunde null Wie viel Byte Speicher benötigt null jeweils ? Das Feld besteht aus 2 Objekten (Hunden). Da aber für ein Objekt ein Zeiger (Adresse) verwendet wird und wir hier annehmen, dass ein Zeiger 4 Byte Speicher benötigt, werden 8 Byte Speicher reserviert. Standardmäßig wird ein Zeiger mit null vorbelegt. Dies steht nicht in der JKS. Wir nehmen hier an: 4 Bytes

74 AdresseWert... 0120... hunde public static void main(...){ final int len=2; Hund[] hunde; hunde=new Hund[len]; hunde[0]=new Hund("Goldi",10); hunde[1]=new Hund("Dicki",20); } AdresseWert... 0473 0474... 0477 0470 null

75 AdresseWert... 0120... hunde 0470 public static void main(...){ final int len=2; Hund[] hunde; hunde=new Hund[len]; hunde[0]=new Hund("Goldi",10); hunde[1]=new Hund("Dicki",20); } AdresseWert... 0473 0474... 0477 0470 null

76 AdresseWert... 0120... hunde 0470 public static void main(...){ final int len=2; Hund[] hunde; hunde=new Hund[len]; hunde[0]=new Hund("Goldi",10); hunde[1]=new Hund("Dicki",20); } AdresseWert... 0473 0474... 0477 0470 null Was veranlasst diese Anweisung im Arbeitsspeicher ?

77 AdresseWert... 0120... 0470 public static void main(...){ final int len=2; Hund[] hunde; hunde=new Hund[len]; hunde[0]=new Hund("Goldi",10); hunde[1]=new Hund("Dicki",20); } AdresseWert... 0473 0474... 0477 0470 null AdresseWert... 0600 Adr. Goldi 10 Das Objekt (string) "Goldi" wird angelegt und die Adresse davon gespeichert. Was steht dort an dieser Stelle im Arbeitsspeicher? hunde[0] Welchen Wert muss hunde[0] bekommen, damit es auf das gerade angelegte Objekt zeigt? Der int-Wert 10 benötigt eine bestimmte Menge Bytes. Wir nehmen an: 4 Byte 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 das Objekt erzeugt, auf das hunde[0] zeigen soll.

78 AdresseWert... 0120... 0470 public static void main(...){ final int len=2; Hund[] hunde; hunde=new Hund[len]; hunde[0]=new Hund("Goldi",10); hunde[1]=new Hund("Dicki",20); } AdresseWert... 0473 0474... 0477 0470 null AdresseWert... 0600 Adr. Goldi 10 hunde[0]

79 AdresseWert... 0120... 0470 public static void main(...){ final int len=2; Hund[] hunde; hunde=new Hund[len]; hunde[0]=new Hund("Goldi",10); hunde[1]=new Hund("Dicki",20); } AdresseWert... 0473 0474... 0477 0470 0600 null AdresseWert... 0600 Adr. Goldi 10 hunde[0]

80 AdresseWert... 0120... 0470 public static void main(...){ final int len=2; Hund[] hunde; hunde=new Hund[len]; hunde[0]=new Hund("Goldi",10); hunde[1]=new Hund("Dicki",20); } AdresseWert... 0473 0474... 0477 0470 0600 null AdresseWert... 0600 Adr. Goldi 10 Was veranlasst diese Anweisung im Arbeitsspeicher ?

81 AdresseWert... 0120... 0470 public static void main(...){ final int len=2; Hund[] hunde; hunde=new Hund[len]; hunde[0]=new Hund("Goldi",10); hunde[1]=new Hund("Dicki",20); } AdresseWert... 0473 0474... 0477 0470 null AdresseWert... 0600 Adr. Goldi 10 Das Objekt (string) "Dicki" wird angelegt und die Adresse davon gespeichert. Was steht dort an dieser Stelle im Arbeitsspeicher? Auf die (Anfangs)Adresse dieses Speicherbereichs hat der Programmierer keinen Einfluß. Diese legt der Interpreter bzw. Programmlader fest. hunde[1] Adr. Dicki 20 0700 0600 Der int-Wert 20 benötigt eine bestimmte Menge Bytes. Wir nehmen an: 4 Byte Es wird im Arbeitsspeicher an einer bestimmten Adresse Platz für das Objekt erzeugt, auf das hunde[1] zeigen soll. Welchen Wert muss hunde[1] bekommen, damit es auf das gerade angelegte Objekt zeigt?

82 AdresseWert... 0120... 0470 public static void main(...){ final int len=2; Hund[] hunde; hunde=new Hund[len]; hunde[0]=new Hund("Goldi",10); hunde[1]=new Hund("Dicki",20); } AdresseWert... 0473 0474... 0477 0470 null AdresseWert... 0600 Adr. Goldi 10 hunde[1] Adr. Dicki 20 0700 0600 Welchen Wert muss hunde[1] bekommen, damit es auf das gerade angelegte Objekt zeigt?

83 AdresseWert... 0120... 0470 public static void main(...){ final int len=2; Hund[] hunde; hunde=new Hund[len]; hunde[0]=new Hund("Goldi",10); hunde[1]=new Hund("Dicki",20); } AdresseWert... 0473 0474... 0477 0470 AdresseWert... 0600 Adr. Goldi 10 Adr. Dicki 20 0700 hunde[1] 0600

84 AdresseWert... 0120... 0470 public static void main(...){ final int len=2; Hund[] hunde; hunde=new Hund[len]; hunde[0]=new Hund("Goldi",10); hunde[1]=new Hund("Dicki",20); } AdresseWert... 0473 0474... 0477 0470 0700 AdresseWert... 0600 Adr. Goldi 10 Adr. Dicki 20 0700 hunde[1] 0600

85 Die Objekte (die strings) "Goldi" und "Dicki" auch noch im Arbeitsspeicher dargestellt ergibt dann:

86 AdresseWert... 0120... 0470 AdresseWert... 0473 0474... 0477 0470 0600 0700 AdresseWert... 0600 Adr. Goldi 10 Adr. Dicki 20 0700... Goldi Dicki 0800 0900 Für die Zeichenkette "Dicki" wurde z.B. hier Speicher reserviert. Für die Zeichenkette "Goldi" wurde z.B. hier Speicher reserviert. Welche Werte müssen dann an diesen Stellen stehen?

87 AdresseWert... 0120... 0470 AdresseWert... 0473 0474... 0477 0470 0600 0700 AdresseWert... 0600 10 20 0700... Goldi Dicki 0800 0900

88 AdresseWert... 0120... 0470 AdresseWert... 0473 0474... 0477 0470 0600 0700 AdresseWert... 0600 10 20 0700... Goldi Dicki 0800 0900 0800 0900 Welche Variablen bezeichnen die folgenden Speicherbereiche (durch Anfangsadresse gegeben)?

89 AdresseWert... 0120... 0470 AdresseWert... 0473 0474... 0477 0470 0600 0700 AdresseWert... 0600 10 20 0700... Goldi Dicki 0800 0900 0800 0900 hunde hunde[0] hunde[1]

90 Eine weitere interessante Bemerkung Die Müllabfuhr hilft !! Ein Beispiel...

91 Herr A. hat im Supermarkt einen Romadur- Käse gekauft und ihn auf die Rückbank gelegt. Durch gewagte Bremsmanöver ist dieser unter den Vordersitz gerutscht. Auf der Heimfahrt hat er eine Tramperin mit genommen. Die interessante Unterhaltung über Mathematik hat ihn so gefesselt und verwirrt, daß er seinen Einkauf vergaß und an der nächsten Tanke nochmals einen Romadur- Käse mitgenommen hat. Durch den in den nächsten Wochen beginnenden Zersetzungsprozeß hätte sich das Auto in ein

92 Biotop verwandelt, wenn es nicht die helfenden Hände seiner Mutter gegeben hätte, die das Auto regelmäßig reinigt. Die Mutter hat also die Funktion einer Müllabfuhr, die vergessene und deswegen nicht mehr ansprechbare Speicherleichen automatisch beseitigt. In Java macht dies der sogenannte Garbage Collector, der die Müllabfuhr für nicht mehr benötigten Speicherplatz ist.

93 Ein Beispiel

94 public static void main( String[] args){ int[] v; v = new int[2]; v[0]= 10; v[1]= 11; v = new int[2]; v[0]= 100; v[1]= 101; } Die Anweisungen seien bis zu dieser Anweisung alle ausgeführt. Was wurde dadurch im Arbeitsspeicher veranlaßt?

95 v AdresseWert... 0120... AdresseWert... 0470 0471 0472 0473 0474 0475 0476 0477... 10 11 0470 public static void main(...){ int[] v; v = new int[2]; v[0]= 10; v[1]= 11; v = new int[2]; v[0]= 100; v[1]= 101; } v wird mit dem Speicher verlinkt und die Elemente des Feldes mit 10 bzw. 11 belegt.

96 v AdresseWert... 0120... AdresseWert... 0470 0471 0472 0473 0474 0475 0476 0477... 10 11 0470 public static void main(...){ int[] v; v = new int[2]; v[0]= 10; v[1]= 11; v = new int[2]; v[0]= 100; v[1]= 101; } Die Anweisungen seien bis zu dieser Anweisung alle ausgeführt. Was wurde dadurch im Arbeitsspeicher veranlaßt?

97 v AdresseWert... 0120 AdresseWert... 0470 0471 0472 0473 0474 0475 0476 0477... 10 11 0470 public static...{ int[] v; v = new int[2]; v[0]= 10; v[1]= 11; v = new int[2]; v[0]= 100; v[1]= 101; } AdresseWert... 0200 0201 0202 0203 0204 0205 0206 0207... 0 0 Es wird Speicher für die 2 Elemente reserviert und diese mit 0 belegt....

98 v AdresseWert... 0120 AdresseWert... 0470 0471 0472 0473 0474 0475 0476 0477... 10 11 0470 public static...{ int[] v; v = new int[2]; v[0]= 10; v[1]= 11; v = new int[2]; v[0]= 100; v[1]= 101; } AdresseWert... 0200 0201 0202 0203 0204 0205 0206 0207... 0 0 Dann wird dieser Speicher mit v verlinkt....

99 v AdresseWert... 0120 AdresseWert... 0470 0471 0472 0473 0474 0475 0476 0477... 10 11 public static...{ int[] v; v = new int[2]; v[0]= 10; v[1]= 11; v = new int[2]; v[0]= 100; v[1]= 101; } AdresseWert... 0200 0201 0202 0203 0204 0205 0206 0207... 0 0

100 v AdresseWert... 0120 AdresseWert... 0470 0471 0472 0473 0474 0475 0476 0477... 10 11 public static...{ int[] v; v = new int[2]; v[0]= 10; v[1]= 11; v = new int[2]; v[0]= 100; v[1]= 101; } AdresseWert... 0200 0201 0202 0203 0204 0205 0206 0207... 0 0 0200

101 v AdresseWert... 0120 AdresseWert... 0470 0471 0472 0473 0474 0475 0476 0477... 10 11 public static...{ int[] v; v = new int[2]; v[0]= 10; v[1]= 11; v = new int[2]; v[0]= 100; v[1]= 101; } AdresseWert... 0200 0201 0202 0203 0204 0205 0206 0207... 100 101... Und die Elemente des Feldes mit 100 bzw. 101 belegt.... 0200

102 v AdresseWert... 0120 AdresseWert... 0470 0471 0472 0473 0474 0475 0476 0477... 10 11 public static...{ int[] v; v = new int[2]; v[0]= 10; v[1]= 11; v = new int[2]; v[0]= 100; v[1]= 101; } AdresseWert... 0200 0201 0202 0203 0204 0205 0206 0207... 100 101 Wie kann man jetzt noch auf den Speicher mit Adressbeginn 0470 und die Elemente 10 und 11 zugreifen? Mit v[0] oder v[1] ???... 0200

103 v AdresseWert... 0120 AdresseWert... 0470 0471 0472 0473 0474 0475 0476 0477... 10 11 public static...{ int[] v; v = new int[2]; v[0]= 10; v[1]= 11; v = new int[2]; v[0]= 100; v[1]= 101; } AdresseWert... 0200 0201 0202 0203 0204 0205 0206 0207... 100 101 Nein! Mit v[0] oder v[1] greift man auf den Speicher mit Adressbeginn 0200 zu ! Auf den Speicher mit Adressbeginn 0470 kann nicht mehr zugegriffen werden. Er ist eine Speicherleiche. Er muß nicht vom Programmierer entfernt werden, sondern er wird von der Java-Müllabfuhr (Garbage Collector) entsorgt. Würde er nicht entsorgt werden, könnte immer mehr unbenutzter Speicher dazu führen, dass z.B. kein Platz mehr für Variablen da ist.... 0200


Herunterladen ppt "ARRAY oder FELD oder VEKTOR. Aufgabe : Drei über Tastatur eingegebene ganzzahlige Zahlen sollen in umgekehrter Reihenfolge der Eingabe wieder auf dem."

Ähnliche Präsentationen


Google-Anzeigen