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

Ähnliche Dokumente
1. Referenzdatentypen: Felder und Strings

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

Einstieg in die Informatik mit Java

Einstieg in die Informatik mit Java

Einstieg in die Informatik mit Java

Klassen als Datenstrukturen

Einstieg in die Informatik mit Java

Einstieg in die Informatik mit Java

Einstieg in die Informatik mit Java

Einstieg in die Informatik mit Java

Java Datentypen und Variablen

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

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

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

Dr. Monika Meiler. Inhalt

Dr. Monika Meiler. Inhalt

Primitive Datentypen und Felder (Arrays)

Einstieg in die Informatik mit Java

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

Wertebereich und Genauigkeit der Zahlendarstellung

3.2 Datentypen und Methoden

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

Programmiersprache 1 (C++) Prof. Dr. Stefan Enderle NTA Isny

Objektorientierte Programmierung OOP Programmieren mit Java

Kapitel 3: Variablen

Arrays. Einleitung. Deklarieren einer Array Variablen

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

Programmierung mit C Zeiger

Projekt 3 Variablen und Operatoren

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

3. Klassen Statische Komponenten einer Klasse. Klassenvariablen

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

Javakurs FSS Lehrstuhl Stuckenschmidt. Tag 1 - Variablen und Kontrollstrukturen

Java Einführung VARIABLEN und DATENTYPEN Kapitel 2

Inhalt. 4.5 Arbeit mit Zeigern (engl. Pointer)

2. Programmierung in C

Modellierung und Programmierung 1

2.5 Primitive Datentypen

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

Programmiertechnik Skalare Typen,Variablen, Zuweisungen

Klassenmethoden. Klassenvariablen. Für das Auslesen des Studentenzählers definieren wir eine öffentliche Klassenmethode:

Grundlagen der OO- Programmierung in C#

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

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

Vorkurs Informatik WiSe 16/17

Der Datentyp String. Stringvariable und -vergleiche

Java I Vorlesung Imperatives Programmieren

Die for -Schleife HEUTE. Schleifen. Arrays. Schleifen in JAVA. while, do reichen aus, um alle iterativen Algorithmen zu beschreiben

Programmiersprache Java Objektorientierte Programmierung II

Schwerpunkte. 10. Felder (Arrays) Grundprinzip von Arrays. Klassifikation von Typen in Programmiersprachen

Kapitel 6. Programmierkurs. 6.0 Felder (Arrays) Deklaration von Feldern. Felder (Arrays) Mehrdimensionale Arrays. Birgit Engels, Anna Schulze WS 07/08

Programmierkurs C++ Variablen und Datentypen

Das Typsystem von Scala. L. Piepmeyer: Funktionale Programmierung - Das Typsystem von Scala

4. Vererbung Die Klasse Object. Die Klasse Object

7. Schnittstellen Grundlagen zu Schnittstellen. 7. Schnittstellen

Weitere Beispiele. Beispiel CD-Spieler: Exemplare eines abstrakten Konzepts. 7. Schnittstellen. Schnittstelle: Syntax

JAVA-Datentypen und deren Wertebereich

Grundlagen der Informatik Ergänzungen WS 2007/2008 Prof. Dr. Rainer Lütticke

Einstieg in die Informatik mit Java

Teil 5: Zeiger, Felder, Zeichenketten Gliederung

Ausgabe:

Grundlagen der Objektorientierten Programmierung - Statische Arrays

Algorithmen und Datenstrukturen

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

Einstieg in die Informatik mit Java

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

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

Kapitel 4: Elementare Konzepte von Programmiersprachen. Variablen Referenzen Zuweisungen

C-Programmierung: Ausdrücke und Operatoren#Division.2F

Felder (1) Allgemeines

Wie entwerfe ich ein Programm?

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

Felder - Arrays. Typ feldname[] = new Typ[<ganze Zahl >]; Beispiel: double vektor[] = new double[5]; auch eine Initialisierung ist möglich.

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

Javaprogrammierung mit NetBeans. Variablen, Datentypen, Methoden

