3. Zeichenketten und FelderString, [ ]Zeichenketten und Felder (engl. arrays) sind wichtige Datentypen, die in Java viele Eigenschaften einer Klasse haben. Variable dieses Typs haben sehr viel mit Objekten gemeinsam. Dadurch touchieren wir in diesem Abschnitt einige Aspekte des OOP. 3.1 Zeichenketten: Der Datentyp StringDurch
wird eine Variable namens
Die Punktnotation in der Will man Zahlen formatiert ausgeben, muss man die Zahlen als Zeichenketten "behandeln":
Mit
die Ausgabe "macht". Jetzt ahnt man, dass Zeichenketten Felder von Zeichen sein könnten, die bei 0 beginnend durchnummeriert (indiziert) sind - ein guter Übergang zum nächsten Abschnitt. Bemerkung: Es gibt eine Klasse StringBuffer,
die in jeder Beziehung den Charakter einer Klasse hat, weil Variable von diesem Typ reine
Referenzvariable sind, während bei Variablen vom Typ
3.2 Felderdouble[], int[], String[], new, ...Stellen Sie sich vor, Sie haben einen "Satz" von Zahlen vor sich, den Sie weiterverarbeiten wollen, z.B. 20 Temperaturwerte eines Patienten im Krankenhaus, gemessen an aufeinanderfolgenden Zeitpunkten. In Java würde man diese Daten zu einem double-Feld der Länge 20 zusammenfassen, indem man die Zahlen durchnummeriert, aber nicht etwa von 1 bis 20, sondern von 0 bis 19!! Die Nummerierung bei Feldern beginnt stets bei Null. Abstrakt kann man sagen, dass Felder Datentypen sind, deren Variable indizierte Variable eines bestimmten Datentyps sind. Wenn man die HörerInnen dieser LV durchnummeriert, so kann man ein Feld von Namen,
genauer ein Feld von Zeichenketten einführen. Nennen wir dieses Feld String[] hoererIn={ "Betty", "Frank", "Rafaela", "Torsten"}; System.out.println( "HoererIn Nr. 2 heisst "+hoererIn[1]); In Zeile 1 wird das Feld zugleich deklariert und alloziert. Das Feld hat die Länge 4,
seine Komponenten sind String[] hoererIn; hoererIn = new String[4]; hoererIn[0]="Betty"; ... Die erste Zeile ist die Deklaration, die zweite die Allokation des Feldes. Dies kann auch wie bei den Grunddatentypen simultan geschehen:
In der (Numerischen) Mathematik wimmelt es von Will man die Komponenten eines Vektors aufaddieren, kann dies mit folgender Methode geschehen: double summe(double[] x){ double s=0; int n=x.length; for (int i=0;i<n;i++) s+=x[i]; return s; }//Ende summe() Etwas komplizierter ist das folgende Beispiel: Eine kubische Funktion hat vier Koeffizienten, allgemein lautet ihre Abbildungsvorschrift f(x)=a0+a1*x+a2*x2+a3*x3. Es ist also naheliegend, die Koeffzienten durch ein Feld reeller Zahlen der Länge 4 innerhalb einer Methode zu erfassen: class Feld1{ static double kubischeF(double[] a, double x){//Methode double y=0; double p=1; for (int i=0;i<4;i++) { y+=a[i]*p;//p=xi p*=x; //p=x{i+1} }//Ende for return y; }//Ende kubischeF() public static void main(String[] args){ double[] a = {0.1, 2.3, -2, 4}; double x=0; while (x<2) { System.out.println(kubischeF(a,x)); x+=0.2; }//Ende while }//Ende main() }//Ende Feld1 Achten Sie auf die rekursive Berechnung der Potenz
Die Länge des Feldes Zweidimensionale Felder sind eindimensionale Felder,
deren Komponenten selbst wieder eindimensionale Felder sind (die nicht
die gleiche Länge haben müssen!). Man kann sich (zur besseren Vorstellung)
eine rechteckige Tabelle vorstellen, bei denen man sich die Zeilen
indiziert vorstellt: double[][] a={{0.8, -0.7, 0.1, 2.1}, {9,0, -1, 2.2}, {-2, 1.1, 0, -8}}; System.out.println( "In Zeile 2 und Spalte 1 steht"+a[1][0]); 3.3 Deklaration und IntitialisierungWir wissen schon, dass wir jede Variable deklarieren müssen: der Bezeichner und der Typ der Variable werden festgelegt. Ist //BspA double x; System.out.println("x="+x); Teil eines
jedoch wird das Feld gleichzeitig deklariert und initialisiert und den 4 Komponenten der Wert 0.0 zugewiesen. Die Verwendung des new-Operators dient also der Initialisierung. Ein bisschen anders sieht dies bei globalen Variablen aus. Fangen wir mit //BspC class BspC{ static double x; public static void main(String[] args){ System.out.println("x="+x); } } an. Hier wird keine fehlende Initialisierung angemahnt. Diese wurde
automatisch vorgenommen, wie man an der Ausgabe //BspD class BspD{ static String s; public static void main(String[] args){ System.out.println("s="+s); } } Ausgabe ist //BspE class BspE{ static double[] x; public static void main(String[] args){ System.out.println("x[0]="+x[0]); } } Das Programm kann compiliert werden, erst das Laufen ergibt den Laufzeitfehler
Alle Variablen der Grunddatentypen sind keine Zeigervariablen. Bei ihrer Deklaration wird gleichzeitig Speicherplatz geschaffen und ihr Inhalt vorbesetzt (z.B. durch null). Dennoch gibt es auch bei diesen zuweilen (z.B. bei Verwendung als lokale Variable) Compilerfehler, die eine Initialisierung anmahnen (s. BspA). Feldvariable und alle Objekte (Variable von Klassen) sind Zeigervariable. Das zu verstehen, ist ausgesprochen hilfreich. Mehr dazu im nächsten Abschnitt ( Referenzvariable ). Übrigens spricht man auch von Allokation statt von Initialisierung. Ein letztes Wort zu den Weiter mit Methoden und Verzeigungen.
|
![]() ![]() |
Impressum | 2009-03-15, wwwmath (WL) |