Objektorientierte Programmierung OOP Programmieren mit Java



Ähnliche Dokumente
Arrays. Theorieteil. Inhaltsverzeichnis. Begriffe. Programmieren mit Java Modul 3. 1 Modulübersicht 3

1. Referenzdatentypen: Felder und Strings. Referenz- vs. einfache Datentypen. Rückblick: Einfache Datentypen (1) 4711 r

1. Referenzdatentypen: Felder und Strings

Institut für Programmierung und Reaktive Systeme. Java 2. Markus Reschke

5.4 Arrays. Oft müssen viele Werte gleichen Typs gespeichert werden. Idee: Lege sie konsekutiv ab! Greife auf einzelne Werte über ihren Index zu!

5.1 Mehr Basistypen. (Wie viele Werte kann man mit n Bit darstellen?)

Vorkurs Informatik WiSe 17/18

Einstieg in die Informatik mit Java

Vorkurs Informatik WiSe 16/17

Objekte. Theorieteil. Inhaltsverzeichnis. Begriffe. Programmieren mit Java Modul 5. 1 Modulübersicht 3

Felder. Gerd Bohlender. Einstieg in die Informatik mit Java, Vorlesung vom

Einführung in die Programmierung WS 2009/10. Übungsblatt 5: Typen, Variablen und einfache Methoden in Java

Kapitel 3: Variablen

Javakurs FSS Lehrstuhl Stuckenschmidt. Tag 1 - Variablen und Kontrollstrukturen

Programmiervorkurs Einführung in Java Tag 1

Programmieren I. Arrays Heusch 7.2 Ratz Institut für Angewandte Informatik

Informatik Vorkurs - Vorlesung 2

Projekt 3 Variablen und Operatoren

II. Grundlagen der Programmierung. Beispiel: Merge Sort. Beispiel: Merge Sort (Forts. ) Beispiel: Merge Sort (Forts. )

Programmieren I. Arrays Heusch 7.2 Ratz Institut für Angewandte Informatik

Einstieg in die Informatik mit Java

3.2 Datentypen und Methoden

FH D. Objektorientierte Programmierung in Java FH D FH D. Prof. Dr. Ing. André Stuhlsatz. Referenzen. Referenzen

Tag 4 Repetitorium Informatik (Java)

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

Java Referenzdatentypen genauer betrachtet

Java I Vorlesung Imperatives Programmieren

Einstieg in die Informatik mit Java

Übungsblatt 1. Java Vorkurs (WS 2017)

Einführung in die Programmierung

Zeiger. C-Kurs 2012, 2. Vorlesung. Tino Kutschbach 10.

JAVA BASICS. 2. Primitive Datentypen. 1. Warum Java? a) Boolean (logische Werte wahr & falsch)

Arrays. Einleitung. Deklarieren einer Array Variablen

Klassen als Datenstrukturen

Anregungen zu Übung 2

Kapitel 4. Programmierkurs. Datentypen. Arten von Datentypen. Wiederholung Kapitel 4. Birgit Engels, Anna Schulze WS 07/08

Organisatorisches. Folien (u.a.) auf der Lva-Homepage Skriptum über MU Online

int i=1; //Integerzahl i anlegen und mit 1 initialisieren float wert; //Floatzahl deklarieren scanf( %f,&wert); //Wert über Tastatur eingeben

Ausdrücke der Programmiersprache Java

Propädeutikum zur Programmierung

Grundlagen der Programmierung Teil1 Einheit III Okt. 2010

Felder, Zeiger und Adreßrechnung

Objekttypen. Referenzen, Objekte, Gleichheit, Wrapper, Arrays, mehr-dimensionale Arrays, Bildbearbeitung, krumme Arrays

Mehrdimensionale Arrays

Einführung in C. EDV1-04C-Einführung 1

JAVA BASICS. 2. Primitive Datentypen. 1. Warum Java? a) Boolean (logische Werte wahr & falsch)

C# - Einführung in die Programmiersprache Arrays, Enumeration und Collections. Leibniz Universität IT Services Anja Aue