GI Vektoren

Modul 122 VBA Scribt.docx

Grundlagen der Programmierung Teil1 Einheit III Okt. 2010

RO-Tutorien 3 / 6 / 12

8. Referenzen und Zeiger

Arrays (Felder/Vektoren)

4.2 Gleitkommazahlen. Der Speicherbedarf (in Bits) ist üblicherweise. In vielen Anwendungen benötigt man gebrochene Werte. Physikalische Größen

Zeiger, Arrays und Strings in C und C++

8 Typwandlungen. 8.1 Automatische Typkonvertierungen

+ C - Array (Vektoren, Felder)

Einstieg in die Informatik mit Java

Prof. Dr. Oliver Haase Karl Martin Kern Achim Bitzer. Programmiertechnik Operatoren, Kommentare, Ein-/Ausgabe

1 Klassen und Objekte

Folienpaket 5 Themenschwerpunkte: Referenztypen: Felder /2016 Dr. Daniel Haase - Vorkurse Informatik V3/V4

Einstieg in die Informatik mit Java

C++ - Objektorientierte Programmierung Konstruktoren und Destruktoren

Informationsverarbeitung im Bauwesen

Datenfelder (Arrays) Vektoren, Matrizen, Tabellen. Dr. Beatrice Amrhein

Tag 4 Repetitorium Informatik (Java)

Grundlagen der Programmierung Teil1 Einheit 1I Okt. 2009

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

3. Java - Sprachkonstrukte I

3. Anweisungen und Kontrollstrukturen

Physische Datenstrukturen

Einfache Rechenstrukturen und Kontrollfluß

Transkript:

1. Felder und Strings Eigenschaften von Referenzdatentypen 1. Referenzdatentypen: Felder und Strings Referenzdatentypen sind Konstrukte, mit deren Hilfe wir aus einfachen Datentypen neue eigene Typen erzeugen können. In Java gibt es prinzipiell zwei Arten von Referenzdatentypen: Felder und Klassen. In diesem Kapitel lernen wir den Umgang mit Feldern und die Benutzung der Klassen String und StringBuffer. Die Nutzung von Klassen ist Thema des nächsten Kapitels. Die Definition eigener Klassen ist Thema des übernächsten Kapitels. 1. Felder und Strings Eigenschaften von Referenzdatentypen Im Unterschied zum einfachen Datentyp wird der Wert 124 der Variablen r nicht als numerischer Wert interpretiert, sondern als Adresse für eine andere Speicherzelle. Dort findet sich der eigentliche Wert bzw. unser eigentliches Objekt. Mit der Literalkonstanten null repräsentieren wir eine Referenz, die auf nichts (in das Nirgendwo) verweist. Wenn die Variable r von einem Referenztyp ist, dann sind r = null;... if ( r == null )... gültige Anweisungen. Grafische Notation für Variablen: b 4711 r Peter Becker, Programiersprache Java FH Bonn-Rhein-Sieg, SS 08 10 Peter Becker, Programiersprache Java FH Bonn-Rhein-Sieg, SS 08 12 1. Felder und Strings Eigenschaften von Referenzdatentypen Referenz- vs. einfache Datentypen 1. Felder und Strings Einfache Datentypen Rückblick: Einfache Datentypen (1) einfacher Datentyp: Eine Speicherzelle, die mit einer Variablen assoziiert ist, enthält den Wert der Variablen (direkter Zugriff). Referenztyp: Eine Speicherzelle, die mit einer Variablen assoziiert ist, enthält eine Referenz (Verweis, Zeiger) auf eine andere Speicherzelle, die den Wert enthält (indirekter Zugriff). symbolische Adresse Adresse im Speicher Inhalt b r............ 96 104 124... 4711......... 124 Ganzzahlige Datentypen long int short byte Repräsentation: Zweierkomplement Gleitkommatypen double float Repräsentation: 32 bzw. 64 Bit im IEEE 754 Standard char Repräsentation: als vorzeichenloser 16-Bit Integerwert boolean Typ int Referenz Peter Becker, Programiersprache Java FH Bonn-Rhein-Sieg, SS 08 11 Peter Becker, Programiersprache Java FH Bonn-Rhein-Sieg, SS 08 13

