| Axel Rogat |
| Objektorientiertes Programmieren mit C++ und JAVA |
|   |
21.9: Referenz-Typen
| Kapitel 21 |
22.1: Strings 
|
|   |
|   | 21.10 Arrays |   |
|   |
In JAVA werden Arrays als spezielle Objekte aufgefaßt. Es handelt sich um einen Container, in dem andere Objekte geordnet gespeichert werden können. Seine Länge liegt nach der Definition fest. Es gibt Container mit variabler Länge (dazu später). Vorsicht: Es gibt eine JAVA-Klasse Container, die eine völlig andere Bedeutung hat als die Bezeichnung Container in C++!
Da Arrays selbst Objekte sind, können alle Operationen auf sie angewandt
werden, die mit Objekten möglich sind. Beispielsweise werden sie
garbage-collected, man kann sie in Container einfügen, serialisieren, etc.
Der Typ "Array über dem Grundtyp T" ist in JAVA
ein echter neuer Typ T[]. Wenn das erste Mal ein Array
über T definiert wird, wird dieser Typ intern automatisch kreiert,
und auf das Array wird danach über Referenzen auf
T[] zugegriffen.
Man kann mit instanceof auch die Zugehörigkeit eines Arrays
zu einem solchen Array-Typen testen:
Die Definition einer Array-Referenz kann in zwei Formen erfolgen, eine
aus C++ (aus Gewohnheitsgründen) übernommen, eine weitere,
die den gesamten Array-Typnamen voranstellt:
Die Indizierung beginnt wie in C++ immer bei 0.
Bei Arrays über einfachen Typen haben die einzelnen Elemente nach
dem new-Aufruf den Wert 0 bzw. false. Eine
Initialisierung mit einer {}-Liste ist genau wie in
C++ möglich:
Die Definition und der Element-Zugriff erfolgt wie in C++
mit den
eckigen Klammern []. Diese werden aber nicht mehr als Operator
aufgefaßt und sind auch nicht mehr überladbar. Entsprechende eigene
Mechanismen müßte man dann mit Funktionsaufrufen wie read und
write realisieren. Die Klammern sind auch nicht mehr kommutativ,
so daß man nicht 3[array] für
array[3]
schreiben kann.
Wie bei allen Referenz-Typen ist hier noch kein (Array-)Objekt angelegt
worden, und deshalb wird hier die Länge des Arrays noch nicht
spezifiziert. Das geschieht erst beim new-Aufruf:
Vorsicht: Mit der Deklaration
wird array4 ein zweidimensionales Array äquivalent zu
int[][] array4;
Bei Arrays über Referenz-Typen sind alle Referenzen zunächst
uninitialisiert, d.h. null! Jedes einzelne
echte Element muß nach der Definition der Array-Referenz explizit mit dem
new-Operator angelegt werden. Danach kann man sich die
Referenz-Struktur vorstellen wie unten rechts dargestellt.
|
|
Es ist aber auch eine Listen-Schreibweise möglich wie folgt:
Auf diese Weise können auch anonyme Arrays angelegt werden, die nur an einer Stelle benötigt werden, zum Beispiel in einem Funktionsaufruf, und die gar keinen eigenen Namen zu bekommen brauchen:
Im Beispiel wird int length verwendet, die Anzahl der Elemente des Arrays. Dabei handelt es sich um den einzigen öffentlichen Daten-Member jedes Array-Typs.
Zugriffe mit negativen oder zu großen Indizes werfen eine Ausnahme mit dem Namen ArrayIndexOutOfBoundsException. Da das ein Untertyp von RuntimeException ist, braucht sie nicht abgefangen zu werden (dazu später).
Eine Zuweisung mit = kopiert wiederum nicht das Objekt (also hier das ganze Array), sondern nur die Referenz darauf:
Für das Kopieren eines ganzen Arrays gibt es eine spezielle Routine System.arraycopy (das Ziel-Array muß dafür aber schon angelegt sein):
Mehrdimensionale Arrays sind mit mehreren []-Paaren wie in C++ möglich. Es werden intern entsprechend viele Zwischentypen erzeugt:
Wenn man Dimensionen in der Definition wegläßt, können sie automatisch durch passende Strukturierung der Initialisierungsliste festgelegt werden:
Die Dimensionen der Unter-Arrays brauchen aber nicht einmal untereinander gleich zu sein. Beispielsweise erhält man wie folgt eine untere 4×4-Dreiecksmatrix, ohne daß dabei Speicher verschwendet wird:
|
|
Dadurch, daß in JAVA alle Klassen von der Klasse Object erben, immer Laufzeit-Typinformationen mitgeführt werden und alle Funktionen virtuell sind, kann man sogar Arrays mit gemischten Typen verwenden:
Das ist der Grund dafür, warum der Ausfall von Templates in JAVA nicht so schwerwiegt, wie es zunächst erscheinen mag. Auf ähnliche Weise sind die Standard-Container wie Vector, Stack, etc. implementiert.
|   |
21.9: Referenz-Typen
| Startseite |
22.1: Strings 
|
|   |