9. Vektoren. (auch Felder/array)

Martin Unold INFORMATIK. Geoinformatik und Vermessung

+ C - Array (Vektoren, Felder)

Programmierung mit C Zeiger

Methoden. Gerd Bohlender. Einstieg in die Informatik mit Java, Vorlesung vom

Zeiger, Arrays und Strings in C und C++

Ausgabe:

Methoden und Wrapperklassen

Einführung Datentypen Verzweigung Schleifen. Java Crashkurs. Kim-Manuel Klein May 4, 2015

Einfache Arrays. Dr. Philipp Wendler. Zentralübung zur Vorlesung Einführung in die Informatik: Programmierung und Softwareentwicklung

Einstieg in die Informatik mit Java

Basiswissen in Informatik

Variablen. int Flugzeug. float. I write code Hund. String. long. Borchers: Programmierung für Alle (Java), WS 06/07 Kapitel

JAVA-Datentypen und deren Wertebereich

Vorkurs Informatik WiSe 16/17

Grundlagen der Programmierung

Variablen. CoMa-Übung VIII TU Berlin. CoMa-Übung VIII (TU Berlin) Variablen / 15

Wertebereich und Genauigkeit der Zahlendarstellung

Martin Unold INFORMATIK. Geoinformatik und Vermessung

Wenn... dann... if (condition) statement. if (kontostand < 0) System.out.println("Oops..."); false. condition. true. statement

Java Einführung VARIABLEN und DATENTYPEN Kapitel 2

ÜBUNGS-BLOCK 7 LÖSUNGEN

Einführung in die Programmierung für NF MI. Übung 04

Repetitorium Informatik (Java)

Tag 4 Repetitorium Informatik (Java)

C++ Notnagel. Ziel, Inhalt. Programmieren in C++

8. Ausdrücke, Operatoren (einfache Typen)

Organisatorisches. Folien (u.a.) gibt's auf der Lva-Homepage zum Download

Javaprogrammierung mit NetBeans. Variablen, Datentypen, Methoden

Grundlagen der Programmierung

String s1, s2; Eine Zuweisung geschieht am einfachsten direkt durch Angabe des Strings eingeschlossen in doppelte Hochkommata:

Gedächtnis. Während der Abarbeitung eines Algorithmus müssen sich Dinge gemerkt werden bzw. auf Dingen wird gerechnet. Zugriff.

5.3 Auswertung von Ausdrücken

Javakurs für Anfänger

INE1 Arrays, Zeiger, Datenstrukturen

Transkript:

