3.8 Objekttypen und Arrays -...

25
Praktische Informatik I 3. Die Programmiersprache Java 3.8 - 1 © Wolfgang Effelsberg 3.8 Objekttypen und Arrays Wir werden uns in diesem Kapitel näher mit den Objekttypen in Java beschäftigen.

Transcript of 3.8 Objekttypen und Arrays -...

Page 1: 3.8 Objekttypen und Arrays - uni-mannheim.depi4.informatik.uni-mannheim.de/pi4.data/content/courses/2008-hws/… · Arrays kopieren Arrays sind Objekte: • Array-Variablen speichern

Praktische Informatik I 3. Die Programmiersprache Java 3.8 - 1© Wolfgang Effelsberg

3.8 Objekttypen und Arrays

Wir werden uns in diesem Kapitel näher mit den Objekttypen in Java beschäftigen.

Page 2: 3.8 Objekttypen und Arrays - uni-mannheim.depi4.informatik.uni-mannheim.de/pi4.data/content/courses/2008-hws/… · Arrays kopieren Arrays sind Objekte: • Array-Variablen speichern

Praktische Informatik I 3. Die Programmiersprache Java 3.8 - 2© Wolfgang Effelsberg

Primitive Datentypen und Objekt-Datentypen

Primitive Datentypen benötigen einen vorher genau bekannten Speicherplatz. Beispiele:

• int : 4 Byte, double: 8 Byte, char: 2 Byte

Objekte können unvorhersehbar viel Speicherplatz verbrauchen:

• String: ?

• hängt von der Länge des Textes ab.

• KontenListe: ?

• Hängt davon ab, wie gut das Geschäft geht.

42

betrag

diplomArbeit

cdab 42Efgh

Und noch

Übrigens...?

Page 3: 3.8 Objekttypen und Arrays - uni-mannheim.depi4.informatik.uni-mannheim.de/pi4.data/content/courses/2008-hws/… · Arrays kopieren Arrays sind Objekte: • Array-Variablen speichern

Praktische Informatik I 3. Die Programmiersprache Java 3.8 - 3© Wolfgang Effelsberg

Objekte sind Referenztypen

In einer Objektvariablen wird nur ein Verweis (Referenz, Zeiger, engl. reference, pointer, link) auf das wirkliche Objekt gespeichert.

• String diplomArbeit;

Die Java Maschine kümmert sich um den Platz für die Daten des Objekts.

• Dazu gehört

• Besorgung von zusätzlichem Platz bei Bedarf

• Freigabe von nicht mehr benötigtem Platz

§ Diese heißt garbage collection.

Der Programmierer hat stets einen Verweis auf das Objekt zur Verfügung.

diplomArbeit

Page 4: 3.8 Objekttypen und Arrays - uni-mannheim.depi4.informatik.uni-mannheim.de/pi4.data/content/courses/2008-hws/… · Arrays kopieren Arrays sind Objekte: • Array-Variablen speichern

Praktische Informatik I 3. Die Programmiersprache Java 3.8 - 4© Wolfgang Effelsberg

Beim Zugriff auf Objektvariablen folgt Java automatisch dem Verweis.

Bei manchen anderen Sprachen (z. B. Pascal oder C) muss der Programmierer dies tun. In Pascal zum Beispiel: meinKonto^.kontoStand

Zugriff über Referenzen

billKonto

inhaber : „H.P.G“kontoStand : 1000

nummer : 621 736 172

inhaber : „Bill Gates“kontoStand : 500 000 000

nummer : 567 890 909

meinKonto

In Java:meinKonto.kontoStand = billKonto.kontoStand+1 ;

Page 5: 3.8 Objekttypen und Arrays - uni-mannheim.depi4.informatik.uni-mannheim.de/pi4.data/content/courses/2008-hws/… · Arrays kopieren Arrays sind Objekte: • Array-Variablen speichern

Praktische Informatik I 3. Die Programmiersprache Java 3.8 - 5© Wolfgang Effelsberg

Zuweisung von Objekten

Bei Zuweisungen ganzer Objekte werden nur die Referenzen übernommen!

billKonto

inhaber : „H.P.G“kontoStand : 1000