1. Felder und Strings Einfache Datentypen Rückblick: Einfache Datentypen (2) Zu einem einfachen Datentyp gehört sein Wertebereich, sein lexikalischer Bereich (Literale) und die zur Verfügung stehenden Operationen. 1. Felder und Strings Einfache Datentypen Die folgende Anweisung dagegen liefert einen Fehler beim Compilieren: int i = 3.0; Grund: 3.0 ist eine double-zahl. Bei einer Umwandlung nach int geht eventuell Information verloren. Stattdessen könnten wir eine explizite Typkonvertierung (explicite Typecast) durchführen. Hierzu schreibt man den Zieldatentyp in Klammern vor die entsprechende Zahl oder Ausdruck. (int) 3.14 Hier würde der Compiler die Nachkommastellen abschneiden. Eine Umwandlung von boolean in einen anderen Datentyp ist nicht möglich. Peter Becker, Programiersprache Java FH Bonn-Rhein-Sieg, SS 08 14 Peter Becker, Programiersprache Java FH Bonn-Rhein-Sieg, SS 08 16 1. Felder und Strings Einfache Datentypen Einfache Datentypen: Implizite und explizite Typumwandlung Felder Wir wollen die Addition 92233720366854775000L + 807 durchführen. Der Plus-Operator ist aber nur für Werte des gleichen Typs definiert. Was tun? Der Java-Compiler erkennt, daß der Datentyp zur linken Zahl einen Wertebereich hat, der den der rechten Zahl umfasst. So wird die 807 vom Compiler in eine automatisch long-zahl umgewandelt. implizite Typkonvertierung (implicite typecast) Implizite Typkonvertierungen treten immer dann auf, wenn ein kleinerer Zahlenbereich in einen größeren Zahlenbereich abgebildet wird. byte short int long char int float double Ganzzahlige Datentypen können auch implizit in Gleitkommatypen umgewandelt werden, obwohl dabei Rundungsfehler auftreten können. Felder (Arrays) gestatten es, mehrere Variablen durch einen gemeinsamen Namen anzusprechen und lediglich durch einen Index zu unterscheiden. Alle diese indizierten Variablen haben dabei den gleichen Typ (Komponententyp, Basistyp). Die Variablen selbst werden als Komponenten des Feldes bezeichnet. Der Index zum Ansprechen der Komponenten ist vom Typ int. Hierbei sind nur nichtnegative Werte erlaubt. Wir können uns vorstellen, daß die Komponenten eines Feldes aufeinanderfolgend im Speicher des Rechners abgelegt sind. Der Index für eine Komponente ergibt sich dabei aus der Position innerhalb des Feldes, von Null aufwärts gezählt. Beispiel: Repräsentation eines Vektors des IR n : Feld mit double als Komponententyp Peter Becker, Programiersprache Java FH Bonn-Rhein-Sieg, SS 08 15 Peter Becker, Programiersprache Java FH Bonn-Rhein-Sieg, SS 08 17