4 Datenfelder, Parameterübergabe, Casting Objektorientierte Programmierung OOP Programmieren mit Java 4 Datenfelder, Parameterübergabe, Casting 4 Datenfelder, Parameterübergabe, Casting 4.1 Datenfelder 4.1.1 Erstellen von Arrays 4.1.2 Zugriff auf Array-Elemente 4.1.3 Dreiecksmatrizen 4.1.4 Referenztyp String 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 4.1 Datenfelder 4 Datenfelder, Parameterübergabe, Casting 4.1 Datenfelder 4.1.1 Erstellen von Arrays 4.1.2 Zugriff auf Array-Elemente 4.1.3 Dreiecksmatrizen 4.1.4 Referenztyp String 4.1.5 Kopieren von Datenfeldern 4.2 Parameterübergabe 4.3 Casting 4.3.1 Automatische Typenkonvertierung 4.3.2 Type-Cast-Operator 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. 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). 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. Beispiel: Das zweidimensionale Array Regal [0][0] [1][0] [2][0] [3][0] [0][1]...... [0][2] Prof. Dr. Rolf Dornberger OOP: 4 Datenfelder, Parameterübergabe, Casting 22.09.2010 3 Prof. Dr. Rolf Dornberger 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. Auf die einzelnen Elemente eines Arrays wird mittels der eckigen Klammer [ ] zugegriffen. Beispiele: Datenfeld[0] 1. Element des Arrays Datenfeld[] Datenfeld[1] 2. Element des Arrays Datenfeld[] Datenfeld[10] 11. Element des Arrays Datenfeld[]... 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[][] Prof. Dr. Rolf Dornberger OOP: 4 Datenfelder, Parameterübergabe, Casting 22.09.2010 5 Zum Erstellen eines Arrays in Java müssen folgende drei Schritte durchgeführt werden: Deklarieren einer Array-Variablen Initialisieren des Arrays (Erzeugen eines Array-Objektes mit Zuweisen an die Array- Variable) Füllen des Arrays mit Werten 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 6 4.1.1 Erstellen von Arrays 4.1.1 Erstellen von Arrays Deklarieren einer Array-Variablen Zuerst muss eine Variable deklariert werden, über die auf das Array zugegriffen wird. (Die Variable zeigt quasi auf das Array.) Die Kennzeichnung der Variable als Array-Variable erfolgt mittels eckiger Klammern [ ], z.b.: double[ ] Datenfeld; Ein zweidimensionales Array wird mit 2 aufeinander folgenden eckigen Klammern [ ] [ ] ([Zeile][Spalte]) gekennzeichnet, ein dreidimensionales Array mit [ ][ ][ ], und so fort. 2D-Beispiel: int[ ][ ] Matrix; 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[ ][ ]; Initialisieren des Arrays Ein Array-Objekt wird erzeugt und der Array-Variablen zugewiesen. Dabei wird der Variablen auch mitgeteilt, wie groß das Array ist. Dies geschieht mittels des new-operators, z.b.: Datenfeld = new double[4]; oder Matrix = new int[2][2]; Die mittels des new-operators entstehenden Arrays sind dabei mit folgenden Default-Werten (vordefinierten Werten) initialisiert: false für Boolesche Arrays, \0 für Zeichen-Arrays, 0 für Ganzzahl-Arrays und 0.0 für Gleitzahl-Arrays Beispielsweise ist jeder Wert in Datenfeld[] gleich 0.0 oder in Matrix[][] gleich 0. Prof. Dr. Rolf Dornberger OOP: 4 Datenfelder, Parameterübergabe, Casting 22.09.2010 7 Prof. Dr. Rolf Dornberger OOP: 4 Datenfelder, Parameterübergabe, Casting 22.09.2010 8

