Datenfelder, Parameterübergabe, Casting [OOP04]

Transcription

Datenfelder, Parameterübergabe, Casting [OOP04]
4 Datenfelder, Parameterübergabe, Casting
4 Datenfelder, Parameterübergabe, Casting
Objektorientierte Programmierung OOP
– 4.1 Datenfelder
Programmieren mit Java
–4.1.1 Erstellen von Arrays
–4.1.2 Zugriff auf Array-Elemente
–4.1.3 Dreiecksmatrizen
–4.1.4 Referenztyp String
4 Datenfelder, Parameterübergabe, Casting
–4.1.5 Kopieren von Datenfeldern
– 4.2 Parameterübergabe
– 4.3 Casting
–4.3.1 Automatische Typenkonvertierung
–4.3.2 Type-Cast-Operator
© Prof. Dr. Rolf Dornberger
OOP: 4 Datenfelder, Parameterübergabe, Casting
22.09.2010
2
4.1 Datenfelder
Datenfelder heißen auf Englisch Arrays. Arrays sind eine Ansammlung von Elementen
eines bestimmten Typs, die über einen Index oder mehrere Indizes adressiert werden.
Im klassischen Array sind die Indizes Integerzahlen.
4.1 Datenfelder
4 Datenfelder, Parameterübergabe, Casting
In Java sind Arrays Objekte. (Was Objekte sind und was das bedeutet, wird in einem
späteren Kapitel erläutert.) Der Typ der Elemente eines Arrays muss in Java immer
derselbe sein, kann aber wieder aus einem Array bestehen (verschachtelte Arrays).
– 4.1 Datenfelder
–4.1.1 Erstellen von Arrays
–4.1.2 Zugriff auf Array-Elemente
Ein Arrays benötigt so viele Indizes zur Adressierung seiner Elemente wie es
Dimensionen aufweist. Die Zählung der Elemente beginnt in Java bei 0.
–4.1.3 Dreiecksmatrizen
–4.1.4 Referenztyp String
– 4.2 Parameterübergabe
Beispiel: Das zweidimensionale
Array Regal
– 4.3 Casting
–4.3.1 Automatische Typenkonvertierung
–4.3.2 Type-Cast-Operator
© Prof. Dr. Rolf Dornberger
OOP: 4 Datenfelder, Parameterübergabe, Casting
[0][2]
[0][1]
[0][0]
–4.1.5 Kopieren von Datenfeldern
22.09.2010
3
© Prof. Dr. Rolf Dornberger
[1][0]
[2][0]
.....
[3][0]
.....
OOP: 4 Datenfelder, Parameterübergabe, Casting
22.09.2010
4
4.1 Datenfelder
4.1.1 Erstellen von Arrays
Der Index (bzw. die Indizes) eines Arrays muss (müssen) in Java vom Typ int
sein und beginnt (beginnen) immer mit 0.
Zum Erstellen eines Arrays in Java müssen folgende drei Schritte durchgeführt
werden:
Auf die einzelnen Elemente eines Arrays wird mittels der eckigen Klammer [ ]
zugegriffen.
– Deklarieren einer Array-Variablen
– Initialisieren des Arrays (Erzeugen eines Array-Objektes mit Zuweisen an die ArrayVariable)
Beispiele:
– Datenfeld[0]
1. Element des Arrays Datenfeld[]
– Datenfeld[1]
2. Element des Arrays Datenfeld[]
– Datenfeld[10]
11. Element des Arrays Datenfeld[]
– Füllen des Arrays mit Werten
– ...
– Matrix[0][0]
Element der 1.Zeile und 1.Spalte des Arrays Matrix[][]
– Matrix[2][4]
Element der 3.Zeile und 5.Spalte des Arrays Matrix[][]
Für eine kürze Schreibweise im Java-Quelltext gilt:
– Die Schritte 1. und 2. können mittels einer einzigen Anweisung ausgeführt werden.
– Die Schritte 1. bis 3. können auch mittels einer einzigen Anweisung ausgeführt
werden.
© Prof. Dr. Rolf Dornberger
OOP: 4 Datenfelder, Parameterübergabe, Casting
22.09.2010
5
© Prof. Dr. Rolf Dornberger
OOP: 4 Datenfelder, Parameterübergabe, Casting
4.1.1 Erstellen von Arrays
4.1.1 Erstellen von Arrays
Deklarieren einer Array-Variablen
Initialisieren des Arrays
22.09.2010
– Zuerst muss eine Variable deklariert werden, über die auf das Array zugegriffen
wird. (Die Variable zeigt quasi auf das Array.)
– Ein Array-Objekt wird erzeugt und der Array-Variablen zugewiesen.
– Die Kennzeichnung der Variable als Array-Variable erfolgt mittels eckiger Klammern
[ ], z.B.:
double[ ] Datenfeld;
– Dies geschieht mittels des new-Operators, z.B.:
Datenfeld = new double[4];
oder
Matrix = new int[2][2];
– Ein zweidimensionales Array wird mit 2 aufeinander folgenden eckigen Klammern [ ]
[ ] ([Zeile][Spalte]) gekennzeichnet, ein dreidimensionales Array mit [ ][ ][ ], und so
fort. 2D-Beispiel:
int[ ][ ] Matrix;
– Die mittels des new-Operators entstehenden Arrays sind dabei mit folgenden
Default-Werten (vordefinierten Werten) initialisiert:
– Dabei wird der Variablen auch mitgeteilt, wie groß das Array ist.
OOP: 4 Datenfelder, Parameterübergabe, Casting
22.09.2010
– false für Boolesche Arrays,
– \0 für Zeichen-Arrays,
– 0 für Ganzzahl-Arrays und
– In Anlehnung an C/C++ sind auch folgende Positionen für die eckigen Klammern
erlaubt (worauf aber im Folgenden nicht weiter eingegangen wird):
double Datenfeld[ ];
oder
int Matrix[ ][ ];
© Prof. Dr. Rolf Dornberger
6
– 0.0 für Gleitzahl-Arrays
– Beispielsweise ist jeder Wert in Datenfeld[] gleich 0.0 oder in Matrix[][] gleich 0.
7
© Prof. Dr. Rolf Dornberger
OOP: 4 Datenfelder, Parameterübergabe, Casting
22.09.2010
8
4.1.1 Erstellen von Arrays
Soll nun das Arrays bei seiner Initialisierung sogleich auch mit vorgegebene
Werten belegt werden, können die beiden vorherigen Schritte auch mit einer
anderen Form eines Aufrufs kombiniert werden:
4.1.1 Erstellen von Arrays
Diese beiden Schritte können auch in einem einzigen Aufruf kombiniert
werden:
1. / 2. / 3. Deklarieren, Initialisieren und Füllen des Arrays mit
vorgegebenen Werten
– Dies geschieht mittels direkter literaler Adressierung, z.B.:
double[] Datenfeld = {5.4, 3.7, 4.4, 4.8};
oder
double[] Datenfeld = new double[] {5.4, 3.7, 4.4, 4.8};
1. / 2. Deklarieren und Initialisieren eines Arrays
– Dies geschieht ebenfalls mittels des new-Operators, z.B.:
double[] Datenfeld = new double[4];
oder
int[][] Matrix = new int[2][2];
– Das Array Datenfeld[] mit diesen 4 Elementen vom Typ double wird
dabei automatisch erzeugt.
– Die mittels des new-Operators entstehenden Arrays sind auch hier mit
folgenden Default-Werten initialisiert: false für Boolesche, \0 für Zeichen-,
0 für Ganzzahl- und 0.0 für Gleitzahl-Arrays.
© Prof. Dr. Rolf Dornberger
OOP: 4 Datenfelder, Parameterübergabe, Casting
22.09.2010
– Ein mehrdimensionales Array kann so ebenfalls mittels geschachtelter
Adressierung der Elemente erzeugt werden, z.B.:
int[][] Matrix = {{1, 2}, {3, 4}};
oder
int[][] Matrix = new int[][] {{1, 2}, {3, 4}};
9
public class Array1{
public static void main (String[] args) {
Das Programm Array1
zeigt das nachträgliche
Zuweisen von Werten zu
Elementen eines Arrays.
// Deklaration
double[] Datenfeld1;
int[][] Matrix1;
// Initialisierung
Datenfeld1 = new double[4];
Matrix1
= new int[2][2];
// Deklaration und Initialisierung in einem Schritt
double[] Datenfeld2 = new double[4];
int[][] Matrix2
= new int[2][2];
// alles auf einmal
double[] Datenfeld3 = {5.4, 3.7, 4.4, 4.8};
int[][] Matrix3
= {{1, 2}, {3, 4}};
// ODER: alles auf einmal
//double[] Datenfeld3 = new double[] {5.4, 3.7, 4.4, 4.8};
//int[][] Matrix3
= new int[][] {{1, 2}, {3, 4}};
// Werte zuweisen
Datenfeld2[1] = 888;
Matrix2[1][1] = 999;
10
// Deklaration
double[] Datenfeld1;
int[][] Matrix1;
// Initialisierung
Datenfeld1 = new double[4];
Matrix1
= new int[2][2];
// Deklaration und Initialisierung in einem Schritt
double[] Datenfeld2 = new double[4];
int[][] Matrix2
= new int[2][2];
Dies erfolgt durch die
direkte Adressierung der
Array-Elemente über ihre
Indizes, z.B.:
Matrix[1][1]=999;
}}
OOP: 4 Datenfelder, Parameterübergabe, Casting
22.09.2010
public class Array1{
public static void main (String[] args) {
// alles auf einmal
double[] Datenfeld3 = {5.4, 3.7, 4.4, 4.8};
int[][] Matrix3
= {{1, 2}, {3, 4}};
// ODER: alles auf einmal
//double[] Datenfeld3 = new double[] {5.4, 3.7, 4.4, 4.8};
//int[][] Matrix3
= new int[][] {{1, 2}, {3, 4}};
// Werte zuweisen
Datenfeld2[1] = 888;
Matrix2[1][1] = 999;
In die 2. Zeile und 2. Spalte
des Arrays Matrix wird
der Wert 999 eingetragen.
System.out.println("Datenfeld1[0]="+Datenfeld1[0]);
System.out.println("Datenfeld2[0]="+Datenfeld2[0]);
System.out.println("Datenfeld2[1]="+Datenfeld2[1]);
System.out.println("Datenfeld3[0]="+Datenfeld3[0]);
System.out.println("Matrix1[0][0]="+Matrix1[0][0]);
System.out.println("Matrix2[0][0]="+Matrix2[0][0]);
System.out.println("Matrix2[1][1]="+Matrix2[1][1]);
System.out.println("Matrix3[0][0]="+Matrix3[0][0]);
System.out.println("Matrix3[1][0]="+Matrix3[1][0]);
System.out.println("Matrix3[0][1]="+Matrix3[0][1]);
System.out.println("Matrix3[1][1]="+Matrix3[1][1]);
© Prof. Dr. Rolf Dornberger
OOP: 4 Datenfelder, Parameterübergabe, Casting
4.1.2 Zugriff auf Array-Elemente
4.1.2 Zugriff auf Array-Elemente
Das Programm Array1
zeigt nochmals die
unterschiedlichen
Möglichkeiten, Arrays zu
deklarieren, zu
initialisieren und mit
Werten zu belegen.
© Prof. Dr. Rolf Dornberger
System.out.println("Datenfeld1[0]="+Datenfeld1[0]);
System.out.println("Datenfeld2[0]="+Datenfeld2[0]);
System.out.println("Datenfeld2[1]="+Datenfeld2[1]);
System.out.println("Datenfeld3[0]="+Datenfeld3[0]);
System.out.println("Matrix1[0][0]="+Matrix1[0][0]);
System.out.println("Matrix2[0][0]="+Matrix2[0][0]);
System.out.println("Matrix2[1][1]="+Matrix2[1][1]);
System.out.println("Matrix3[0][0]="+Matrix3[0][0]);
System.out.println("Matrix3[1][0]="+Matrix3[1][0]);
System.out.println("Matrix3[0][1]="+Matrix3[0][1]);
System.out.println("Matrix3[1][1]="+Matrix3[1][1]);
}}
22.09.2010
11
© Prof. Dr. Rolf Dornberger
OOP: 4 Datenfelder, Parameterübergabe, Casting
22.09.2010
12
4.1.2 Zugriff auf Array-Elemente
Das Programm Array2 zeigt eine
Variante, bei der die Länge eines
Arrays abgefragt wird.
4.1.3 Dreiecksmatrizen
Wird ein Array mit Zahlen gefüllt, spricht man von einer Matrix. Meist sind
Matrizen viereckig, wie a, oftmals sogar quadratisch (Anzahl an Zeilen und
Spalten gleich):
1 2345
public class Array2{
public static void main (String[] args) {
// Initialisierung
double[] a = {5.4, 3.7, 4.4, 4.8};
int[][] b = {{1, 2}, {3, 4}, {5, 6}};
Dazu dient die Operation
.length, die auf die
entsprechende Array-Variable
angewendet wird:
System.out.println("Laenge von a = " + a.length);
System.out.println("a[0]
System.out.println("a[1]
System.out.println("a[2]
System.out.println("a[3]
– Anzahl Zeilen:
b.length
=
=
=
=
"
"
"
"
+
+
+
+
a[0]);
a[1]);
a[2]);
a[3]);
System.out.println("\nZeilen von b = " + b.length);
System.out.println("Spalten von b = " + b[0].length);
System.out.println("b[0] = "+b[0][0]+" "+b[0][1]);
System.out.println("b[1] = "+b[1][0]+" "+b[1][1]);
System.out.println("b[2] = "+b[2][0]+" "+b[2][1]);
– Anzahl Spalten:
b[0].length
}
Bei mehrdimensionalen Arrays,
kann damit die Länge der
einzelnen Dimensionen des
Arrays abgefragt werden.
OOP: 4 Datenfelder, Parameterübergabe, Casting
In beiden Fällen ist es egal, ob man die Anzahl an Spalten mit a[0].length
oder a[1].length usw. abfragt.
Anders sieht es bei Dreiecksmatrizen wie c oder bei solchen Matrizen wie b
aus, bei denen die Anzahl der Einträge pro Zeile (also die Anzahl an
Spalten) variiert:
1
c = 2
3
}
© Prof. Dr. Rolf Dornberger