Syntax: Beispiele: Deklaration von Feldern Komponententyp[] Variablenname; int[] zahlenfolge; double[] vektor; Die eckigen Klammern machen deutlich, daß die Variable ein Feld referenziert, mit dem Typ links von [] als Komponententyp. Als Komponententyp sind nicht nur einfache Datentypen, sondern auch Referenztypen erlaubt. String[] wortliste; Insbesondere sind auch Feldtypen als Komponententyp erlaubt (hierzu später mehr). Deklaration und Erzeugung können auch zusammen erfolgen. Beispiele: int[] zahlenfolge = new int[20]; double[] vektor = new double[3]; Bitte beachten Sie: Die Größe eines Feldes ist nicht Bestandteil des Typs. Sie wird erst bei der Erzeugung des Feldes festgelegt. Die Feldlänge kann durch einen Ausdruck angegeben werden. Einer Feld-Variable können jederzeit andere Felder gleichen Typs zugewiesen werden. double[] vektor = new double[3]; double[] vektor2 = new double[7]; vektor = new double[3]; vektor = new double[5]; vektor = vektor2; Peter Becker, Programiersprache Java FH Bonn-Rhein-Sieg, SS 08 18 Peter Becker, Programiersprache Java FH Bonn-Rhein-Sieg, SS 08 20 Erzeugung von Feldern Komponentenzugriff und -initialisierung Die Deklaration einer Feld-Variablen erzeugt kein Feld! Nach der Deklaration existiert eine Variable, die eine Referenz auf ein Feld als Wert aufnehmen, kann. Das eigentliche Feld existiert aber noch nicht. Syntax zur Erzeugung von Feldern: Variablenname = new Komponententyp [ Feldlänge ]; Beispiele: zahlenfolge = new int[20]; vektor = new double[3]; double[] vektor = new double[3]; Welchen Wert haben die Feldkomponenten nach der Erzeugung? Dies ist für jeden möglichen Komponententyp festgelegt: ganzzahlige Typen: 0 char: \0 double bzw. float: 0.0 bzw. 0.0f boolean: false Referenztyp: null Peter Becker, Programiersprache Java FH Bonn-Rhein-Sieg, SS 08 19 Peter Becker, Programiersprache Java FH Bonn-Rhein-Sieg, SS 08 21

Syntax für die Wertzuweisung an eine Komponente: Variablenname[Index] = Wert; Beispiel: vektor[0] = 1.0; vektor[1] = 2.0; vektor[2] = -1.0; Index muß ein Ausdruck sein, der einen int-wert liefert. Der Wert für Index muß zwischen 0 und Feldlänge-1 liegen. Wert kann natürlich ein beliebiger Ausdruck passend zum Komponententyp sein. int[] quadratfolge = new int[100]; Statt Erzeugung mit new und anschließender Initialisierung durch Wertzuweisungen ist auch eine verkürzte Schreibweise möglich. Beispiele: int[] lottozahlen = { 6, 11, 19, 21, 30, 40 }; double[] vektor = { 1.0, 2.0, -1.0 }; String[] wortliste = { "ganz", "viele", "Wörter" }; Die geklammerten Ausdrücke heißen Feld-Initialisierer (array initializer). Nur Literale oder Konstanten dürfen als Wert in einem Feld-Initialisierer auftreten. Diese Schreibweise ist nur in Verbindung mit einer Deklaration erlaubt, nicht für eine gewöhnliche Zuweisung. for (int i=0 ; i<100 ; i++ ) quadratfolge[i] = i*i; Peter Becker, Programiersprache Java FH Bonn-Rhein-Sieg, SS 08 22 Peter Becker, Programiersprache Java FH Bonn-Rhein-Sieg, SS 08 24 Syntax für den Zugriff auf den Wert einer Komponente (als Ausdruck): Ermittlung der Länge von Feldern Variablenname[Index] Beispiel: double summe = 0.0; for (int i=0 ; i<3 ; i++ ) { System.out.println( "vektor[" + i + "] = " + vektor[i] ); summe = summe + vektor[i] * vektor[i]; } System.out.println("Laenge des Vektors: " + Math.sqrt( summe )); Bei der Erstellung eines Feldes wird dessen Länge in einem zusätzlichem Element vom Typ int abgespeichert. Auf dieses Element kann mit Variablenname.length zugegriffen werden. Beispiel: double[] vektor = { 1.0, 2.0, -1.0 }; for (int i=0 ; i<vektor.length ; i++ ) System.out.println( "vektor[" + i + "] = " + vektor[i] ); Peter Becker, Programiersprache Java FH Bonn-Rhein-Sieg, SS 08 23 Peter Becker, Programiersprache Java FH Bonn-Rhein-Sieg, SS 08 25