nummer : 621 736 172

inhaber : „Bill Gates“kontoStand : 500 000 000

nummer : 567 890 909meinKonto

billKontomeinKonto

Vorher:

Nachher: anderes Beispiel:

• meinKonto = billKonto;

Page 6: 3.8 Objekttypen und Arrays - uni-mannheim.depi4.informatik.uni-mannheim.de/pi4.data/content/courses/2008-hws/… · Arrays kopieren Arrays sind Objekte: • Array-Variablen speichern

Praktische Informatik I 3. Die Programmiersprache Java 3.8 - 6© Wolfgang Effelsberg

Datenmüll

Nach der Zuweisung kann ein Objekt unerreichbar geworden sein:

• Kein Verweis zeigt mehr darauf.

• Es ist Müll (engl.: garbage). inhaber : „H.P.G“kontoStand : 1000

nummer : 621 736 172

inhaber : „Bill Gates“kontoStand : 500 000 000

nummer : 567 890 909

billKontomeinKonto

Nachher:

Java sorgt automatisch für das Recycling des Datenmülls: garbage collection.

Page 7: 3.8 Objekttypen und Arrays - uni-mannheim.depi4.informatik.uni-mannheim.de/pi4.data/content/courses/2008-hws/… · Arrays kopieren Arrays sind Objekte: • Array-Variablen speichern

Praktische Informatik I 3. Die Programmiersprache Java 3.8 - 7© Wolfgang Effelsberg

Beeinflussung durch zwei Referenzen

Wenn zwei Referenzen auf dasselbe Objekt zeigen:

• Jedes kann die Felder des anderen beeinflussen.

• Ein Name ist dann ein so genannter Alias für den anderen.

inhaber : „Bill Gates“kontoStand : 500 000 000

nummer : 567 890 909

billKontomeinKonto

billKonto.kontoStand = 500000000;

meinKonto.abheben(600000000) ;

billKonto.getKontoStand() - 100 000 000

Page 8: 3.8 Objekttypen und Arrays - uni-mannheim.depi4.informatik.uni-mannheim.de/pi4.data/content/courses/2008-hws/… · Arrays kopieren Arrays sind Objekte: • Array-Variablen speichern

Praktische Informatik I 3. Die Programmiersprache Java 3.8 - 8© Wolfgang Effelsberg

Gleichheit von Objekten (1)

Vergleich zweier Objekte mit == bzw. != prüft nur die Verweise!

• Es ist möglich, dass alle Felder der Objekte übereinstimmen, der Vergleich liefert trotzdem false.

Für den inhaltlichen Vergleich ist die Methode equals vorgesehen.

equals mit der Signatur public boolean equals(Object z) wird von Object geerbt und ist daher für alle Objekte vorhanden. Es sollte allerdings für die eigene Klasse geeignet redefiniert werden, z. B.:

public boolean equals(Object z){

Konto k = (Konto) z; // Mache Object zu Konto

return nummer == k.nummer

&& kontoStand == k.kontoStand

&& inhaber.equals(k.inhaber ); }

• meinKonto.equals(billKonto)

Page 9: 3.8 Objekttypen und Arrays - uni-mannheim.depi4.informatik.uni-mannheim.de/pi4.data/content/courses/2008-hws/… · Arrays kopieren Arrays sind Objekte: • Array-Variablen speichern

Praktische Informatik I 3. Die Programmiersprache Java 3.8 - 9© Wolfgang Effelsberg

Gleichheit von Objekten (2)

meinKonto == billKonto falsemeinKonto.equals(billKonto) true

billKonto

inhaber : „Otto“kontoStand : 1000

nummer : 621 736 172

inhaber : „Otto“kontoStand : 1000

nummer : 621 736 172meinKonto

Page 10: 3.8 Objekttypen und Arrays - uni-mannheim.depi4.informatik.uni-mannheim.de/pi4.data/content/courses/2008-hws/… · Arrays kopieren Arrays sind Objekte: • Array-Variablen speichern

Praktische Informatik I 3. Die Programmiersprache Java 3.8 - 10© Wolfgang Effelsberg

Wrapper-Klassen (1)

Die Basis-Datentypen von Java sind keine Klassen.