a = 6 7 8 9 0
3 4 5 3 2
22.09.2010
13
© Prof. Dr. Rolf Dornberger
3
4



5
1 2 3


b = 2 3 4 5 
3 4 5 6 7
OOP: 4 Datenfelder, Parameterübergabe, Casting
22.09.2010
14
4.1.3 Dreiecksmatrizen
In diesem Fall ist es ein Unterschied, ob man die Anzahl an Spalten mit b[0].length
oder b[1].length usw. abfragt, da die Zeilen eine verschiedene Anzahl an
Einträgen respektive Spalten haben.
Dies zeigt auch das Programm Dreiecksmatrix1:
int[][] b = {{1,2,3}, {2,3,4,5}, {3,4,5,6,7}};
System.out.println("b[0] = "+b[0][0]+" "+b[0][1]+" "+b[0][2]);
System.out.println("b[1] = "+b[1][0]+" "+b[1][1]+" "+b[1][2]+" "+b[1][3]);
System.out.println("b[2] = "+b[2][0]+" "+b[2][1]+" "+b[2][2]+" "+b[2][3]+" "+b[2][4]);
z = b.length;
s0 = b[0].length;
s1 = b[1].length;
s2 = b[2].length;
(In späteren Kapiteln wird die Klasse String und deren Methoden ausführlicher
behandelt.)
}
}
OOP: 4 Datenfelder, Parameterübergabe, Casting
In Anlehnung an die Definition eines Datenfeldes (bzw. einer Klasse) mit dem
new-Operator wird entsprechend einer String-Variablen eine Zeichenkette
zugewiesen. Allerdings steht hier der Inhalt der Zeichenkette in
Anführungszeichen:
– String a = new String("Hello World");
Ebenso ist die Initialisierung einer String-Variablen über die literale Adressierung
möglich (Kurzform):
– String b = "Hello Switzerland";
System.out.println("Zeilen = " + z);
System.out.println("Eintraege (=Spalten) in Zeile 0 = " + s0);
System.out.println("Eintraege (=Spalten) in Zeile 1 = " + s1);
System.out.println("Eintraege (=Spalten) in Zeile 2 = " + s2);
© Prof. Dr. Rolf Dornberger
Eine besondere Form eines Datenfeldes ist eine Zeichenkette, auch als String
bezeichnet.
Zeichenketten werden in Java über den Referenztyp String (über die Klasse
String) quasi als erweiterter Datentyp ähnlich einem Array mit Elementen vom
Typ char definiert.
public class Dreiecksmatrix1 {
public static void main (String[] args) {
int
int
int
int
4.1.4 Referenztyp String
22.09.2010
15
© Prof. Dr. Rolf Dornberger
OOP: 4 Datenfelder, Parameterübergabe, Casting
22.09.2010
16
4.1.4 Referenztyp String
Das Programm Array3 zeigt, wie die Länge einer Zeichenkette abgefragt wird.
4.1.4 Referenztyp String
Dazu dient die Operation (bzw. Methode) .length(), die auf die
entsprechende String-Variable angewendet wird, z.B.:
a.length()
oder
Mehrmals wurde schon gezeigt, dass mit dem Operator + zwei Strings
miteinander verbunden werden können. Allerdings muss man die OperatorenPriorität, wie in einem der letzten Kapitel angegeben, für die einzelnen
Operatoren beachten.
b.length()
(Warum für Strings .length() und für Arrays .length verwendet werden
muss, wird in einem späteren Kapitel erklärt.)
Das Beispiel String1 zeigt, dass + einerseits Verknüpfung zweier Strings,
andererseits Addition zweier Zahlen bedeuten kann.
public class String1 {
public static void main(String[] args) {
System.out.println("3 + 4 = " + 3 + 4);
System.out.println("3 + 4 = " + (3 + 4));
}
}
public class Array3{
public static void main (String[] args) {
// Initialisierung
String a = new String("Hello World");
String b = "Hello Switzerland";
System.out.println(a);
System.out.println("Laenge = " + a.length());
Im ersten Fall lautet die Ausgabe 3 + 4 = 34 (ausschließlich Verknüpfung von
Strings).
System.out.println(b);
System.out.println("Laenge = " + b.length());
}
Im Zweiten Fall 3 + 4 = 7 (Addition von 3+4 und dann Verknüpfung von Strings).
}
© Prof. Dr. Rolf Dornberger
OOP: 4 Datenfelder, Parameterübergabe, Casting
22.09.2010
17
© Prof. Dr. Rolf Dornberger
OOP: 4 Datenfelder, Parameterübergabe, Casting
22.09.2010
18
4.1.5 Kopieren von Datenfeldern
Während die Werte von Variablen sehr einfach kopiert werden können
(variable2 = variable1), muss man beim Kopieren von Datenfeldern
unterscheiden, ob man die Referenz auf ein Datenfeld kopieren oder die
Inhalte eines Datenfeldes kopieren will.
Referenz auf Datenfeld kopieren
feld1[][]
Inhalte eines Datenfeldes kopieren
feld1[][]
feld2[][]
Referenz auf Datenfeld kopieren
feld1[][]
Inhalte eines Datenfeldes kopieren
feld1[][]
feld2[][]
© Prof. Dr. Rolf Dornberger
feld2[][]
OOP: 4 Datenfelder, Parameterübergabe, Casting
feld2[][]
22.09.2010
19
© Prof. Dr. Rolf Dornberger
OOP: 4 Datenfelder, Parameterübergabe, Casting
22.09.2010
20
4.1.5 Kopieren von Datenfeldern
4.1.5 Kopieren von Datenfeldern
Referenz kopieren heißt, dass nicht nur die Variable feld1 auf das gesamte
Datenfeld zeigt, sondern danach auch die Variable feld2 auf dasselbe gesamte
Datenfeld.
Datenfeld kopieren bzw. Inhalte eines Datenfeldes kopieren heißt, dass vom
gesamten Inhalt des Datenfeldes feld1 eine Kopie feld2 angelegt wird.
Wird ein Eintrag in einem Datenfeld geändert, ist er natürlich nur in der dazugehörigen
Variablen geändert, wie Programm Feldkopie2 verdeutlicht.
feld1[][]
Wird ein Eintrag in diesem Datenfeld geändert, ist er natürlich in beiden Variablen
geändert, wie Programm Feldkopie1 verdeutlicht.
public class Feldkopie1 {
public static void main (String[] args) {
public class Feldkopie2 {
public static void main (String[] args) {
feld2[][]
feld1[][]
int[] feld1 = {1,2,3};
int[] feld2 = new int[3];
int[] feld1 = {1,2,3};
feld2[][]
System.out.println("feld1 = ["+feld1[0]+" "+feld1[1]+" "+feld1[2]+"]");
System.out.println("feld2 = ["+feld2[0]+" "+feld2[1]+" "+feld2[2]+"]");
int[] feld2 = feld1;
// Referenz wird kopiert.
// D.h. feld1 und feld2 zeigen auf denselben Speicherbereich.
// Inhalte
feld2[0] =
feld2[1] =
feld2[2] =
System.out.println("feld1 = ["+feld1[0]+" "+feld1[1]+" "+feld1[2]+"]");
System.out.println("feld2 = ["+feld2[0]+" "+feld2[1]+" "+feld2[2]+"]");
des Datenfelds werden kopiert.
feld1[0];
feld1[1];
feld1[2];
feld2[1] = 8;
System.out.println("feld1 = ["+feld1[0]+" "+feld1[1]+" "+feld1[2]+"]");
System.out.println("feld2 = ["+feld2[0]+" "+feld2[1]+" "+feld2[2]+"]");
System.out.println("feld1 = ["+feld1[0]+" "+feld1[1]+" "+feld1[2]+"]");
System.out.println("feld2 = ["+feld2[0]+" "+feld2[1]+" "+feld2[2]+"]");
feld2[1] = 8;
}
System.out.println("feld1 = ["+feld1[0]+" "+feld1[1]+" "+feld1[2]+"]");
System.out.println("feld2 = ["+feld2[0]+" "+feld2[1]+" "+feld2[2]+"]");
}
}
}
© Prof. Dr. Rolf Dornberger
OOP: 4 Datenfelder, Parameterübergabe, Casting
22.09.2010
21
© Prof. Dr. Rolf Dornberger
OOP: 4 Datenfelder, Parameterübergabe, Casting
22.09.2010
22
4.1.5 Kopieren von Datenfeldern
Eine elegantere Art, komplette Datenfelder bzw. komplette Inhalte von Datenfeldern zu kopieren,
ermöglicht die Methode .clone().
Der Ausdruck feld2 = (int[]) feld1.clone(); kopiert den gesamten Inhalt der Variable
feld1 auf ein Mal in die Variable feld2, wie Programm Feldkopie3 verdeutlicht.
Der Ausdruck (int[]) ist ein explizites Casting zu einem Array des Datentyps int. Es muss von
dem Datentyp sein, in dem auch die Felder definiert sind, also hier int[]. (Wird später noch
ausführlicher erklärt.)
feld1[][]
public class Feldkopie3 {
public static void main (String[] args) {
feld2[][]
int[] feld1 = {1,2,3};
int[] feld2 = new int[3];
4.1.5 Kopieren von Datenfeldern
Das Kopieren von Strings verhält sich dahingegen wieder so, wie bei normalen
Variablen.
D.h. es wird eine neue Variable angelegt (keine neue Referenz) und nur diese wird
geändert, wie Programm Feldkopie4 verdeutlicht.
(Die Methode .clone() kann hier nicht angewendet werden, da sie nur für Objekte,
die Referenzen verwenden, definiert ist und daher nicht für Zeichenketten.)
public class Feldkopie4 {
public static void main (String[] args) {
String feld1 = "Hallo Welt";
String feld2 = feld1;
System.out.println("feld1 = ["+feld1[0]+" "+feld1[1]+" "+feld1[2]+"]");
System.out.println("feld2 = ["+feld2[0]+" "+feld2[1]+" "+feld2[2]+"]");
// Inhalte des Datenfelds werden auf elegante Art kopiert.
feld2 = (int[]) feld1.clone();
System.out.println("feld1 = "+feld1);
System.out.println("feld2 = "+feld2);
System.out.println("feld1 = ["+feld1[0]+" "+feld1[1]+" "+feld1[2]+"]");
System.out.println("feld2 = ["+feld2[0]+" "+feld2[1]+" "+feld2[2]+"]");
feld2 = "Hallo Oma";
feld2[1] = 8;
System.out.println("feld1 = "+feld1);
System.out.println("feld2 = "+feld2);
System.out.println("feld1 = ["+feld1[0]+" "+feld1[1]+" "+feld1[2]+"]");
System.out.println("feld2 = ["+feld2[0]+" "+feld2[1]+" "+feld2[2]+"]");
}
}
}
}
© Prof. Dr. Rolf Dornberger
OOP: 4 Datenfelder, Parameterübergabe, Casting
22.09.2010
23
© Prof. Dr. Rolf Dornberger
OOP: 4 Datenfelder, Parameterübergabe, Casting
22.09.2010
24
4.2 Parameterübergabe
4.2 Parameterübergabe
4 Datenfelder, Parameterübergabe, Casting
Beim Aufruf von Java-Programmen mittels
– 4.1 Datenfelder
java JavaProgramm
– 4.2 Parameterübergabe
können auch Parameter an das Programm bei Programmaufruf
übergeben werden, z.B.:
– 4.3 Casting
java JavaProgramm Parameter1 Parameter2
Intern werden diese Parameter in dem Array args[] von String-Variablen
innerhalb der Befehlszeile
public static void main (String[] args)
abgelegt.
© Prof. Dr. Rolf Dornberger
OOP: 4 Datenfelder, Parameterübergabe, Casting
22.09.2010
25
© Prof. Dr. Rolf Dornberger
OOP: 4 Datenfelder, Parameterübergabe, Casting
22.09.2010
26
4.2 Parameterübergabe
4.2 Parameterübergabe
Betrachten Sie folgendes Programm:
Damit handelt es sich bei args um ein Array von String-Variablen, dessen
Länge erst beim Aufruf des Java-Programms festgelegt wird.
Auf die einzelnen Einträge (die einzelnen Strings) dieses Arrays wird mittels
args[] zugegriffen.
public class Parameterinput1 {
public static void main (String[] args) {
System.out.println(args[0]);
}
}
Werden nun beim Aufruf des Programms Parameter eingegeben,
java Parameterinput1 Parameter1 Parameter2
so werden diese in der angegebenen Reihenfolge in der Array-Variablen args[]
als String abgelegt:
– args[0] beinhaltet Parameter1
– args[1] beinhaltet Parameter2 usw.
Die Zeile System.out.println(args[0]) gibt nun den Parameter in args[0]
wieder aus.
Achtung: Wird auf mehr Parameter zugegriffen, als eingegeben wurden, erzeugt der
Java-Interpreter eine Fehlermeldung!
© Prof. Dr. Rolf Dornberger
OOP: 4 Datenfelder, Parameterübergabe, Casting
22.09.2010
27
© Prof. Dr. Rolf Dornberger
OOP: 4 Datenfelder, Parameterübergabe, Casting
22.09.2010
28
4.3 Casting
4.3 Casting
4.1 Datenfelder
Casting ist die Typenkonvertierung, die es erlaubt, den Wert einer Variablen von
einem bestimmten Typ einer anderen Variablen mit einem anderen Datentyp
zuzuweisen. Dies entspricht quasi dem Ändern eines Datentyps einer Variablen.
4.2 Parameterübergabe
Nicht alle Konvertierungen von einem Typ in einen anderen sind aber zulässig.
Manche Typenkonvertierungen sind zulässig, führen aber zu einem Verlust an
Genauigkeit der Werte.
4.3 Casting
– 4.3.1 Automatische Typenkonvertierung
– 4.3.2 Type-Cast-Operator
Manche Konvertierungen werden vom Compiler automatisch vorgenommen,
ohne dass der Programmierer explizit etwas programmieren muss, z.B.:
– Bei einer Zuweisung, wenn Typ der Variablen und Typ des zugewiesenen
Ausdrucks nicht identisch sind.
– Bei der Auswertung eines arithmetischen Ausdrucks, wenn Operanden von
unterschiedlichem Datentyp sind.
– Wenn der Wertebereich über- oder unterschritten wird.
© Prof. Dr. Rolf Dornberger
OOP: 4 Datenfelder, Parameterübergabe, Casting
4.3.1 Automatische Typenkonvertierung
29
public class Casting1{
public static void main (String[] args) {
Variablen vom Typ byte haben
einen Wertebereich von –128 bis
127. Wird nun a+b=125+7 mit
byte-Variablen gerechnet, so wird
das Ergebnis automatisch in einen
grösseren Typ transformiert (in Java
ist das für Ganzzahlen immer int).
Zwei Variablen vom Typ int liefern
bei der Division (c/d) nur einen
Ganzzahlwert, selbst wenn das
Ergebnis einer float-Variablen (f)
zugewiesen wird.
22.09.2010
© Prof. Dr. Rolf Dornberger
OOP: 4 Datenfelder, Parameterübergabe, Casting
22.09.2010
30
4.3.2 Type-Cast-Operator
byte a = 125;
byte b = 7;
System.out.println("a+b = " + (a+b));
System.out.println("a+b = " + a + b);
In Java gibt es einen Type-Cast-Operator, mit dem explizite Typenumwandlungen
vorgenommen werden können.
int c = 7;
int d = 2;
float e, f, g;
Der Ausdruck (Datentyp)a wandelt bzw. konvertiert die Variable a in eine
Variable vom Typ Datentyp um.
f = c / d;
e = c;
g = e / d;
System.out.println("e =
System.out.println("c/d
System.out.println("f =
System.out.println("g =
"
=
"
"
+
"
+
+
e);
+ (c/d));
f);
g);
22.09.2010
31
}
}
Wird allerdings eine int-Variable
einer float-Variablen zu gewiesen
© Prof. Dr. Rolf Dornberger
OOP: 4 Datenfelder, Parameterübergabe, Casting
(e=c), wird der Ganzzahlwert
in
einen Gleitzahlwert konvertiert. Die
Typenumwandlungen mit dem Type-Cast-Operator sind für alle primitiven
Datentypen ausser boolean möglich.
Daraus ergeben sich folgende Type-Cast-Operatoren:
– (byte) a
konvertiert a in den Typ byte
– (short) a
konvertiert a in den Typ short
– (int) a
konvertiert a in den Typ int
– (long) a
konvertiert a in den Typ long
– (float) a
konvertiert a in den Typ float
– (double) a
konvertiert a in den Typ double
– (char) a
konvertiert a in den Typ char
© Prof. Dr. Rolf Dornberger
OOP: 4 Datenfelder, Parameterübergabe, Casting
22.09.2010
32
4.3 Casting
4.3.2 Type-Cast-Operator
public class Casting2{
public static void main (String[] args) {
byte a = 125;
byte b = 7;
byte z;
Da die byte-Variablen einen Wertebereich von 128 bis 127 haben, die Berechnung von
a+b=125+7 aber ein grösseres Ergebnis liefert,
ist dieses Ergebnis vom Typ int. Wird der Wert
dann mittels Casting wieder in eine byte-Variable
transformiert (z=(byte)(a+b)), läuft diese
Variable über ihren gültigen Wertebereich hinaus,
beginnt wieder bei –128 und erhält dann den
byte-Wert –124.
Zwei Variablen vom Typ int liefern bei der
Division (c/d) einen Ganzzahlwert. Wird jedoch
eine der int-Variablen vorher in eine floatVariable konvertiert, (float)c, wird auch eine
Gleitzahldivision durchgeführt.
ja)
z = (byte)(a+b);
System.out.println("a+b = " + (a+b));
System.out.println("a+b = " + z);
cast) Typ2 = (Casting-Typ) Typ1; (Casting-Operator notwendig)
Typ1
byte
short
int
long
float
double
boolean
char
Typ2
f = (float)c / d;
System.out.println("f = " + f);
byte
ja
cast
cast
cast
cast
cast
nein
cast
short
ja
ja
cast
cast
cast
cast
nein
cast
int
ja
ja
ja
cast
cast
cast
nein
ja
long
ja
ja
ja
ja
cast
cast
nein
ja
float
ja
ja
ja
ja
ja
cast
nein
ja
double
ja
ja
ja
ja
ja
ja
nein
ja
boolean
nein
nein
nein
nein
nein
nein
ja
nein
char
cast
cast
cast
cast
cast
cast
nein
ja
System.out.println((char) 65);
}
}
OOP: 4 Datenfelder, Parameterübergabe, Casting
22.09.2010
33
Lernziele
Wissen, wie man in Java Datenfelder anlegt und auf die einzelnen Einträge in den
Datenfeldern zugreift.
Arrays mit den primitiven Variablen und Strings anlegen und kopieren können.
Den Unterschied zwischen Referenz kopieren und Daten kopieren verstanden
haben.
Matrizen (normale, Dreiecksmatrizen, unterschiedliche Spaltenzahl) anlegen
können und auf Zeilen und Spalten zugreifen können.
Parameterübergabe anwenden können.
Das Prinzip des Casting (explizit und automatisch) verstanden haben und richtig
einsetzen können.
© Prof. Dr. Rolf Dornberger
(automatische Typenkonvertierung)
Typ2 = Typ1;
nein) Casting von Typ1 in Typ2 nicht möglich
int c = 7;
int d = 2;
float f;
Der Wert 65 wird in das Zeichen 'A'
umgewandelt. diese Umwandlung geht darauf
zurück, dass der Unicode von 'A' der
Integerwert 65 ist. D.h. (char) 65 ergibt 'A',
also A auf dem Bildschirm ohne
Anführungszeichen.
© Prof. Dr. Rolf Dornberger
Die Tabelle zeigt, welche Typenkonvertierungen von Typ1 in Typ2 in Java
möglich sind:
OOP: 4 Datenfelder, Parameterübergabe, Casting
22.09.2010
35
© Prof. Dr. Rolf Dornberger
OOP: 4 Datenfelder, Parameterübergabe, Casting
22.09.2010
34