Kopieren und Vergleichen von Referenzen double[] v = { 1.0, 3.0, 5.0, 10.0 }; double[] q = v; for ( int i=0 ; i<q.length ; i++ ) q[i] = q[i]*q[i]; for ( int i=0 ; i<q.length ; i++ ) System.out.println( "Das Quadrat von " + v[i] + " ist " + q[i] ); Was wird ausgegeben und warum? 2. Nutzung der Methode System.arraycopy: System.arraycopy( Quelle, QuelleStartIndex, Ziel, ZielStartIndex, Anzahl ); Hierbei ist: Quelle: Feld, von dem kopiert werden soll QuelleStartIndex: Index, ab der Quelle übertragen werden soll Ziel: Feld, in das kopiert werden soll ZielStartIndex: Index, ab dem die Eintragungen erfolgen sollen Anzahl: Anzahl der zu kopierenden Komponenten 3. Nutzung der vordefinierten Methode clone. Hierzu später mehr. Alle diese Möglichkeiten legen eine sogenannte flache Kopie an. D.h. für die Komponenten selbst wird die übliche Zuweisung durchgeführt. Dies kann problematisch sein, wenn der Komponententyp selbst eine Referenzdatentyp ist (Referenzkopie). Peter Becker, Programiersprache Java FH Bonn-Rhein-Sieg, SS 08 26 Peter Becker, Programiersprache Java FH Bonn-Rhein-Sieg, SS 08 28 Die Zuweisung q = v; führt zu einer sogenannten Referenzkopie. Es wird keine Kopie des Feldes angelegt, sondern q erhält die Referenz, die in v hinterlegt ist. Wirkung: q und v verweisen auf das gleiche Feld. v 1.0 3.0 5.0 10.0 q int[] feld1 = { 1, 2, 3 }; int[] feld2 = { 1, 2, 3 }; Der Ausdruck feld1 == feld2 liefert false! Begründung: Bei Referenzdatentypen bedeutet == nicht, daß die Inhalte der referenzierten Felder (oder Objekte) verglichen werden. Stattdessen wird geprüft, ob die Referenzen die gleiche Speicherstelle adressieren. feld1 1 2 3 Für die Herstellung einer echten Kopie haben wir die folgenden Möglichkeiten: feld2 1 2 3 1. Wir benutzen eine Schleife: double[] v2 = new double[ v.length ]; for ( int i=0 ; i<v.length ; i++ ) v2[i] = v[i]; Wie vergleicht man dann die Inhalte von Feldern? Ausprogrammieren Achtung: Der Komponententyp kann wieder ein Referenztyp sein! Peter Becker, Programiersprache Java FH Bonn-Rhein-Sieg, SS 08 27 Peter Becker, Programiersprache Java FH Bonn-Rhein-Sieg, SS 08 29

1. Felder und Strings Mehrdimensionale Felder Mehrdimensionale Felder Mehrdimensionale Felder sind vom Prinzip her leicht zu definieren: Der Komponententyp ist selbst ein Feld. Beispiele: double[][] matrix; int[][] folgevonfolgen; String[][] listevonstringlisten; Sollen alle inneren Felder die gleiche Länge aufweisen, können wir wiederum den new-operator in einfacher Weise verwenden: matrix = new double[3][4]; folgevonfolgen = new int[3][50]; listevonstringlisten = new String[5][30]; Peter Becker, Programiersprache Java FH Bonn-Rhein-Sieg, SS 08 30 1. Felder und Strings Mehrdimensionale Felder Beispiele für innere und äußere Feldlängen: matrix.length liefert 3. matrix[0].length liefert 4. matrix[2].length liefert ebenfalls 4. Die inneren Felder können eine unterschiedliche Länge aufweisen. int[][] folgevonfolgen = new int[3][]; for ( int i=0 ; i<folgevonfolgen.length ; i++ ) folgevonfolgen[i] = new int[10*(i+1)]; folgevonfolgen.length liefert 3. folgevonfolgen[0].length liefert 10. folgevonfolgen[2].length liefert 30. Peter Becker, Programiersprache Java FH Bonn-Rhein-Sieg, SS 08 31