• boolean, char, short, byte, int, long, float, double

Sie sind keine Objekte im Sinne des OO-Programmierens.

• Vorteil:

• direkter Zugriff - ohne Referenz

• keine explizite Erzeugung (new) notwendig

• Nachteil

• Viele Behälter-Strukturen (ArrayLists) etc. können nur Objekte aufnehmen.

Ausweg

• Für jede Basisklasse gibt es eine entsprechende Wrapper-Klasse:

Boolean, Character, Short, Byte,

Integer, Long, Float, Double

Page 11: 3.8 Objekttypen und Arrays - uni-mannheim.depi4.informatik.uni-mannheim.de/pi4.data/content/courses/2008-hws/… · Arrays kopieren Arrays sind Objekte: • Array-Variablen speichern

Praktische Informatik I 3. Die Programmiersprache Java 3.8 - 11© Wolfgang Effelsberg

Wrapper-Klassen (2)

Wrapper-Klassen verpacken (engl.: to wrap) den Wert des Basistyps.

Eine final deklarierte Klasse kann keine Unterklasse haben.

Ein Objekt der Wrapper-Klasse hat genau ein Feld des entsprechenden Datentyps. Dieses ist unveränderlich final, also konstant

Hier können wir es auspacken.

Jede Wrapper-Klasse ist ähnlich aufgebaut.

Page 12: 3.8 Objekttypen und Arrays - uni-mannheim.depi4.informatik.uni-mannheim.de/pi4.data/content/courses/2008-hws/… · Arrays kopieren Arrays sind Objekte: • Array-Variablen speichern

Praktische Informatik I 3. Die Programmiersprache Java 3.8 - 12© Wolfgang Effelsberg

Autoboxing

Seit Java 1.5: Autoboxing: Automatische Umwandlung zwischen Basisklassen und Wrapperklassen.

Page 13: 3.8 Objekttypen und Arrays - uni-mannheim.depi4.informatik.uni-mannheim.de/pi4.data/content/courses/2008-hws/… · Arrays kopieren Arrays sind Objekte: • Array-Variablen speichern

Praktische Informatik I 3. Die Programmiersprache Java 3.8 - 13© Wolfgang Effelsberg

Arrays (1)

Arrays sind Objekte, die Folgen gleichartiger Variablen enthalten.

• Mathematisch: x0, x1, x2, … , xn

• Java: x[0], x[1], x[2], …, x[n]

Deklaration:

•int [] x; x ist eine Folge von ganzen Zahlen.

•char[] wort; wort ist Folge von Zeichen, also eine Zeichenkette.

•Konto[] konten; konten ist eine Folge von Konten.

34 11 178 42

Page 14: 3.8 Objekttypen und Arrays - uni-mannheim.depi4.informatik.uni-mannheim.de/pi4.data/content/courses/2008-hws/… · Arrays kopieren Arrays sind Objekte: • Array-Variablen speichern

Praktische Informatik I 3. Die Programmiersprache Java 3.8 - 14© Wolfgang Effelsberg

Deklaration mit Initialisierung

•int[] x = {-13, 27, 42, 128};

•char[] wort = {‘H‘,‘a‘,‘l‘,‘l‘,‘o‘,‘ ‘,‘W‘,‘e‘,‘l‘,‘t‘};

Erzeugung

•int[] x = new int[10]; Folge: x[0], x[1], … , x[9]

•Konto[] kunden = new Konto[200]; Eine Folge von 200 Konten,kunden[0], kunden[1], ..., kunden[199]

Arrays sind Folgen fester Länge.

Arrays (2)

Page 15: 3.8 Objekttypen und Arrays - uni-mannheim.depi4.informatik.uni-mannheim.de/pi4.data/content/courses/2008-hws/… · Arrays kopieren Arrays sind Objekte: • Array-Variablen speichern

Praktische Informatik I 3. Die Programmiersprache Java 3.8 - 15© Wolfgang Effelsberg

Arrays und for-Schleifen

Die Länge eines Array-Objekts steht in dem Feld length

int[] myArray = new int[x*x+1];

int laenge = myArray.length;

for-Schleifen eignen sich gut, um Arrays zu durchlaufen:

Wuerfel meinWuerfel = new Wuerfel();

for(int k=0; k<laenge; k++){

meinWuerfel.wuerfele();

myArray[k] = meinWuerfel.getAugenZahl();

}

Typische Suche in einem Array – mit vorzeitigem Verlassen:

int position = 0;

for (int k=0; k<laenge; k++)

if (meinArray[k] == 6) {

position = k; break;

}

// gefunden an Position k

schreiben

lesen

Page 16: 3.8 Objekttypen und Arrays - uni-mannheim.depi4.informatik.uni-mannheim.de/pi4.data/content/courses/2008-hws/… · Arrays kopieren Arrays sind Objekte: • Array-Variablen speichern

Praktische Informatik I 3. Die Programmiersprache Java 3.8 - 16© Wolfgang Effelsberg

Mehrdimensionale Arrays (1)

Matrizen sind mehrdimensionale Arrays. Man benutzt Matrizen zur Speicherung und Bearbeitung von

• Bildern

• Operationstabellen

• Wetterdaten

• Graphen

• Distanztabellen

• etc.

Page 17: 3.8 Objekttypen und Arrays - uni-mannheim.depi4.informatik.uni-mannheim.de/pi4.data/content/courses/2008-hws/… · Arrays kopieren Arrays sind Objekte: • Array-Variablen speichern

Praktische Informatik I 3. Die Programmiersprache Java 3.8 - 17© Wolfgang Effelsberg

Deklaration

•int [][] greyMonaLisa;

•Color[][][] rubik ;

Deklaration mit Erzeugung

•Color[][] bildschirm = new Color[1024][748];

Deklaration mit Initialisierung

•boolean[][] xorTabelle = {{false, true},{true,false}}

•int[][] entfernung = { { 0, 213, 419, 882}, {213, 0, 617, 720},

{419, 617, 0, 521},

{882, 720, 521, 0}};

Mehrdimensionale Arrays (2)

Page 18: 3.8 Objekttypen und Arrays - uni-mannheim.depi4.informatik.uni-mannheim.de/pi4.data/content/courses/2008-hws/… · Arrays kopieren Arrays sind Objekte: • Array-Variablen speichern

Praktische Informatik I 3. Die Programmiersprache Java 3.8 - 18© Wolfgang Effelsberg

Beispiel: Bildbearbeitung (1)

Graphik als Matrix von Grauwerten

•int[][] monaGrey = new int[4][4];

•monaGrey = { {21,98,205,23},{32,37,126,98},

{113,47,191,139},

{107,189,191,96} } ;

Aufhellen

•for (int x = 0; x < hoehe; x++)for(int y =0; y < breite; y++)

monaGrey[x][y] =

Math.min(monaGrey[x][y]*10/9,255); 21 98 205 23

32 37 126 98

113 47 191 139

107 189 191 96

0 1 2 3

01

23

y

x

Page 19: 3.8 Objekttypen und Arrays - uni-mannheim.depi4.informatik.uni-mannheim.de/pi4.data/content/courses/2008-hws/… · Arrays kopieren Arrays sind Objekte: • Array-Variablen speichern

Praktische Informatik I 3. Die Programmiersprache Java 3.8 - 19© Wolfgang Effelsberg

Negieren

• for (int x = 0; x < hoehe; x++)for(int y =0; y < breite; y++)

monaGrey[x][y] = 255-monaGrey[x][y] ;

Schwarz-Weiß

• for (int x = 0; x < hoehe; x++)for(int y =0; y < breite; y++)if(monaGrey[x][y] < 128) monaGrey[x][y] = 0;else monaGrey[x][y] = 255;

Beispiel: Bildbearbeitung (2)

Page 20: 3.8 Objekttypen und Arrays - uni-mannheim.depi4.informatik.uni-mannheim.de/pi4.data/content/courses/2008-hws/… · Arrays kopieren Arrays sind Objekte: • Array-Variablen speichern

Praktische Informatik I 3. Die Programmiersprache Java 3.8 - 20© Wolfgang Effelsberg

Mehrdimensionale Arrays braucht man nicht (1)

Mehrdimensionale Arrays sind einfach nur Arrays von Arrays!