4.1.1 Erstellen von Arrays Diese beiden Schritte können auch in einem einzigen Aufruf kombiniert werden: 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]; 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 9 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: 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; Das Array Datenfeld[] mit diesen 4 Elementen vom Typ double wird dabei automatisch erzeugt. 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; Prof. Dr. Rolf Dornberger OOP: 4 Datenfelder, Parameterübergabe, Casting 22.09.2010 10 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. public class Array1{ // 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; 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 22.09.2010 11 4.1.2 Zugriff auf Array-Elemente Das Programm Array1 zeigt das nachträgliche Zuweisen von Werten zu Elementen eines Arrays. Dies erfolgt durch die direkte Adressierung der Array-Elemente über ihre Indizes, z.b.: Matrix[1][1]=999; In die 2. Zeile und 2. Spalte des Arrays Matrix wird der Wert 999 eingetragen. public class Array1{ // 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; 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 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. Dazu dient die Operation.length, die auf die entsprechende Array-Variable angewendet wird: Anzahl Zeilen: b.length Anzahl Spalten: b[0].length Bei mehrdimensionalen Arrays, kann damit die Länge der einzelnen Dimensionen des Arrays abgefragt werden. public class Array2{ // Initialisierung double[] a = {5.4, 3.7, 4.4, 4.8; int[][] b = {{1, 2, {3, 4, {5, 6; System.out.println("Laenge von a = " + a.length); System.out.println("a[0] = " + a[0]); System.out.println("a[1] = " + a[1]); System.out.println("a[2] = " + a[2]); System.out.println("a[3] = " + 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]); Prof. Dr. Rolf Dornberger OOP: 4 Datenfelder, Parameterübergabe, Casting 22.09.2010 13 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 2 3 4 5 a = 6 7 8 9 0 3 4 5 3 2 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 3 4 5 1 2 3 b = 2 3 4 5 3 4 5 6 Prof. Dr. Rolf Dornberger OOP: 4 Datenfelder, Parameterübergabe, Casting 22.09.2010 14 7 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: public class 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]); int z = b.length; int s0 = b[0].length; int s1 = b[1].length; int s2 = b[2].length; 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 OOP: 4 Datenfelder, Parameterübergabe, Casting 22.09.2010 15 4.1.4 Referenztyp String 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. 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"; (In späteren Kapiteln wird die Klasse String und deren Methoden ausführlicher behandelt.) 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. Dazu dient die Operation (bzw. Methode).length(), die auf die entsprechende String-Variable angewendet wird, z.b.: a.length() oder b.length() (Warum für Strings.length() und für Arrays.length verwendet werden muss, wird in einem späteren Kapitel erklärt.) public class Array3{ // Initialisierung String a = new String("Hello World"); String b = "Hello Switzerland"; System.out.println(a); System.out.println("Laenge = " + a.length()); System.out.println(b); System.out.println("Laenge = " + b.length()); Prof. Dr. Rolf Dornberger OOP: 4 Datenfelder, Parameterübergabe, Casting 22.09.2010 17 4.1.4 Referenztyp String Mehrmals wurde schon gezeigt, dass mit dem Operator + zwei Strings miteinander verbunden werden können. Allerdings muss man die Operatoren- Priorität, wie in einem der letzten Kapitel angegeben, für die einzelnen Operatoren beachten. 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)); Im ersten Fall lautet die Ausgabe 3 + 4 = 34 (ausschließlich Verknüpfung von Strings). 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 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 Inhalte eines Datenfeldes kopieren Referenz auf Datenfeld kopieren Inhalte eines Datenfeldes kopieren Prof. Dr. Rolf Dornberger OOP: 4 Datenfelder, Parameterübergabe, Casting 22.09.2010 19 Prof. Dr. Rolf Dornberger OOP: 4 Datenfelder, Parameterübergabe, Casting 22.09.2010 20

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. Wird ein Eintrag in diesem Datenfeld geändert, ist er natürlich in beiden Variablen geändert, wie Programm Feldkopie1 verdeutlicht. public class Feldkopie1 { int[] feld1 = {1,2,3; int[] feld2 = feld1; // Referenz wird kopiert. // D.h. feld1 und feld2 zeigen auf denselben Speicherbereich. 4.1.5 Kopieren von Datenfeldern 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. public class Feldkopie2 { int[] feld1 = {1,2,3; int[] feld2 = new int[3]; // Inhalte des Datenfelds werden kopiert. feld2[0] = feld1[0]; feld2[1] = feld1[1]; feld2[2] = feld1[2]; feld2[1] = 8; Prof. Dr. Rolf Dornberger OOP: 4 Datenfelder, Parameterübergabe, Casting 22.09.2010 21 feld2[1] = 8; 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.) public class Feldkopie3 { int[] feld1 = {1,2,3; int[] feld2 = new int[3]; // Inhalte des Datenfelds werden auf elegante Art kopiert. feld2 = (int[]) feld1.clone(); feld2[1] = 8; Prof. Dr. Rolf Dornberger OOP: 4 Datenfelder, Parameterübergabe, Casting 22.09.2010 23 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 { String feld1 = "Hallo Welt"; String feld2 = feld1; System.out.println("feld1 = "+feld1); System.out.println("feld2 = "+feld2); feld2 = "Hallo Oma"; System.out.println("feld1 = "+feld1); System.out.println("feld2 = "+feld2); Prof. Dr. Rolf Dornberger OOP: 4 Datenfelder, Parameterübergabe, Casting 22.09.2010 24

4.2 Parameterübergabe 4 Datenfelder, Parameterübergabe, Casting 4.1 Datenfelder 4.2 Parameterübergabe 4.3 Casting 4.2 Parameterübergabe Beim Aufruf von Java-Programmen mittels va JavaProgramm können auch Parameter an das Programm bei Programmaufruf übergeben werden, z.b.: va JavaProgramm Parameter1 Parameter2 Intern werden diese Parameter in dem Array args[] von String-Variablen innerhalb der Befehlszeile abgelegt. public static void main (String[] args) 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 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. 4.2 Parameterübergabe Betrachten Sie folgendes Programm: public class Parameterinput1 { System.out.println(args[0]); Werden nun beim Aufruf des Programms Parameter eingegeben, va 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.1 Datenfelder 4.2 Parameterübergabe 4.3 Casting 4.3.1 Automatische Typenkonvertierung 4.3.2 Type-Cast-Operator 4.3 Casting 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. 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. 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 22.09.2010 29 Prof. Dr. Rolf Dornberger OOP: 4 Datenfelder, Parameterübergabe, Casting 22.09.2010 30 4.3.1 Automatische Typenkonvertierung 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). public class Casting1{ byte a = 125; byte b = 7; System.out.println("a+b = " + (a+b)); System.out.println("a+b = " + a + b); int c = 7; int d = 2; float e, f, g; f = c / d; e = c; g = e / d; System.out.println("e = " + e); System.out.println("c/d = " + (c/d)); System.out.println("f = " + f); System.out.println("g = " + g); 4.3.2 Type-Cast-Operator In Java gibt es einen Type-Cast-Operator, mit dem explizite Typenumwandlungen vorgenommen werden können. Der Ausdruck (Datentyp)a wandelt bzw. konvertiert die Variable a in eine Variable vom Typ Datentyp um. Typenumwandlungen mit dem Type-Cast-Operator sind für alle primitiven Datentypen ausser boolean möglich. Daraus ergeben sich folgende Type-Cast-Operatoren: Zwei Variablen vom Typ int liefern (byte) a konvertiert a in den Typ byte bei der Division (c/d) nur einen (short) a konvertiert a in den Typ short Ganzzahlwert, selbst wenn das (int) a konvertiert a in den Typ int Ergebnis einer float-variablen (f) (long) a konvertiert a in den Typ long zugewiesen wird. (float) a konvertiert a in den Typ float (double) a konvertiert a in den Typ double Wird allerdings eine int-variable (char) a konvertiert a in den Typ char einer float-variablen zu gewiesen Prof. Dr. Rolf Dornberger OOP: 4 Datenfelder, Parameterübergabe, Casting 22.09.2010 31 22.09.2010 (e=c), wird der Ganzzahlwert in Prof. Dr. Rolf Dornberger OOP: 4 Datenfelder, Parameterübergabe, Casting 32

4.3.2 Type-Cast-Operator 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 float- Variable konvertiert, (float)c, wird auch eine Gleitzahldivision durchgeführt. 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. public class Casting2{ byte a = 125; byte b = 7; byte z; z = (byte)(a+b); System.out.println("a+b = " + (a+b)); System.out.println("a+b = " + z); int c = 7; int d = 2; float f; f = (float)c / d; System.out.println("f = " + f); System.out.println((char) 65); 4.3 Casting Die Tabelle zeigt, welche Typenkonvertierungen von Typ1 in Typ2 in Java möglich sind: ) Typ2 = Typ1; (automatische Typenkonvertierung) ) ) Typ1 Typ2 byte short int long float double Typ2 = (Casting-Typ) Typ1; (Casting-Operator notwendig) Casting von Typ1 in Typ2 nicht möglich boolean char byte short int long float double boolean char Prof. Dr. Rolf Dornberger OOP: 4 Datenfelder, Parameterübergabe, Casting 22.09.2010 33 Prof. Dr. Rolf Dornberger OOP: 4 Datenfelder, Parameterübergabe, Casting 22.09.2010 34 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 OOP: 4 Datenfelder, Parameterübergabe, Casting 22.09.2010 35