• Ein zweidimensionales Array ist ein Array von Zeilen.• Ein dreidimensionales Array ist ein Array von zweidimensionalen Arrays.• usw.

Page 21: 3.8 Objekttypen und Arrays - uni-mannheim.depi4.informatik.uni-mannheim.de/pi4.data/content/courses/2008-hws/… · Arrays kopieren Arrays sind Objekte: • Array-Variablen speichern

Praktische Informatik I 3. Die Programmiersprache Java 3.8 - 21© Wolfgang Effelsberg

Mehrdimensionale Arrays braucht man nicht (2)

monaGrey

21 98 205 23

32 37 126 98

113 47 191 139

107 189 191 96

mona

monaGrey[1][0], ... , monaGrey[1][3]

mona [1]

mona [1][2]

Wir inspizieren monaGrey im BlueJ-Inspektor

Page 22: 3.8 Objekttypen und Arrays - uni-mannheim.depi4.informatik.uni-mannheim.de/pi4.data/content/courses/2008-hws/… · Arrays kopieren Arrays sind Objekte: • Array-Variablen speichern

Praktische Informatik I 3. Die Programmiersprache Java 3.8 - 22© Wolfgang Effelsberg

Arrays: Krumm und schief (1)

Die Dimension eines Arrays ist nicht Teil seines Typs. Folglich können verschieden große Arrays den gleichen Typ haben:

int [] alt = new int[3];

int [] neu = new int[17];

alt = neu ; // das ist in Java erlaubt!

Eine Matrix kann verschieden lange Zeilen haben!

•int[][] pascalDreieck = { {1} ,

{1 , 1} ,

{1 , 2 , 1} ,

{1 , 3 , 3 , 1} ,

{1 , 4 , 6 , 4 , 1} };

Page 23: 3.8 Objekttypen und Arrays - uni-mannheim.depi4.informatik.uni-mannheim.de/pi4.data/content/courses/2008-hws/… · Arrays kopieren Arrays sind Objekte: • Array-Variablen speichern

Praktische Informatik I 3. Die Programmiersprache Java 3.8 - 23© Wolfgang Effelsberg

Wie durchläuft man krumme Arrays ?

• Die innere for-Schleife muss die Länge der zu durchlaufenden Zeile selbst bestimmen. Das geht mittels des length-Feldes.

Durchlauf durch schiefArray

for(int zeile=0; zeile < schiefArray.length; zeile++)

for(int spalte=0; spalte < schiefArray[zeile].length;

spalte++)

tuWasSinnvollesMit(schiefArray[zeile][spalte]);

Arrays: Krumm und schief (2)

Page 24: 3.8 Objekttypen und Arrays - uni-mannheim.depi4.informatik.uni-mannheim.de/pi4.data/content/courses/2008-hws/… · Arrays kopieren Arrays sind Objekte: • Array-Variablen speichern

Praktische Informatik I 3. Die Programmiersprache Java 3.8 - 24© Wolfgang Effelsberg

Arrays kopieren

Arrays sind Objekte:

• Array-Variablen speichern Referenzen.

• Kopieren kopiert nur die Referenzen:

• shallow copy (flache Kopie)

• wie bei jedem Objekt

Deep Copy :

•System.arraycopy( … )

• kopiert nur in der ersten Dimension des Arrays!

• allgemein Methode clone()

• kopiert das komplette Objekt.

Page 25: 3.8 Objekttypen und Arrays - uni-mannheim.depi4.informatik.uni-mannheim.de/pi4.data/content/courses/2008-hws/… · Arrays kopieren Arrays sind Objekte: • Array-Variablen speichern

Praktische Informatik I 3. Die Programmiersprache Java 3.8 - 25© Wolfgang Effelsberg

Fazit

• Objekte werden als Referenztypen verwaltet.

• Der Operator “==“ vergleicht nur Referenzen, keine Objektinhalte!

• Wrapper-Klassen: primitive Typen werden wie Objekttypen verwendbar.

• Arrays sind Felder von Referenzen auf gleiche Typen.

• Sie haben jeweils eine feste Länge.

• Mehrdimensionale Arrays sind Arrays von Arrays.