Literaturverzeichnis [1] JavaTM Language Specification (Originaldokumentation in englisch) http://www.javasoft.com/docs, http://www.javasoft.com/ books/series/Tutorial und http://www.sun.com [2] Java – Einführung, Hubert Partl, Universität für Bodenkultur, Wien, 1998 http://www.boku.ac.at/javaeinf sehr empfehlenswert [3] Einführung in die Programmiersprache Java, Veiko Sinivee, Technische Universität Ilmenau, 19?? http://remus.prakinf.tu-ilmenau.de/wetter/java/vortrag. htm [4] Einführung in Java, Dr. Norman Hendrich, Universität Hamburg, 1998 http://tech-www.informatik.uni-hamburg.de/javakurs Folien 1 Java-Schulung [5] Java 1.1 lernen, Guido Krüger, Auszüge aus einem Buch erschienen bei AddisonWesley, 1997 http://www.gkrueger.com/books/k97b.html http://www.addison-wesley.de/Service/book_onl.html [6] Programmierpraktikum III: Java, Gerald Ehmayer, Siegfried Reich, 1996 http://cobra.ifs.uni-linz.ac.at/java/scriptum/Script_ dpunkt.fmk.html knapp, aber mit vielen Beispielen [7] Thinking in Java, Bruce Eckel, Prentice Hall, 2nd Ed. 1999 http://www.BruceEckel.com sehr umfangreich, setzt etliches an Grundkenntnissen voraus [8] Das Einsteigerseminar: Java, Frank Knobloch, Michael Seeboerger-Weichselbaum, bhv Verlag, 1998 ISBN: 3-89360-925-3 [9] Java 1.1 in 21 Tagen, Laura Lemay, Charles L. Perkins, SAMS, 1997 ISBN: 3-8272-2009-2 c MM Joachim Lammarsch, Rothenberg () 2 Java-Schulung [10] Professionelle Java-Programmierung: Leitfaden für Entwickler, Svend Back et al., Internat. Thomson Publ., 1996 ISBN: 3-8266-0249-8 [11] Die Java Bibel, Aaron Walsh, John Fronckowiak, MITP Verlag, 1998 ISBN: 3-8266-0460-1 sehr umfangreich, für Anfänger nur bedingt geeignet [12] Java professionell, Gerhard Wilhelms, Markus Kopp, MITP Verlag, 1999 ISBN: 3-8266-0395-8 sehr umfangreich, nur für Fortgeschrittene, Beispiele laufen z. T. nicht [13] Java Referenz: Komplette Beschreibung aller Klassen inklusive aller Parameter und Typen, Brian Stark, Franzis-Verlag, 1996 ISBN: 3-7723-4422-4 [14] Java pur: Hintergründe und Entwicklung, Peter van der Linden, Verlag Heinz Heise, 1996 ISBN: 3-88229-086-2 [15] Java an Beispielen: Sprach- und Applet-Struktur, Jerry R. Jackson, Alan L. McClellan, Verlag Heinz Heise, 1996 ISBN: 3-88229-085-4 c MM Joachim Lammarsch, Rothenberg () 3 Java-Schulung Sonstige Informationsquellen News-Gruppen (news groups) • alt.www.hotjava • comp.compiler.tools.javac • comp.lang.java.... bspw. comp.lang.java.tools • de.comp.lang.java deutschsprachig • microsoft.beta.nashville.sdk.java • microsoft.public.java.visualj++ • alt.comp.lang.java-games c MM Joachim Lammarsch, Rothenberg () 4 Java-Schulung WWW-Server • http://java.cs.uni-magdeburg.de/ • http://www.informatik.uni-freiburg.de/Java/ • http://java.seite.net • http://www.gamelan.com • http://www.jars.com • http://www.acc.de/java • http://www.nikos.com/javatoys • http://www.inside-java.com c MM Joachim Lammarsch, Rothenberg () 5 Kapitel 1 Einleitung 1.1 Geschichte • 1991 – Die Firma SUN formiert ein Team unter dem Codenamen Green Project. • Die Aufgabe waren Entwicklungsarbeiten für die Zukunftsmärkte Consumer Electronics und Set-Top-Boxen. • Ziel war es, kleine Programme über TV-Kanäle zu laden, um Fernsehen interaktiv zu gestalten. • Es wurde ein kleines und objektorientiertes System geschaffen, das auf keine HardwarePlattform festgelegt war. 6 Java-Schulung • Während der Entwicklung stellte sich heraus, daß der geplante Markt nicht schnell genug wachsen würde. • Der entwickelte Prototyp fiel in den Bereich der Grundlagenforschung zurück. • Parallel kam es zur Entwicklung von HTML. • SUN erkannte, daß nicht nur einzelne TV-Kanäle, sondern auch das Internet ein optimales Transportmedium für kleine Programme bietet. • Dadurch betrieb das Projekt Green Project keine reine Grundlagenforschung mehr. • Es wurde ein Konzept für eine Sprache entwickelt, die dem aktuellen Stand des heutigen Network-Computing entspricht. • Nach Ankündigung durch SUN Microsystems im Mai 1995 löste Java eine Stimmung wie beim Goldrausch aus. • Heute ist Java nicht nur im klassischen EDV-Sektor und im Internet etabliert, es findet auch immer mehr Anwendung bei den sogenannten kleinen Geräten wie Mobiltelefonen, Pagern, Set-Top-Boxen für Fernsehgeräte und Handheld-Computern. c MM Joachim Lammarsch, Rothenberg (j000010.tex) 7 Java-Schulung 1.2 Was ist Java? • Java bietet als Sprache nichts Neues. • Es verbindet die Vorteile unterschiedlicher Sprachen, wie beispielsweise – C, – C++, – Objective-C und – Smalltalk zu einer einzigen Sprache. • Es verzichtet auf Funktionalität, die nicht benötigt wird. • Java ist plattformunabhängig. • Eine virtuelle Maschine ist die Grundlage für die Plattformunabhängigkeit von JavaApplikationen und Java-Applets. • Die (neue) virtuelle Maschine (VM) HotSpot ist verfügbar und braucht keinen Vergleich zur Performance anderer Programmiersprachen zu scheuen. • Java weist Ausdrücken Speicherplatz explizit zu und nimmt ihn zurück, wenn er nicht mehr benötigt wird (Garbage Collection). c MM Joachim Lammarsch, Rothenberg (j000020.tex) 8 Java-Schulung 1.3 Wie arbeitet Java? • Java ist eine vollständige und objektorientierte Programmiersprache. • Es bietet zwei unterschiedliche Arten, Anwendungen zu erstellen: – Einerseits herkömmliche Applikationen, die über einen Interpreter oder einen Justin-time-Compiler ausgeführt werden. – Andererseits die Entwicklung von Java-Applets, die durch javafähige Webbrowser oder spezielle Applet-Viewer gestartet werden. • Zwei Programme werden im Wesentlichen für Java benötigt: – Ein Compiler für die Übersetzung der Java-Eingabe. – Ein Interpreter, der den erzeugten Code interpretiert und in Maschinenanweisungen umsetzt. • Mit Java läuft ein Programm unter vielen Betriebssystemen, wie beispielsweise Windows 95, Windows NT, OS/2, Macintosh, Solaris, AIX, Linux etc. c MM Joachim Lammarsch, Rothenberg (j000030.tex) 9 Java-Schulung 1.4 Einführungsbeispiel 1 public class beisp01 { public static void main(String args[]) { System.out.println("Viel Erfolg mit Java!"); System.exit(0); } } ergibt als Ausgabe am Bildschirm: Viel Erfolg mit Java! c MM Joachim Lammarsch, Rothenberg (j000040.tex) 10 Java-Schulung public class beisp01 { public static void main(String args[]) { System.out.println("Viel Erfolg mit Java!"); System.exit(0); } } • Ein Java-Programm besteht aus einer Menge von Klassendefinitionen. • Jede Klasse steht in einer separaten Datei. • Der Namen der Datei muß identisch dem Namen der Klasse sein. • Mindestens eine Klasse muss public sein. • Alle zur Klasse gehörenden Attribute und Methoden werden in geschweiften Klammern eingeschlossen. c MM Joachim Lammarsch, Rothenberg (j000040.tex) 11 Java-Schulung public class beisp01 { public static void main(String args[]) { System.out.println("Viel Erfolg mit Java!"); System.exit(0); } } • Um die Klasse durch einen Interpreter ausführen zu können, muß innerhalb dieser Klasse eine Methode der Form public static void main (String argv[]) deklariert werden. • Die zur Methode gehörenden Befehle werden in geschweiften Klammern eingeschlossen. c MM Joachim Lammarsch, Rothenberg (j000040.tex) 12 Java-Schulung public class beisp01 { public static void main(String args[]) { System.out.println("Viel Erfolg mit Java!"); System.exit(0); } } • System.out.println() gibt eine Zeichenkette auf der Standardausgabe aus. • Eine Zeichenkette ist eine Folge von Zeichen, die in Anführungszeichen eingeschlossen ist. • System.exit() beendet das Programm und gibt einen Return code ans Betriebssystem zurück. • Alle Befehle müssen mit einem Semikolon beendet werden. c MM Joachim Lammarsch, Rothenberg (j000040.tex) 13 Java-Schulung 1.5 Einführungsbeispiel 1b public class beisp01b { public static void main(String args[]) { System.out.println("Hallo, \n" + "Viel Erfolg mit Java!"); System.exit(0); } } ergibt als Ausgabe am Bildschirm: Hallo, Viel Erfolg mit Java! c MM Joachim Lammarsch, Rothenberg (j000041.tex) 14 Java-Schulung public class beisp01b { public static void main(String args[]) { System.out.println("Hallo, \n" + "Viel Erfolg mit Java!"); System.exit(0); } } • Die Ausgabe in zwei Zeilen wird durch \n erreicht. • Durch den Befehl + werden zwei Zeichenketten verkettet. c MM Joachim Lammarsch, Rothenberg (j000041.tex) 15 Java-Schulung 1.6 Einführungsbeispiel 1c public class beisp01c { public static void main(String args[]) { System.out.println("********************************\n" "* *\n" "* Hallo, viel Erfolg mit Java! *\n" "* *\n" "********************************"); System.exit(0); } } c MM Joachim Lammarsch, Rothenberg (j000042.tex) + + + + 16 Java-Schulung ergibt als Ausgabe am Bildschirm: ******************************** * * * Hallo, viel Erfolg mit Java! * * * ******************************** • Leerzeichen innerhalb von Zeichenketten sind signifikant und werden genauso in die Ausgabe übernommen. • Leerzeichen innerhalb des Programm-Codes werden nicht übernommen. c MM Joachim Lammarsch, Rothenberg (j000042.tex) 17 Java-Schulung 1.7 Der Zeichensatz Für ein Zeichen werden zwei Bytes im Speicher belegt. Es gibt folgende Zeichen: 1. Klein- und Großbuchstaben: a b c . . . z und A B C . . . Z 2. Alle Zeichen oberhalb hexadezimal 00C0 werden ebenfalls als Buchstaben akzeptiert (Unicode-Zeichensatz). 3. Ziffern: 0 1 2 ... 9 4. Unterstreichungsstrich: _ (für Variablennamen) 5. „Backslash“: \ (Fluchtsymbol, Maskierungszeichen) 6. Sonderzeichen: []{}()<>!%ˆ&*+−=:;,."?|~ c MM Joachim Lammarsch, Rothenberg (j000050.tex) 18 Java-Schulung 1.8 Besondere Zeichen- und Zeichenkettenobjekte Besondere Zeichen- und Zeichenkettenobjekte werden auch als „escape character“ bezeichnet. Bedeutung Neue Zeile Tabulator Löschtaste Zeilenvorschub Seitenvorschub Maskierungszeichen Hochkomma (einfach) Anführungszeichen Oktal Hexadezimal Unicode c MM Wert NL HT BS CR FF \ ’ " 0ddd 0xdd Darstellung \n \t \b \r \f \\ \’ \" \[0-7][0-7][0-7] \x[0-9,A-F][0-9,A-F] \x[0-9,a-f][0-9,a-f] 0xdddd \u[0-9,A-F][0-9,A-F][0-9,A-F][0-9,A-F] \u[0-9a-f][0-9a-f][0-9a-f][0-9a-f] Joachim Lammarsch, Rothenberg (j000051.tex) 19 Java-Schulung 1.9 Einführungsbeispiel 2 /* Länge des Marathonlaufs in Kilometer */ public class beisp02 { public static void main(String args[]) { int meilen,yards; double kilometer; meilen=26; yards=385; kilometer=1.609*(meilen+yards/1760.0); System.out.print("Die Länge des Marathonlaufs beträgt "); System.out.print(kilometer); System.out.println(" km."); System.exit(0); } } c MM Joachim Lammarsch, Rothenberg (j000060.tex) 20 Java-Schulung ergibt als Ausgabe am Bildschirm: Die Länge des Marathonlaufs beträgt 42.18596875 km. c MM Joachim Lammarsch, Rothenberg (j000060.tex) 21 Java-Schulung /* Länge des Marathonlaufs in Kilometer */ public class beisp02 { public static void main(String args[]) { int meilen,yards; double kilometer; ... • Ein Blockkommentar wird durch die Zeichen /* und */ begrenzt. • Durch den Befehl int werden die Variablen meilen und yards für ganze Zahlen deklariert. • Durch den Befehl double wird die Variable kilometer für eine Gleitkommazahl (Gleitpunktzahl) deklariert. c MM Joachim Lammarsch, Rothenberg (j000060.tex) 22 Java-Schulung ... meilen=26; yards=385; kilometer=1.609*(meilen+yards/1760.0); ... • Das Gleichheitszeichen ist der Zuweisungsoperator. Den Variablen auf der linken Seite wird die Konstante auf der rechten Seite zugewiesen. • Der arithmetische Ausdruck auf der rechten Seite des Zuweisungsoperators wird bestimmt und der Variablen auf der linken Seite zugewiesen. • Die Operatoren *, +, / stehen für Multiplikation, Addition und Division. • In runden Klammern eingeschlossene Operationen werden zuerst ausgeführt; es gelten die üblichen Rechenregeln der Mathematik (Punkt vor Strich). c MM Joachim Lammarsch, Rothenberg (j000060.tex) 23 Java-Schulung ... System.out.print("Die Länge des Marathonlaufs beträgt "); System.out.print(kilometer); System.out.println(" km."); System.exit(0); } } ... • System.out.print("Die Länge...") gibt die Zeichenkette auf der Standardausgabe ohne Zeilenvorschub aus. • System.out.print(kilometer) gibt ebenso die Gleitkommazahl auf der Standardausgabe ohne Zeilenvorschub aus. • System.out.println(" km.") gibt wiederum die Zeichenkette auf der Standardausgabe dieses Mal mit Zeilenvorschub aus. • Leerzeichen werden nicht automatisch eingefügt. c MM Joachim Lammarsch, Rothenberg (j000060.tex) 24 Java-Schulung 1.10 Einführungsbeispiel 2b /* Länge des Marathonlaufs in Kilometer */ public class beisp02b { public static void main(String args[]) { int meilen,yards; double kilometer; meilen=26; yards=385; kilometer=1.609*(meilen+yards/1760.0); System.out.println("Die Länge des Marathonlaufs " + "beträgt " + kilometer + " km."); System.exit(0); } } c MM Joachim Lammarsch, Rothenberg (j000062.tex) 25 Java-Schulung ergibt als Ausgabe am Bildschirm: Die Länge des Marathonlaufs beträgt 42.18596875 km. c MM Joachim Lammarsch, Rothenberg (j000062.tex) 26 Java-Schulung ... System.out.println("Die Länge des Marathonlaufs " + "beträgt " + kilometer + " km."); System.exit(0); } } ... • System.out.println() gibt eine einzige Zeichenkette auf der Standardausgabe mit Zeilenvorschub aus. • Mehrere Zeichenketten können mit + hintereinander gehängt werden – das Plus-Zeichen hat hier eine andere Bedeutung als Addieren. • Der Wert der Variablen kilometer wird von Java automatisch in eine Zeichenkette umgewandelt. c MM Joachim Lammarsch, Rothenberg (j000062.tex) 27 Java-Schulung 1.11 Bearbeitung eines Java-Programms Editieren edit/vi dateiname.java Eingabe ? JAVA -C OMPILER Compilieren javac dateiname.java ? Klasse dateiname.class Klasse ? JAVA -I NTERPRETER Byte-Code ausführen java dateiname ? Ausgabe c MM Joachim Lammarsch, Rothenberg (jcompile.tex) 28 Teil I Prozedurale Programmierung mit Java 29 Kapitel 2 Bezeichner, Variablen, Kommentare 2.1 Bezeichner Bezeichner (d. h. Namen) für Variablen, Methoden und Klassen sind in ihrem Aufbau an die Programmiersprachen C und C++ angelehnt. Erlaubt sind • Groß- und Kleinbuchstaben, • Ziffern (0, 1, 2, 3, 4, 5, 6, 7, 8, 9), • Unterstreichungsstrich (_), • Dollar-Zeichen ($) und 30 Java-Schulung • alle Zeichen des Unicode-Zeichensatzes oberhalb 00C0 als Bestandteile von Bezeichnern. Das erste Zeichen darf keine Ziffer sein und das DollarZeichen ($) darf nur am Anfang stehen. c MM Joachim Lammarsch, Rothenberg (jcompile.tex) 31 Java-Schulung 2.2 Variablen Variablen werden deklariert, indem man ihren Datentyp und ihren Namen angibt: Syntax: datentyp variablenname bzw. datentyp variablenname_1, variablenname_2, ... Beispiel: int var_1; int var_2, var_3; double var_4; • Die Deklaration ist an unterschiedlichen Stellen im Programm möglich. Sie wird jedoch in der Regel zu Beginn eines Blocks vorgenommen. • Die Reichweite einer Variablen beginnt bei ihrer Deklaration und endet am Ende des Blocks, in dem sie deklariert wurde. c MM Joachim Lammarsch, Rothenberg (jcompile.tex) 32 Java-Schulung 2.2.1 Initialisierung von Variablen Eine Variable kann bei ihrer Deklaration direkt mit einem Wert initialisiert werden. Beispiel: int i=17; double d=3.14159; c MM Joachim Lammarsch, Rothenberg (j000082.tex) 33 Java-Schulung 2.2.2 Schlüsselworte Java definiert eine Reihe von Schlüsselworten, die man nicht als eigene Variablennamen verwenden darf: abstract boolean cast catch default do final finally goto if int interface operator outer rest return synchronized this true try c MM Joachim Lammarsch, Rothenberg (j000082.tex) break char double float implements long package short threadsafe var byte byvalue class const else extends for future import inner native new private protected static super throw throws void volatile case continue false generic instanceof null public switch transient while 34 Java-Schulung 2.3 Kommentare Kommentare dienen der besseren Übersichtlichkeit und bieten eine gewisse Sicherheit dafür, daß der Programmquellcode auch nach längerer Zeit vom Programmierer verstanden werden kann. Java bietet drei Alternativen Kommentare zu erstellen: • Zeilenkommentare, • Blockkommentare, • HTML-Kommentare, die in die Dokumentation, die mit dem Kommando javadoc generiert wird, übernommen werden sollen. c MM Joachim Lammarsch, Rothenberg (j000084.tex) 35 Java-Schulung 2.3.1 Zeilenkommentare Zeilenkommentare erlauben die Eingabe eines Kommentars bis an das Zeilenende. Der Kommentar wird durch den Befehl // eingeleitet, das Ende ist das Zeilenende. Zeilenkommentare sind hilfreich, wenn lediglich kurze Anmerkungen zum Programmcode gemacht werden sollen. Beispiel: // Länge eines Marathonlaufs in Kilometer ... c MM Joachim Lammarsch, Rothenberg (j000084.tex) 36 Java-Schulung 2.3.2 Blockkommentare Diese Variante ist der Programmiersprache C entliehen. Die Kommentare können beliebig lang sein. Der Kommentar wird durch die Befehle /* und */ eingeschlossen. Nach Beginn des Kommentars durch /* kann jedes beliebige Zeichen folgen. Nur das Zeichen * bildet eine Ausnahme (siehe dazu HTML-Kommentare). Der Kommentar endet erst wieder mit der Zeichenfolge */. Kommentare dieser Form dürfen keine Kommentare der gleichen Form enthalten, während andere Kommentarzeichen nicht als solche behandelt werden. Beispiel: /* Ziel dieses Kommentars ist es, die Anwendung eines Blockkommentars zu demonstrieren. */ ... c MM Joachim Lammarsch, Rothenberg (j000084.tex) 37 Java-Schulung 2.3.3 HTML-Kommentare Das Verbot des Zeichens * nach dem Einleiten des Kommentars hat eine besondere Bedeutung. Hierdurch wird eine Art von Kommentar eingeleitet, der zur Generierung einer automatischen Dokumentation mittels javadoc verwendet wird. javadoc überprüft den Quellcode auf das Vorhandensein des Dokumentationskommentars (/**) und generiert daraus eine Dokumentation im HTML-Format. public class test6 { /** Dieser Kommentar ist für die HTML-Dokumentation. Ziel ist die Darstellung eines HTML-Kommentars. */ public static void main(String args[]) { } } c MM Joachim Lammarsch, Rothenberg (j000084.tex) 38 Java-Schulung Class test6 java.lang.Object | +----test6 public class test6 extends Object Constructor Index o test6() Method Index o main(String[]) Dieser Kommentar ist fuer die HTML-Dokumention. Constructors o test6 public test6() Methods o main public static void main(String args[]) Dieser Kommentar ist fuer die HTML-Dokumention. Ziel ist die Darstellung eines HTML-Kommentars. c MM Joachim Lammarsch, Rothenberg (j000084.tex) 39 Kapitel 3 Datentypen und Konstanten 3.1 Datentypen In Java unterscheidet man einfache und zusammengesetzte Datentypen. Einfache Datentypen sind Zahlen, Zeichen, Wahrheitswerte – zusammengesetzte sind Zeichenketten, Felder, Klassen. Die verschiedenen Datentypen benötigen unterschiedlichen Speicherplatz. Die Datentypen sind denen von C und C++ sehr ähnlich, es gibt aber einige wichtige Unterschiede: • alle Datentypen sind auf jedem Computer von konstanter Größe, • alle numerischen Variablen sind vorzeichenbehaftet, • beliebige automatische Typumwandlungen sind nicht möglich. 40 Java-Schulung 3.1.1 Ganze Zahlen 1. byte Größe: 8 bit (1 Byte), Bereich: −128 bis 127 2. short Größe: 16 bit (2 Byte), Bereich: −32 768 bis 32 767 3. int Größe: 32 bit (4 Byte), Bereich: −2 147 483 648 bis 2 147 483 647 4. long Größe: 64 bit (8 Byte), Bereich: −9 223 372 036 854 775 808 bis 9 223 372 036 854 775 807 c MM Joachim Lammarsch, Rothenberg (j000070.tex) 41 Java-Schulung Den Zahlenbereich erhält man, wenn man die Werte der Konstanten ausgibt: Byte.MIN_VALUE Byte.MAX_VALUE Short.MIN_VALUE Short.MAX_VALUE Integer.MIN_VALUE Integer.MAX_VALUE Long.MIN_VALUE Long.MAX_VALUE c MM Joachim Lammarsch, Rothenberg (j000070.tex) 42 Java-Schulung Beispiel: public class Lim_gz { public static void main(String args[]) { System.out.println(Byte.MIN_VALUE + ", " + Byte.MAX_VALUE); System.out.println(Short.MIN_VALUE + ", " + Short.MAX_VALUE); System.out.println(Integer.MIN_VALUE + ", " + Integer.MAX_VALUE); System.out.println(Long.MIN_VALUE + ", " + Long.MAX_VALUE); System.exit(0); } } c MM Joachim Lammarsch, Rothenberg (j000070.tex) 43 Java-Schulung Als Ausgabe erhält man: -128, 127 -32768, 32767 -2147483648, 2147483647 -9223372036854775808, 9223372036854775807 c MM Joachim Lammarsch, Rothenberg (j000070.tex) 44 Java-Schulung Ganze Zahlen sind exakt und intern im binären Datenformat gespeichert. Beispiel: public class Conv001 { public static void main(String args[]) { int i = 1234; System.out.println("Dezimal: " + i); System.out.println("Binär: " + Integer.toBinaryString(i)); System.out.println("Oktal: " + Integer.toOctalString(i)); System.out.println("Hexadezimal: " + Integer.toHexString(i)); System.exit(0); } } c MM Joachim Lammarsch, Rothenberg (j000070.tex) 45 Java-Schulung Als Ausgabe erhält man: Dezimal: Binär: Oktal: Hexadezimal: c MM 1234 10011010010 2322 4d2 Joachim Lammarsch, Rothenberg (j000070.tex) 46 Java-Schulung 3.1.2 Gleitkomma-Zahlen (Gleitpunkt-Zahlen) 1. float Größe: 32 bit (4 Byte) Bereich: 1, 4 · 10−45 bis 3, 4 · 1038 Genauigkeit: 6 Dezimalstellen 2. double Größe: 64 bit (8 Byte), Bereich: 4, 9 · 10−324 bis 1.7 · 10308 Genauigkeit: 15 Dezimalstellen • Gleitkommazahlen sind in der Regel mit Darstellungsfehlern behaftet. • Beim Rechnen mit Gleitkommazahlen ergeben sich Rundungsfehler. • Gleitkommazahlen werden im Standard IEEE 754-Format im Rechner gespeichert. Den Zahlenbereich erhält man, wenn man die Werte der Konstanten ausgibt: Float.MIN_VALUE Float.MAX_VALUE Double.MIN_VALUE Double.MAX_VALUE c MM Joachim Lammarsch, Rothenberg (j000070.tex) 47 Java-Schulung Beispiel: public class Lim_gl { public static void main(String args[]) { System.out.println(Float.MIN_VALUE + ", " + Float.MAX_VALUE); System.out.println(Double.MIN_VALUE + ", " + Double.MAX_VALUE); System.exit(0); } } Als Ausgabe erhält man: 1.4E-45, 3.4028235E38 4.9E-324, 1.7976931348623157E308 c MM Joachim Lammarsch, Rothenberg (j000070.tex) 48 Java-Schulung 3.1.3 Boolsche Zahlen boolean Größe: 8 bit (1 Byte), Bereich: true und false Es werden ihnen keine Zahlen zugeordnet, wie beispielsweise Null (0) für false oder „jeder Wert ungleich Null“ für true. Sie können auch nicht in andere Datentypen umgewandelt werden. 3.1.4 Zeichen char Größe: 16 bit (2 Byte), Java verwendet den Unicode zur Zeichendarstellung (http://unicode.com). c MM Joachim Lammarsch, Rothenberg (j000070.tex) 49 Java-Schulung 3.2 Datentyp-Umwandlungen Typ-Umwandlungen wandeln einen Datentyp in einen anderen um. Diesen Vorgang bezeichnet man als Casting. Syntax: (datentyp) ausdruck Beispiel: int a=1, b=2; float f; f = (float) a / (float) b; Außer dem expliziten Casting gibt es noch das implizite Casting, bei dem der Compiler selbst den Datentyp konvertiert. Auch hierbei kann es zu unerwünschten Seiteneffekten kommen. Java ist restriktiv in bezug auf die Konvertierung von Werten eines Datentyps in einen anderen. c MM Joachim Lammarsch, Rothenberg (j000096.tex) 50 Java-Schulung 3.2.1 Aufwand für Konvertierungen Datentyp byte short von char int long float double byte 0 A B C D G H short 1 0 A B C F G nach char int 2 3 A 1 0 1 A 0 B A E D F E long 4 2 2 1 0 C D float 7 5 5 4 3 0 A double 8 6 6 5 4 1 0 • Bei den Kombinationen, die durch Buchstaben gekennzeichnet sind, geht bei der Konvertierung Information verloren. Diese Konvertierungen müssen mit dem cast-Operator erzwungen werden. • Bei der Konvertierung wird immer die Kombination gewählt, die den geringsten Aufwand erfordert. c MM Joachim Lammarsch, Rothenberg (j000096.tex) 51 Java-Schulung Beispiel: public class cast01 { public static void main(String args[]) { int i=1,j=2; System.out.println(1/2 + " " + 1./2.); System.out.println(i/j + " " + (float)i/(float)j); System.out.println((float)1/(float)2); System.exit(0); } } Als Ausgabe erhält man: 0 0.5 0 0.5 0.5 c MM Joachim Lammarsch, Rothenberg (j000096.tex) 52 Java-Schulung 3.3 Literale Literale (Konstanten) dienen zum Bezeichnen einfacher Werte in einem Java-Programm. Obwohl sie meist selbsterklärend sind, gibt es innerhalb von Java einige Besonderheiten für die unterschiedlichen Arten von • Ganzzahligen Konstanten, • Gleitkomma-Konstanten, • Zeichen-Konstanten, • Zeichenketten-Konstanten, • Boolschen Konstanten. c MM Joachim Lammarsch, Rothenberg (j000072.tex) 53 Java-Schulung 3.3.1 Ganzzahlige Konstanten • Sie sind standardmäßig vom Datentyp int. • Eine Konstante wird automatisch zum Datentyp long, wenn sie für den Datentyp int zu groß ist. • Den Datentyp long kann man immer erhalten, wenn man an die Zahl ein L oder l anhängt. • Ganzzahlige Konstanten kann man auch oktal bzw. hexadezimal ausdrücken. Eine führende 0 zeigt an, daß eine Zahl oktal ist. Ein vorangestelltes 0x oder 0X bedeutet, daß es sich um eine Hexadezimalzahl handelt. Beispiel: 1234 5000000000 1234L 0777 0xAD3F c MM Joachim Lammarsch, Rothenberg // // // // // (j000072.tex) int long long oktal hexadezimal 54 Java-Schulung 3.3.2 Gleitkomma-Konstanten • Als Gleitkomma-Konstanten werden, – dem Standard IEEE 754 gemäß – Werte mit einfacher (float) und doppelter Genauigkeit (double) angeboten. • Sie sind standardmäßig vom Datentyp double. • Gleitkommazahlen können mit einem Suffix f bzw. F für float und d bzw. D für double gekennzeichnet werden. • Es existiert der Wert -0.0 (negative Null), der entweder durch Initialisierung oder durch besondere Umstände erreicht werden kann. Multiplikation und Division durch -0.0 ergeben wieder -0.0. Bei anderen Operationen verhält sich -0.0 wie 0.0 Beispiel: 1234.45 1234.45f 1234.45d 1234.45E-67 c MM Joachim Lammarsch, Rothenberg // // // // (j000072.tex) doppelt genau einfach genau doppelt genau mit Exponent 55 Java-Schulung 3.3.3 Zeichen-Konstanten • Zeichen-Konstanten sind einzelne Zeichen, die in einfache Hochkommata eingeschlossen werden. • Sie sind standardmäßig vom Datentype char. • Java verwendet Unicode zur Zeichendarstellung. Beispiel: ’a’ ’ ’ ’0’ c MM Joachim Lammarsch, Rothenberg // Ein Zeichen // Ein Leerzeichen // Das Zeichen Null (j000072.tex) 56 Java-Schulung 3.3.4 Zeichenketten-Konstanten • Mehrere Zeichen zusammen bilden eine Zeichenkette. • Sie werden in doppelte Hochkommata eingeschlossen. • Sie können Konstanten wie neue Zeile, Tabulator- und Unicode-Zeichen enthalten. Beispiel: "Ich bin eine Zeichenkette." "" "\n" c MM Joachim Lammarsch, Rothenberg (j000072.tex) // Zeichenkette // Leere Zeichenkette // Neue Zeile 57 Java-Schulung 3.3.5 Boolsche Konstanten • Boolsche Konstanten sind true und false. • Sie werden bei den Operatoren – Gleichheit und Ungleichheit sowie bei – Konjunktion, Disjunktion und Negation verwendet • Sie sind die einzig möglichen Werte für boolsche Variablen. Beispiel: true false c MM Joachim Lammarsch, Rothenberg // wahr // falsch (j000072.tex) 58 Java-Schulung 3.4 Parameter bei main Um auf die Parameter der Methode main() zuzugreifen, muß man den Namen args verwenden. Es ist bei jeder Methode main deklariert. Im Gegensatz zu C/C++ ist args[0] nicht der Programmname, sondern der erste Parameter. • Den ersten Parameter erhält man durch args[0], • den zweiten Parameter durch args[1]. • ... Beispiel: public class bspargs_a { public static void main(String args[]) { System.out.println("1. Parameter: " + args[0]); System.out.println("2. Parameter: " + args[1]); System.exit(0); } } c MM Joachim Lammarsch, Rothenberg (j000140.tex) 59 Java-Schulung ergibt bei dem Aufruf java bspargs_a 1.1111 2.2222 als Ausgabe am Bildschirm: 1. Parameter: 2. Parameter: 1.1111 2.2222 3.4.1 Konvertierung der Zeichenketten args[n] Der Wert, den man durch args[n] erhält, ist eine Zeichenkette, die zur weiteren arithmetischen Bearbeitung in einen geeigneten Datentyp konvertiert werden muß. Hierfür gibt es eigene Methoden wie beispielsweise: byte short int long float double char c MM Byte.valueOf(args[n]).byteValue() Short.valueOf(args[n]).shortValue() Integer.valueOf(args[n]).intValue() Long.valueOf(args[n]).longValue() Float.valueOf(args[n]).floatValue() Double.valueOf(args[n]).doubleValue() args[n].charAt(0) Joachim Lammarsch, Rothenberg (j000140.tex) 60 Java-Schulung Beispiel: public class bspargs_c { public static void main(String args[]) { int v1, v2; v1 = Integer.valueOf(args[0]).intValue(); v2 = Integer.valueOf(args[1]).intValue(); System.out.println(v1+v2); System.exit(0); } } ergibt bei dem Aufruf java bspargs_c 1 2 als Ausgabe am Bildschirm: 3 c MM Joachim Lammarsch, Rothenberg (j000140.tex) 61 Java-Schulung Beispiel: public class bspargs_b { public static void main(String args[]) { double v1, v2; v1 = Double.valueOf(args[0]).doubleValue(); v2 = Double.valueOf(args[1]).doubleValue(); System.out.println(v1+v2); System.exit(0); } } ergibt bei dem Aufruf java bspargs_b 1.1111 2.2222 als Ausgabe am Bildschirm: 3.3333 c MM Joachim Lammarsch, Rothenberg (j000140.tex) 62 Kapitel 4 Operatoren 4.1 Zuweisungsoperator (=) Syntax: variable = ausdruck • Der Variablen auf der linken Seite des Zuweisungsoperators wird der Wert zugewiesen, den der Ausdruck auf der rechten Seite liefert. • Der Ausdruck wird vollständig ausgewertet, bevor die Zuweisung durchgeführt wird. 63 Java-Schulung Beispiel: x = a + b; y = y + 25; z = 2 * (a + b); • Da ein Zuweisungsoperator einen Wert ergibt, kann man Zuweisungsoperatoren verketten. Beispiel: x = y = z = 100; • Der Zuweisungsoperator ist kein mathematisches Gleichheitszeichen. c MM Joachim Lammarsch, Rothenberg (j000100.tex) 64 Java-Schulung 4.2 Arithmetische Operatoren Java besitzt fünf Operatoren für die Arithmetik: + * / % Addition Subtraktion Multiplikation Division Modulus 3 9 7 9 9 + * / % 4 6 8 2 4 • Jeder Operator besitzt zwei Operanden, je einen auf jeder Seite des Operators. • Der Subtraktionsoperator kann auch zum Negieren eines einzelnen Operanden benutzt werden. • Die Division einer ganzen Zahl durch eine ganze Zahl ergibt wiederum eine ganze Zahl. • Der Modulus gibt den Divisionsrest einer ganzzahligen Division. Beispielsweise ergibt 33 % 9 die Zahl 6, da 9 in 33 dreimal enthalten ist und den Rest 6 ergibt. c MM Joachim Lammarsch, Rothenberg (j000110.tex) 65 Java-Schulung Beispiel: public class beisp04 { public static void main(String args[]) { int var_1=50, var_2=20, var_3, var_4, var_5, var_6; var_3 = var_1 + var_2; var_4 = var_1 - var_2; var_5 = var_1 * var_2; var_6 = var_1 / var_2; System.out.println(var_3 + " " + var_4 + " " + var_5 + " " + var_6); System.exit(0); } } Als Ausgabe erhält man: 70 30 1000 2 c MM Joachim Lammarsch, Rothenberg (j000110.tex) 66 Java-Schulung • Alle arithmetischen ganzzahligen Operationen werden mit 32 Bit Genauigkeit ausgeführt, im Falle langer ganzen Zahlen long mit 64 Bit. • Möchte man ein ganzzahliges 32- oder 64-Bit-Ergebnis in eine kleinere Variable abspeichern, muß es in den entsprechenden Datentyp konvertiert werden. • byte- und short-Zuweisungen müssen immer angepaßt werden, wenn sie das Ergebnis einer arithmetischen Operation sind. Beispiel: byte a, b=2, c=100; a = (byte) (b + c); • Ist das Ergebnis zu groß, werden nur die niederwertigen Bits gespeichert, d. h. die Ganzzahl-Arithmetik ist in Wirklichkeit eine Modulo-2n -Arithmetik. • Ein Fehler wird nur bei Division durch Null angezeigt. c MM Joachim Lammarsch, Rothenberg (j000110.tex) 67 Java-Schulung 4.2.1 Arithmetik von Gleitkommazahlen • Die Operationen sind Addition, Subtraktion, Multiplikation und Division. • Eine Division durch Null ergibt keinen Fehler. Beispiel: public class beisp03 { public static void main(String args[]) { float a=3.14F, b=0.0F, c=-3.14F; System.out.println(a/b); System.out.println(b/b); System.out.println(c/b); } } Als Ausgabe erhält man: Infinity NaN -Infinity c MM Joachim Lammarsch, Rothenberg (j000110.tex) 68 Java-Schulung 4.2.2 Verkürzte Schreibweisen Java unterstützt ebenfalls die Kurzschreibweise arithmetischer Ausdrücke. Da relativ oft die Form operand1 = operand1 operator operand2 auftritt, wird vorzugsweise die verkürzte Schreibweise operand1 operator = operand2 eingesetzt. Angewendet wird diese Schreibweise bei folgenden Operatoren: Symbol + * / % c MM Operation Addition Subtraktion Multiplikation Division Modulus Joachim Lammarsch, Rothenberg (j000120.tex) Kurzform n += 10 n -= 10 n *= 10 n /= 10 n %= 10 n n n n n Langform = n + 10 = n - 10 = n * 10 = n / 10 = n % 10 69 Java-Schulung 4.2.3 Inkrement- und Dekrement-Operatoren Java unterstützt wie C bzw. C++ die Inkrementierung und Dekrementierung von Variablen. Da relativ oft die Form operand = operand + 1; bzw. operand = operand - 1; auftritt, wird die verkürzte Schreibweise operand ++; oder ++ operand; operand --; oder -- operand; bzw. benutzt. • Diese Operatoren können auch bei Gleitkommazahlen verwendet werden. • Die Operatoren können vorangestellt oder auch angefügt werden, wenn es sich um einfache Inkrement- oder Dekrement-Operationen handelt. • In Kombination mit anderen Operationen ergibt sich allerdings bei der Auswertung ein Unterschied. c MM Joachim Lammarsch, Rothenberg (j000120.tex) 70 Java-Schulung 4.2.4 Prefix- und Postfix-Operatoren Wird der Befehl ++ bzw. -- vorangestellt, wird zuerst diese Operation ausgeführt, anschließend die andere Operation. Wird der Befehl ++ bzw. -- nachgestellt, wird zuerst die andere Operation ausgeführt, anschließend das Inkrement bzw. Dekrement. Beispiel: x=++i; y=--j; wird wie folgt ausgeführt: i=i+1; x=i; j=j-1; y=j; Beispiel: x=i++; y=j--; wird wie folgt ausgeführt: x=i; i=i+1; c MM Joachim Lammarsch, Rothenberg y=j; j=j-1; (j000120.tex) 71 Java-Schulung Beispiel: public class oper01 { public static void main(String args[]) { int var_1=10, var_2=20; float var_3=5.4321F, var_4=1.2345F; var_1 *= var_2; System.out.println("var_1: var_2++; System.out.println("var_2: var_3--; System.out.println("var_3: var_3 = ++var_4; System.out.println("var_4: " + var_1); " + var_2); " + var_3); " + var_4); System.exit(0); } } c MM Joachim Lammarsch, Rothenberg (j000120.tex) 72 Java-Schulung Als Ausgabe erhält man: var_1: var_2: var_3: var_4: c MM 200 21 4.4321 2.2345 Joachim Lammarsch, Rothenberg (j000120.tex) 73 Java-Schulung 4.3 Vergleichsoperatoren • Java stellt mehrere Ausdrücke zum Testen von Gleichheit und Größe zur Verfügung • Alle diese Ausdrücke geben einen boolschen Wert (true oder false) zurück. • Die Vergleichsoperatoren sind: Operator == != < > <= >= 4.4 Bedeutung Gleich Ungleich Kleiner als Größer als Kleiner als oder gleich Größer als oder gleich Beispiel a == 10 a != 10 a < 10 a > 10 a <= 10 a >= 10 Logische Operatoren • Boolsche Ausdrücke können entweder wahr (true) oder falsch (false) sein. • Sie sind keine Zahlen und man darf ihnen auch keine Zahlen zuweisen. • Die logischen Operatoren sind: c MM Joachim Lammarsch, Rothenberg (j000150.tex) 74 Java-Schulung Operator && || ! & | ^ Bedeutung Und Oder Negation logisches Und logisches Oder logisches Exklusiv-Oder • Für Und-Verknüpfungen wird && und & verwendet. Mit & werden beide Seiten des Ausdrucks ungeachtet des Ergebnisses ausgewertet. Mit && wird der ganze Ausdruck als falsch angenommen, wenn die linke Seite falsch ist. • Für Oder-Verknüpfungen wird || und | verwendet. Mit | werden beide Seiten des Ausdrucks ungeachtet des Ergebnisses ausgewertet. Mit || wird der ganze Ausdruck als wahr angenommen, wenn die linke Seite wahr ist. c MM Joachim Lammarsch, Rothenberg (j000150.tex) 75 Java-Schulung 4.4.1 Wahrheitstafeln 4.4.1.1 Und-Operator (&& und &) Operand 1 wahr wahr falsch falsch Operand 2 wahr falsch wahr falsch Ergebnis wahr falsch falsch falsch • Der Ausdruck ist nur dann wahr, wenn beide Operanden auf beiden Seiten des Operators wahr sind. • Ist ein Operand falsch, ist der gesamte Ausdruck falsch. c MM Joachim Lammarsch, Rothenberg (j000150.tex) 76 Java-Schulung 4.4.1.2 Oder-Operator (|| und |) Operand 1 wahr wahr falsch falsch Operand 2 wahr falsch wahr falsch Ergebnis wahr wahr wahr falsch • Der Ausdruck ist nur dann falsch, wenn beide Operanden auf beiden Seiten des Operators falsch sind. • Ist ein Operand wahr, ist der gesammte Ausdruck wahr. 4.4.1.3 Nicht-Operator (!) Operand wahr falsch Ergebnis falsch wahr • Ist der Operand wahr, ist der Ausdruck falsch, und umgekehrt. c MM Joachim Lammarsch, Rothenberg (j000150.tex) 77 Java-Schulung 4.4.1.4 Exklusiv-Oder-Operator (ˆ) Operand 1 wahr wahr falsch falsch Operand 2 wahr falsch wahr falsch Ergebnis falsch wahr wahr falsch • Der Ausdruck ist nur dann wahr, wenn beide Operanden unterschiedlich sind (einer ist wahr und der andere ist falsch). • Sind beide Operanden gleich (beide sind wahr oder beide sind falsch), ist der Ausdruck falsch. Im allgemeinen werden nur && und || häufig als logische Operatoren benutzt, & und | werden normalerweise für bitweise logische Operationen verwendet. c MM Joachim Lammarsch, Rothenberg (j000150.tex) 78 Java-Schulung 4.4.2 Bitweise Operatoren Es gibt drei Gruppen von Operatoren zur Verarbeitung von Bits: 1. die Verschiebungsoperatoren, 2. der Negationsoperator, 3. die binären Operatoren. • Bei allen Operatoren müssen die Bitfolgen einen ganzahligen Typ besitzen. • Gleitkommawerte können nicht angesprochen werden. • Die Operatoren wurden von C/C++ übernommen. c MM Joachim Lammarsch, Rothenberg (j000150.tex) 79 Java-Schulung 4.4.2.1 Die Verschiebungsoperatoren Operator << >> >>> Bedeutung Verschiebung nach links Verschiebung nach rechts Verschiebung nach rechts mit Füllnullen • Bei der Verschiebung mit << nach links werden die freien Stellen rechts mit Nullen aufgefüllt. (Bem.: i<<1 entspricht der Multiplikation mit 2, i<<2 entspricht der Multiplikation mit 4, usw.) • Bei der Verschiebung mit >> nach rechts wird von links mit Vorzeichenbits aufgefüllt. (Bem.: i>>1 entspricht der Division durch 2, i>>2 entspricht der Division durch 4, usw.) • Bei der Verschiebung mit >>> nach rechts werden die freien Stellen links mit Nullen aufgefüllt. c MM Joachim Lammarsch, Rothenberg (j000150.tex) 80 Java-Schulung Beispiel: public class Shft01 { public static void main(String args[]) { int i,x,y,z,t; i x y z t = = = = = Integer.valueOf(args[0]).intValue(); i << 1; i << 2; i >> 2; i >>> 3; System.out.println(i System.out.println(x System.out.println(y System.out.println(z System.out.println(t System.exit(0); + + + + + ", ", ", ", ", " " " " " + + + + + Integer.toBinaryString(i)); Integer.toBinaryString(x)); Integer.toBinaryString(y)); Integer.toBinaryString(z)); Integer.toBinaryString(t)); } } c MM Joachim Lammarsch, Rothenberg (j000150.tex) 81 Java-Schulung ergibt bei dem Aufruf java Shft01 512 als Ausgabe am Bildschirm: 512, 1000000000 1024, 10000000000 2048, 100000000000 128, 10000000 64, 1000000 bzw. vollständig ausgeschrieben (mit führenden Nullen): 512 1024 2048 128 64 c MM 0000 0000 0000 0000 0000 Joachim Lammarsch, Rothenberg 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 (j000150.tex) 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0010 0100 1000 0000 0000 0000 0000 0000 1000 0100 0000 0000 0000 0000 0000 82 Java-Schulung ergibt bei dem Aufruf java Shft01 -1 als Ausgabe am Bildschirm: -1, 11111111111111111111111111111111 -2, 11111111111111111111111111111110 -4, 11111111111111111111111111111100 -1, 11111111111111111111111111111111 536870911, 11111111111111111111111111111 bzw. vollstständig ausgeschrieben (mit führenden Nullen): -1 -2 -4 -1 536870911 c MM 1111 1111 1111 1111 0001 Joachim Lammarsch, Rothenberg 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 (j000150.tex) 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1110 1100 1111 1111 83 Java-Schulung 4.4.2.2 Der Negationsoperator Operator ~ Bedeutung Bitweises Komplement • Der unäre Negationsoperator ~ invertiert jedes Bit seines Operanden. Beispiel: public class Komp01 { public static void main(String args[]) { int i=512,x; x = ~i; System.out.println(i + ", " + Integer.toBinaryString(i)); System.out.println(x + ", " + Integer.toBinaryString(x)); System.exit(0); } } c MM Joachim Lammarsch, Rothenberg (j000150.tex) 84 Java-Schulung Als Ausgabe erhält man: 512, 1000000000 -513, 11111111111111111111110111111111 bzw. vollständig ausgeschrieben (mit führenden Nullen): 512 -513 c MM 0000 0000 0000 0000 0000 0010 0000 0000 1111 1111 1111 1111 1111 1101 1111 1111 Joachim Lammarsch, Rothenberg (j000150.tex) 85 Java-Schulung 4.4.2.3 Die binären Operatoren Operator & | ^ Bedeutung Bitweises Und Bitweises Oder Bitweises Exklusiv-Oder • Ersetzt man in den Wahrheitstabellen wahr(true) durch 1 und falsch(false) durch 0 erhält man die Verknüpfungsregeln für die binären Operatoren. • Die binären Operatoren & und | bilden das logische Produkt bzw. die logische Summe ihrer Operanden. • Der binäre Operator ^ realisiert bitweise das Exklusiv-Oder. c MM Joachim Lammarsch, Rothenberg (j000150.tex) 86 Java-Schulung Beispiel: public class Biop01 { public static void main(String args[]) { int i=1111, j=-2222, x; x = i & j; System.out.println(i + ", " + Integer.toBinaryString(i)); System.out.println(j + ", " + Integer.toBinaryString(j)); System.out.println(x + ", " + Integer.toBinaryString(x)); System.exit(0); } } c MM Joachim Lammarsch, Rothenberg (j000150.tex) 87 Java-Schulung Als Ausgabe erhält man: 1111, 10001010111 -2222, 11111111111111111111011101010010 1106, 10001010010 bzw. vollständig ausgeschrieben (mit führenden Nullen) 1111 0000 0000 0000 0000 0000 0100 0101 0111 -2222 1111 1111 1111 1111 1111 0111 0101 0010 ----------------------------------------------------& 1106 0000 0000 0000 0000 0000 0100 0101 0010 c MM Joachim Lammarsch, Rothenberg (j000150.tex) 88 Java-Schulung Beispiel: public class Biop02 { public static void main(String args[]) { int i=1111, j=-2222, x; x = i | j; System.out.println(i + ", " + Integer.toBinaryString(i)); System.out.println(j + ", " + Integer.toBinaryString(j)); System.out.println(x + ", " + Integer.toBinaryString(x)); System.exit(0); } } c MM Joachim Lammarsch, Rothenberg (j000150.tex) 89 Java-Schulung Als Ausgabe erhält man: 1111, 10001010111 -2222, 11111111111111111111011101010010 -2217, 11111111111111111111011101010111 bzw. vollständig ausgeschrieben (mit führenden Nullen) 1111 0000 0000 0000 0000 0000 0100 0101 0111 -2222 1111 1111 1111 1111 1111 0111 0101 0010 ----------------------------------------------------| -2217 1111 1111 1111 1111 1111 0111 0101 0111 c MM Joachim Lammarsch, Rothenberg (j000150.tex) 90 Java-Schulung Beispiel: public class Biop03 { public static void main(String args[]) { int i=1111, j=-2222, x; x = i ^ j; System.out.println(i + ", " + Integer.toBinaryString(i)); System.out.println(j + ", " + Integer.toBinaryString(j)); System.out.println(x + ", " + Integer.toBinaryString(x)); System.exit(0); } } c MM Joachim Lammarsch, Rothenberg (j000150.tex) 91 Java-Schulung Als Ausgabe erhält man: 1111, 10001010111 -2222, 11111111111111111111011101010010 -3323, 11111111111111111111001100000101 bzw. vollständig ausgeschrieben (mit führenden Nullen) 1111 0000 0000 0000 0000 0000 0100 0101 0111 -2222 1111 1111 1111 1111 1111 0111 0101 0010 ----------------------------------------------------^ -3323 1111 1111 1111 1111 1111 0011 0000 0101 c MM Joachim Lammarsch, Rothenberg (j000150.tex) 92 Java-Schulung 4.4.3 Verkürzte logische Operatoren Java unterstützt ebenfalls die Kurzschreibweise logischer Ausdrücke. Da relativ oft die Form operand1 = operand1 operator operand2 auftritt, wird vorzugsweise die verkürzte Schreibweise operand1 operator = operand2 eingesetzt. Angewendet wird diese Schreibweise bei folgenden Operatoren: Symbol << >> >>> & | ^ c MM Operation Verschiebung nach links Verschiebung nach rechts Verschiebung nach rechts Füllnullen) Bitweises Und Bitweises Oder Bitweises Exclusiv-Oder Joachim Lammarsch, Rothenberg (j000150.tex) Kurzform n <<= 10 n >>= 10 n >>>= 10 n &= 10 n |= 10 n ^= 10 Langform n = n << 10 n = n >> 10 n = n >>> 10 n = n >>> 10 n = n & 10 n = n | 10 n = n ^ 10 93 Kapitel 5 Verzweigungen 5.1 Entscheidungen Entscheidungen treffen heißt eine Bedingung zu prüfen, um dann, abhängig vom Ergebnis der Überprüfung, mit dem einen oder anderen Programmteil fortzufahren. 94 Java-Schulung 5.1.1 if-Anweisung Bei diesem Befehl werden eine oder mehrere Anweisungen ausgeführt, wenn die Bedingung war ist. Syntax: if (bedingung) anweisung; oder if (bedingung) { anweisung_1; anweisung_2; anweisung_n; } c MM Joachim Lammarsch, Rothenberg (j000160.tex) 95 Java-Schulung Beispiel: public class Verif01 { public static void main(String args[]) { int v1,v2; v1 = Integer.valueOf(args[0]).intValue(); v2 = Integer.valueOf(args[1]).intValue(); if(v1==v2) System.out.println("Die Zahlen sind gleich."); System.exit(0); } } c MM Joachim Lammarsch, Rothenberg (j000160.tex) 96 Java-Schulung 5.1.2 if-else-Anweisung Mit diesem Befehl wird in Abhängigkeit von einer Bedingung entweder die eine oder die andere Anweisung bzw. die einen oder die anderen Anweisungen ausgeführt. Syntax: if (bedingung) anweisung_1; else anweisung_2; oder if (bedingung) { anweisung_a_1; anweisung_a_n; } else { anweisung_b_1; anweisung_b_n; } c MM Joachim Lammarsch, Rothenberg (j000160.tex) 97 Java-Schulung Beispiel: public class Verif02 { public static void main(String args[]) { int v1,v2; v1 = Integer.valueOf(args[0]).intValue(); v2 = Integer.valueOf(args[1]).intValue(); if(v1==v2) System.out.println("Die Zahlen sind gleich."); else System.out.println("Die Zahlen sind nicht gleich."); System.exit(0); } } c MM Joachim Lammarsch, Rothenberg (j000160.tex) 98 Java-Schulung Beispiel: public class Verel01 { public static void main(String args[]) { int v1; v1 = Integer.valueOf(args[0]).intValue(); if(v1<0) System.out.println("Die Zahl ist negativ."); else System.out.println("Die Zahl ist positiv."); System.exit(0); } } c MM Joachim Lammarsch, Rothenberg (j000160.tex) 99 Java-Schulung Außerdem kann auch eine ganze Serie von Bedingungen geprüft werden. if (bedingung_1) anweisung_1; else if (bedingung_2) anweisung_2; else if (bedingung_3) anweisung_3; else if (bedingung_4) anweisung_4; ... ... else if (bedingung_n) anweisung_n; else standard_anweisung; • Ist bedingung_1 wahr, wird anweisung_1 ausgeführt, ist bedingung_2 wahr, wird anweisung_2 ausgeführt, u. s. w. • Trifft keine der Bedingungen zu, wird standard_anweisung ausgeführt. c MM Joachim Lammarsch, Rothenberg (j000160.tex) 100 Java-Schulung Beispiel: public class Verel02 { public static void main(String args[]) { int v1; v1 = Integer.valueOf(args[0]).intValue(); if(v1<0) System.out.println("Die Zahl ist negativ."); else if(v1>0) System.out.println("Die Zahl ist positiv."); else System.out.println("Die Zahl ist Null."); System.exit(0); } } c MM Joachim Lammarsch, Rothenberg (j000160.tex) 101 Java-Schulung Beispiel: public class Verel03 { public static void main(String args[]) { int v1; v1 = Integer.valueOf(args[0]).intValue(); if(v1==1) System.out.println("Die else if(v1==2) System.out.println("Die else if(v1==3) System.out.println("Die else System.out.println("Die Zahl ist Eins."); Zahl ist Zwei."); Zahl ist Drei."); Zahl ist ungleich 1, 2, 3."); System.exit(0); } } c MM Joachim Lammarsch, Rothenberg (j000160.tex) 102 Java-Schulung Es ergibt sich beispielsweise folgender Dialog bei der Ausführung: x92@pc:/j000160 > java Verel03 1 Die Zahl ist Eins. x92@pc:/j000160 > java Verel03 2 Die Zahl ist Zwei. x92@pc:/j000160 > java Verel03 3 Die Zahl ist Drei. x92@pc:/j000160 > java Verel03 4 Die Zahl ist ungleich 1, 2, 3. x92@pc:/j000160 > java Verel03 5 Die Zahl ist ungleich 1, 2, 3. c MM Joachim Lammarsch, Rothenberg (j000160.tex) 103 Java-Schulung 5.1.3 Bedingte Ausdrücke if-Ausdrücke der Form if (bedingung) x=ausdruck_1; else x=ausdruck_2; sind durchaus nicht selten. Bei ihnen liegt es nahe, die Variable x und den Zuweisungsoperator = „auszuklammern“, wodurch folgender Ausdruck entsteht: Syntax: bedingung ? ausdruck_1 : ausdruck_2 Der Wert des gesamten Befehls ist der Wert von ausdruck_1 bzw. ausdruck_2, je nachdem ob die Aussage von bedingung wahr oder falsch ist. c MM Joachim Lammarsch, Rothenberg (j000160.tex) 104 Java-Schulung Ein Programm der folgenden Form Beispiel: public class Verel04 { public static void main(String args[]) { int v1,v2,max; v1 = Integer.valueOf(args[0]).intValue(); v2 = Integer.valueOf(args[1]).intValue(); if(v1<v2) max = v2; else max = v1; System.out.println(max + " System.exit(0); " + v1 + " " + v2); } } c MM Joachim Lammarsch, Rothenberg (j000160.tex) 105 Java-Schulung kann nun wie folgt formuliert werden. Beispiel: public class Verel05 { public static void main(String args[]) { int v1,v2,max; v1 = Integer.valueOf(args[0]).intValue(); v2 = Integer.valueOf(args[1]).intValue(); max = (v1<v2) ? v2 : v1; System.out.println(max + " " + v1 + " " + v2); System.exit(0); } } c MM Joachim Lammarsch, Rothenberg (j000160.tex) 106 Java-Schulung 5.1.4 Geschachtelte if- oder if...else-Anweisungen Java kennt bei der Schachtelung von Anweisungen keine grundsätzlichen Einschränkungen. So dürfen bei den if-Anweisungen die Anweisungen beliebig sein – insbesondere selbst wieder if-Anweisungen. Syntax: if(bedingung_1) { if(bedingung_1a) ... else ... } else { if(bedingung_1b) ... else ... } Die geschweiften Klammern dienen hier nur der Übersichtlichkeit, sie sind nicht erforderlich. c MM Joachim Lammarsch, Rothenberg (j000160.tex) 107 Java-Schulung Beispiel: Zu einem Koodinatenpaar (x,y) soll ermittelt werden, in welchem Quadranten es liegt: public class Verel06 { public static void main(String args[]) { int quadrant, x, y; x = Integer.valueOf(args[0]).intValue(); y = Integer.valueOf(args[1]).intValue(); if (x>=0) if (y>=0) quadrant=1; else quadrant=4; else if (y>=0) quadrant=2; else quadrant=3; c MM Joachim Lammarsch, Rothenberg (j000160.tex) 108 Java-Schulung System.out.println("Punkt liegt im " + quadrant + ". Quadranten"); System.exit(0); } } oder unter Verwendung bedingter Ausdrücke: public class Verel06a { public static void main(String args[]) { int quadrant, x, y; x = Integer.valueOf(args[0]).intValue(); y = Integer.valueOf(args[1]).intValue(); quadrant = x>=0 ? y>=0 ? 1 : 4 : y>=0 ? 2 : 3; System.out.println("Punkt liegt im " + quadrant + ". Quadranten"); System.exit(0); } } c MM Joachim Lammarsch, Rothenberg (j000160.tex) 109 Java-Schulung 5.1.5 switch-Anweisung Mit geschachtelten if-Anweisungen lassen sich grundsätzlich alle Entscheidungsfolgen realisieren: public class Swch01 { public static void main(String args[]) { int zahl; zahl=Integer.valueOf(args[0]).intValue(); if(zahl==1) System.out.println("Die Zahl ist Eins."); else if(zahl==2) System.out.println("Die Zahl ist Zwei."); else if(zahl==3 || zahl==4 || zahl==5) System.out.println( "Die Zahl ist Drei, Vier oder Fünf."); else c MM Joachim Lammarsch, Rothenberg (j000162.tex) 110 Java-Schulung System.out.println( "Die Zahl ist weder Eins noch ... Fünf."); System.exit(0); } } c MM Joachim Lammarsch, Rothenberg (j000162.tex) 111 Java-Schulung Da Entscheidungsfolgen dieser Art keineswegs selten vorkommen, kennt Java mit der Anweisung switch eine Realisierung: Syntax: switch (ausdruck) { case konstanter anweisung_1; case konstanter anweisung_2; case konstanter anweisung_3; ... ... case konstanter anweisung_n; default: anweisungen } c MM Joachim Lammarsch, Rothenberg ausdruck_1: ausdruck_2: ausdruck_3: ausdruck_n: (j000162.tex) 112 Java-Schulung • Der Ausdruck ausdruck wird vollständig ausgewertet. • Wir eine Übereinstimmung mit case konstanter ausdruck_i: (1 ≤ i ≤ n) gefunden, dann wird bei dieser Anweisung die Abarbeitung fortgesetzt. • Wird keine Übereinstimmung gefunden, wird bei default: fortgefahren. • Gibt es kein default: wird der Anweisungsteil der switch-Anweisung ignoriert. • Sowohl der Ausdruck ausdruck als auch die konstanten Ausdrücke müssen ganzzahlig (byte, char, short oder int) sein. • Die Reihenfolge der case- oder default-Anweisung ist beliebig. • Durch den Befehl break wird die switch-Anweisung sofort verlassen. c MM Joachim Lammarsch, Rothenberg (j000162.tex) 113 Java-Schulung Beispiel: public class Swch02 { public static void main(String args[]) { int zahl; zahl=Integer.valueOf(args[0]).intValue(); switch(zahl) { case 1: System.out.println("Die Zahl ist Eins."); break; case 2: System.out.println("Die Zahl ist Zwei."); break; case 3: case 4: case 5: System.out.println( "Die Zahl ist Drei, Vier oder Fünf."); break; default: System.out.println( "Die Zahl ist weder Eins noch ... Fünf."); c MM Joachim Lammarsch, Rothenberg (j000162.tex) 114 Java-Schulung } System.exit(0); } } c MM Joachim Lammarsch, Rothenberg (j000162.tex) 115 Java-Schulung Beispiel: public class Swch03 { public static void main(String args[]) { int zahl; zahl=Integer.valueOf(args[0]).intValue(); switch(zahl) { case 1: System.out.println("Montag"); case 2: System.out.println("Dienstag"); case 3: System.out.println("Mittwoch"); case 4: System.out.println("Donnerstag"); case 5: System.out.println("Freitag"); case 6: c MM Joachim Lammarsch, Rothenberg (j000162.tex) break; break; break; break; break; 116 Java-Schulung System.out.println("Samstag"); break; case 7: System.out.println("Sonntag"); break; default: System.out.println("Eingabe ist falsch."); } System.exit(0); } } • Es sind nur Vergleiche mit primitiven Datentypen möglich. • Es können keine größeren primitiven Typen (long, float, double) oder Objekte benutzt werden. • Es kann abgesehen von Gleichheit keine Beziehung geprüft werden. Verschachtelte ifAnweisungen sind dagegen auf jede Art der Prüfung und auf jeden Datentyp anwendbar. c MM Joachim Lammarsch, Rothenberg (j000162.tex) 117 Java-Schulung 5.2 Wiederholungen Wiederholung bedeutet, daß ein Programmteil mehrfach nacheinander ausgeführt wird. Java stellt hierzu folgende Befehle zur Verfügung: • while • do ... while • for c MM Joachim Lammarsch, Rothenberg (j000170.tex) 118 Java-Schulung 5.2.1 while-Anweisung Bei diesem Befehl werden eine oder mehrere Anweisungen immer wieder ausgeführt, wenn die Bedingung wahr ist. Syntax: while (bedingung) anweisung; oder while (bedingung) { anweisung_1; anweisung_2; anweisung_n; } c MM Joachim Lammarsch, Rothenberg (j000170.tex) 119 Java-Schulung • Zunächst wird der Ausdruck bedingung ausgewertet. • Ist sein logischer Wert wahr wird die Anweisung bzw. werden die Anweisungen ausgeführt. • Danach wird wiederum der Ausdruck bedingung ausgewertet. • usw. c MM Joachim Lammarsch, Rothenberg (j000170.tex) 120 Java-Schulung Beispiel 1: Ausgabe der Zahlen von 1 bis 10 am Bildschirm public class Wwhl01 { public static void main(String args[]) { int i; i=0; while (i<10) { i=i+1; System.out.println("Die Zahl ist: " + i); } System.exit(0); } } c MM Joachim Lammarsch, Rothenberg (j000170.tex) 121 Java-Schulung Als Ausgabe erhält man: Die Die Die Die Die Die Die Die Die Die c MM Zahl Zahl Zahl Zahl Zahl Zahl Zahl Zahl Zahl Zahl ist: ist: ist: ist: ist: ist: ist: ist: ist: ist: 1 2 3 4 5 6 7 8 9 10 Joachim Lammarsch, Rothenberg (j000170.tex) 122 Java-Schulung Beispiel 2: Berechnung der Summe der Zahlen von 1 bis 10 und Ausgabe der Summe am Bildschirm public class Wwhl02 { public static void main(String args[]) { int i=0, summe=0; while (i<10) { i=i+1; summe=summe+i; } System.out.println("Die Summe ist: " + summe); System.exit(0); } } Als Ausgabe erhält man: Die Summe ist: 55 c MM Joachim Lammarsch, Rothenberg (j000170.tex) 123 Java-Schulung Beispiel 3: Eine Endlosschleife . . . public class Wwhl03 { public static void main(String args[]) { boolean ok=true; while (ok) { System.out.print("X"); } System.exit(0); } } c MM Joachim Lammarsch, Rothenberg (j000170.tex) 124 Java-Schulung 5.2.2 Geschachtelte while-Anweisungen Innerhalb einer while-Schleife ist eine weitere Schleife erlaubt. Syntax: while (bedingung_1) { ... ... while (bedingung_2) { ... ... ... ... } ... ... } c MM Joachim Lammarsch, Rothenberg (j000170.tex) 125 Java-Schulung Beispiel: public class Wwhl04 { public static void main(String args[]) { int i=0, j; while (i++<3) { j=0; while (j++<3) System.out.print(i + " * " + j + " = " + i*j + " "); System.out.println(""); } System.exit(0); } } c MM Joachim Lammarsch, Rothenberg (j000170.tex) 126 Java-Schulung Als Ausgabe erhält man: 1 * 1 = 1 2 * 1 = 2 3 * 1 = 3 c MM 1 * 2 = 2 2 * 2 = 4 3 * 2 = 6 Joachim Lammarsch, Rothenberg (j000170.tex) 1 * 3 = 3 2 * 3 = 6 3 * 3 = 9 127 Java-Schulung 5.2.3 do ... while-Anweisung Bei diesem Befehl werden eine oder mehrere Anweisungen immer wieder ausgeführt, wenn die Bedingung wahr ist. Syntax: do anweisung; while (bedingung); oder do { anweisung_1; anweisung_2; anweisung_n; } while (bedingung); c MM Joachim Lammarsch, Rothenberg (j000172.tex) 128 Java-Schulung • Zunächst wird die Anweisung bzw. werden die Anweisungen ausgeführt. • Danach wird der Ausdruck bedingung ausgewertet. • Ist das Ergebnis wahr wird wiederum die Anweisung bzw. werden wiederum die Anweisungen ausgeführt. • u.s.w. 5.2.3.1 Unterschied zwischen den Befehlen while und do ... while • Bei einer while-Schleife wird der Ausdruck zum erstem Mal ausgewertet, bevor die Anweisung der Schleife zum ersten Mal ausgeführt wird. • Daher wird die Anweisung niemals ausgeführt, wenn der Ausdruck von vornherein falsch war. • Bei einer do ... while-Schleife wird der Ausdruck zum erstem Mal ausgewertet, nachdem die Anweisung der Schleife zum ersten Mal ausgeführt wurde. • Daher wird die Anweisung mindestens einmal ausgeführt, selbst wenn der Ausdruck von vornherein falsch war. c MM Joachim Lammarsch, Rothenberg (j000172.tex) 129 Java-Schulung Beispiel 1: Ausgabe der Zahlen von 1 bis 10 am Bildschirm public class Wdwh01 { public static void main(String args[]) { int i; i=0; do { i=i+1; System.out.println("Die Zahl ist: " + i); } while (i<10); System.exit(0); } } c MM Joachim Lammarsch, Rothenberg (j000172.tex) 130 Java-Schulung Als Ausgabe erhält man: Die Die Die Die Die Die Die Die Die Die c MM Zahl Zahl Zahl Zahl Zahl Zahl Zahl Zahl Zahl Zahl ist: ist: ist: ist: ist: ist: ist: ist: ist: ist: 1 2 3 4 5 6 7 8 9 10 Joachim Lammarsch, Rothenberg (j000172.tex) 131 Java-Schulung Beispiel 2: Berechnung der Summe der Zahlen von 1 bis 10 und Ausgabe der Summe am Bildschirm public class Wdwh02 { public static void main(String args[]) { int i=0, summe=0; do { i=i+1; summe=summe+i; } while (i<10); System.out.println("Die Summe ist: " + summe); System.exit(0); } } Als Ausgabe erhält man: Die Summe ist: 55 c MM Joachim Lammarsch, Rothenberg (j000172.tex) 132 Java-Schulung Beispiel 3: Eine Endlosschleife . . . public class Wwhl03 { public static void main(String args[]) { boolean ok=true; do { System.out.print("X"); } while (ok); System.exit(0); } } c MM Joachim Lammarsch, Rothenberg (j000172.tex) 133 Java-Schulung 5.2.4 Geschachtelte do ... while-Anweisungen Innerhalb einer do ... while-Schleife ist eine weitere Schleife erlaubt. Syntax: do { ... ... do { ... ... ... ... } while (bedingung_2); ... ... } while (bedingung_1); c MM Joachim Lammarsch, Rothenberg (j000173.tex) 134 Java-Schulung Beispiel: public class Wdwh04 { public static void main(String args[]) { int i=1, j; do { j=1; do System.out.print(i + " * " + j + " = " + i*j + " "); while (j++<3); System.out.println(""); } while (i++<3); System.exit(0); } } c MM Joachim Lammarsch, Rothenberg (j000173.tex) 135 Java-Schulung Als Ausgabe erhält man: 1 * 1 = 1 2 * 1 = 2 3 * 1 = 3 c MM 1 * 2 = 2 2 * 2 = 4 3 * 2 = 6 Joachim Lammarsch, Rothenberg (j000173.tex) 1 * 3 = 3 2 * 3 = 6 3 * 3 = 9 136 Java-Schulung 5.2.5 for-Anweisung Bei diesem Befehl werden eine oder mehrere Anweisungen immer wieder ausgeführt, wenn die Bedingung wahr ist. Syntax: for (ausdruck_1; bedingung; ausdruck_2) anweisung; oder for (ausdruck_1; bedingung; ausdruck_2) { anweisung_1; anweisung_2; anweisung_n; } c MM Joachim Lammarsch, Rothenberg (j000180.tex) 137 Java-Schulung • anweisung_1 ist die Initialisierung, die den Beginn der Schleife einleitet. • bedingung ist der Test, der nach jeder Iteration der Schleife ausgeführt wird. Der Test muß ein boolscher Ausdruck sein. Ergibt der Test wahr, wird die Schleife ausgeführt. • anweisung_2 ist ein beliebiger Ausdrucks- oder Funktionsaufruf. Üblicherweise wird anweisung_2 verwendet, um den Wert des Schleifenindexes zu ändern. • Die drei Komponenten der for-Anweisung können einzeln oder auch zusammen fehlen, jedoch müssen die Semikolon in der Klammer an der richtigen Stelle stehen. • for ( i=5 ; i<10 ; ) • for ( ; i<10 ; i++ ) • for ( ; i<10 ; ) • for ( ; ) c MM Joachim Lammarsch, Rothenberg ; (j000180.tex) 138 Java-Schulung Beispiel 1: Ausgabe der Zahlen von 1 bis 10 am Bildschirm public class Wfor01 { public static void main(String args[]) { int i; for (i=1; i<=10; i++) System.out.println("Die Zahl ist: " + i); System.exit(0); } } c MM Joachim Lammarsch, Rothenberg (j000180.tex) 139 Java-Schulung Als Ausgabe erhält man: Die Die Die Die Die Die Die Die Die Die c MM Zahl Zahl Zahl Zahl Zahl Zahl Zahl Zahl Zahl Zahl ist: ist: ist: ist: ist: ist: ist: ist: ist: ist: 1 2 3 4 5 6 7 8 9 10 Joachim Lammarsch, Rothenberg (j000180.tex) 140 Java-Schulung Beispiel 2: Berechnung der Summe der Zahlen von 1 bis 10 und Ausgabe der Summe am Bildschirm public class Wfor02 { public static void main(String args[]) { int i, summe=0; for (i=1; i<=10; i++) summe = summe+i; System.out.println("Die Summe ist: " + summe); System.exit(0); } } Als Ausgabe erhält man: Die Summe ist: 55 c MM Joachim Lammarsch, Rothenberg (j000180.tex) 141 Java-Schulung Beispiel 3: Berechnung der Summe der Zahlen von 1 bis 10 und Ausgabe der Summe sowie der Zwischenergebnisse am Bildschirm public class Wfor03 { public static void main(String args[]) { int i, summe=0; for (i=1; i<=10; i++) { summe = summe+i; System.out.println("i: " + i + " --- summe: " + summe); } System.out.println("Die Summe ist: " + summe); System.exit(0); } } c MM Joachim Lammarsch, Rothenberg (j000180.tex) 142 Java-Schulung Als Ausgabe erhält man: i: 1 --- summe: 1 i: 2 --- summe: 3 i: 3 --- summe: 6 i: 4 --- summe: 10 i: 5 --- summe: 15 i: 6 --- summe: 21 i: 7 --- summe: 28 i: 8 --- summe: 36 i: 9 --- summe: 45 i: 10 --- summe: 55 Die Summe ist: 55 c MM Joachim Lammarsch, Rothenberg (j000180.tex) 143 Java-Schulung 5.2.6 Geschachtelte for-Anweisungen Innerhalb einer for-Schleife ist eine weitere Schleife erlaubt. Syntax: for (ausdruck_1; bedingung; ausdruck_2) { ... ... for (ausdruck_1; bedingung; ausdruck_2) { ... ... ... ... } ... ... } c MM Joachim Lammarsch, Rothenberg (j000180.tex) 144 Java-Schulung Beispiel: public class Wfor04 { public static void main(String args[]) { int i, j; for (i=1; i<4; i++) { for (j=1; j<4; j++) System.out.print(i + " * " + j + " = " + i*j + " "); System.out.println(""); } System.exit(0); } } c MM Joachim Lammarsch, Rothenberg (j000180.tex) 145 Java-Schulung Als Ausgabe erhält man: 1 * 1 = 1 2 * 1 = 2 3 * 1 = 3 c MM 1 * 2 = 2 2 * 2 = 4 3 * 2 = 6 Joachim Lammarsch, Rothenberg (j000180.tex) 1 * 3 = 3 2 * 3 = 6 3 * 3 = 9 146 Java-Schulung 5.2.7 Weitere Anwendungen für Schleifen Beispiel 1: Es soll die Reihe 1+ 1 1 1 1 + + + ··· + n 2 4 8 2 berechnet werden. public class Wfor11 { public static void main(String args[]) { int i, n; double summand=1., summe=1.; n=Integer.valueOf(args[0]).intValue(); for (i=1; i<=n; i++) { summand/=2.; summe+=summand; } System.out.println("Die Summe ist: " + summe); c MM Joachim Lammarsch, Rothenberg (j000185.tex) 147 Java-Schulung System.exit(0); } } ergibt bei dem Aufruf java Wfor11 11 als Ausgabe am Bildschirm: Die Summe ist: 1.99951171875 c MM Joachim Lammarsch, Rothenberg (j000185.tex) 148 Java-Schulung Beispiel 2: public class Wfor10 { public static void main(String args[]) { long i, n, fakultaet; n=Integer.valueOf(args[0]).intValue(); for (i=fakultaet=1; i<=n; fakultaet*=i++) ; System.out.println("Die Fakultaet ist: " + fakultaet); System.exit(0); } } ergibt bei dem Aufruf java Wfor10 5 als Ausgabe am Bildschirm: Die Fakultaet ist: 120 c MM Joachim Lammarsch, Rothenberg (j000185.tex) 149 Java-Schulung Beispiel 3: public class Wfor12 { public static void main(String args[]) { int i, summe=0; for (i=1; i>10; i++) { summe+=i; } System.out.println("Die Summe ist: " + summe); System.exit(0); } } Als Ausgabe erhält man: Die Summe ist: 0 c MM Joachim Lammarsch, Rothenberg (j000185.tex) 150 Java-Schulung 5.2.7.1 Richtig ist: public class Wfor12a { public static void main(String args[]) { int i, summe=0; for (i=1; i<10; i++) { summe+=i; } System.out.println("Die Summe ist: " + summe); System.exit(0); } } Als Ausgabe erhält man: Die Summe ist: 45 c MM Joachim Lammarsch, Rothenberg (j000185.tex) 151 Java-Schulung Beispiel 4: public class Wfor13 { public static void main(String args[]) { int i, summe=0; for (i=1; i<=10; i++) ; { System.out.println(i + " } " + i*i); System.exit(0); } } Als Ausgabe erhält man: 11 c MM 121 Joachim Lammarsch, Rothenberg (j000185.tex) 152 Java-Schulung 5.2.7.2 Richtig ist: public class Wfor13a { public static void main(String args[]) { int i, summe=0; for (i=1; i<=10; i++) { System.out.println(i + " } " + i*i); System.exit(0); } } c MM Joachim Lammarsch, Rothenberg (j000185.tex) 153 Java-Schulung Als Ausgabe erhält man: 1 2 3 4 5 6 7 8 9 10 c MM 1 4 9 16 25 36 49 64 81 100 Joachim Lammarsch, Rothenberg (j000185.tex) 154 Java-Schulung 5.2.8 Die Anweisung break Die Anweisung break bewirkt, daß mit ihrer Ausführung die Abarbeitung der Schleife sofort beendet wird. Dies geschieht unabhängig davon, ob das Abbruchkriterium der Schleife erfüllt ist oder nicht. Syntax: break; Die Anweisung break darf nicht direkt auftreten sondern darf nur bedingt ausgeführt werden. Daher kann die Anweisung nur in einer if- oder if-else-Anweisung auftreten. c MM Joachim Lammarsch, Rothenberg (j000190.tex) 155 Java-Schulung Beispiel: public class Brk001 { public static void main(String args[]) { int x=0; while(true) { System.out.println("x: " + x); if(x++==5) break; } System.out.println("X: " + x); System.exit(0); } } c MM Joachim Lammarsch, Rothenberg (j000190.tex) 156 Java-Schulung Als Ausgabe erhält man: x: x: x: x: x: x: X: 0 1 2 3 4 5 6 c MM Joachim Lammarsch, Rothenberg (j000190.tex) 157 Java-Schulung Bei geschachtelten Schleifen bewirkt die Anweisung break, daß mit ihrer Ausführung die Abarbeitung der inneren Schleife sofort beendet wird. Beispiel: public class Brk002 { public static void main(String args[]) { int x=0, y=0; for (x=0; x<5; x++) { System.out.println("x: " + x); for (y=0; y<10; y++) { System.out.print(" " + y); if(y==5) break; } System.out.println(""); } System.out.println("X: " + x); c MM Joachim Lammarsch, Rothenberg (j000190.tex) 158 Java-Schulung System.out.println("Y: " + y); System.exit(0); } } Als Ausgabe erhält man: x: 0 0 x: 1 0 x: 2 0 x: 3 0 x: 4 0 X: 5 Y: 5 c MM 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 Joachim Lammarsch, Rothenberg (j000190.tex) 159 Java-Schulung 5.2.9 Die Anweisung continue Die Anweisung continue bewirkt, daß mit ihrer Ausführung die Schleife erneut aufgerufen wird. Die Schleifenvariable erhält dabei den nächsten Wert. Syntax: continue; Die Anweisung continue darf nicht direkt auftreten sondern darf nur bedingt ausgeführt werden. Daher kann die Anweisung nur in einer if- oder if-else-Anweisung auftreten. c MM Joachim Lammarsch, Rothenberg (j000195.tex) 160 Java-Schulung Beispiel: public class Con001 { public static void main(String args[]) { double i; for (i=-4.; i<=4.; i++) { if(i==0.) continue; System.out.println("Der Kehrwert ist: " + 1./i); } System.exit(0); } } c MM Joachim Lammarsch, Rothenberg (j000195.tex) 161 Java-Schulung Als Ausgabe erhält man: Der Der Der Der Der Der Der Der Kehrwert Kehrwert Kehrwert Kehrwert Kehrwert Kehrwert Kehrwert Kehrwert ist: ist: ist: ist: ist: ist: ist: ist: -0.25 -0.3333333333333333 -0.5 -1.0 1.0 0.5 0.3333333333333333 0.25 Die Anweisung continue sorgt in diesem Fall dafür, daß bei dem Schleifenwert 0 nicht dividiert wird. c MM Joachim Lammarsch, Rothenberg (j000195.tex) 162 Java-Schulung 5.2.10 Benannte Schleifen Sowohl break- als auch continue-Konstrukte können mit einem optionalen Argument versehen werden. Syntax: break label; bzw. continue label; Während bei der üblichen Verwendung von break als auch continue immer nur die gerade aktuelle Schleife verlassen bzw. von vorne durchlaufen wird, kann durch die Verwendung von Marken auch ein Sprung über mehrere Schleifen durchgeführt werden. c MM Joachim Lammarsch, Rothenberg (j000200.tex) 163 Java-Schulung Beispiel (break): public class Brk004 { public static void main(String args[]) { int i,j; sch_1: for (i=1; i<=5; i++) { sch_2: for (j=1; j<=5; j++) { System.out.print(i+j + "\t"); if(i+j == 7) { System.out.println(""); break sch_1; } } System.out.println(""); } c MM Joachim Lammarsch, Rothenberg (j000200.tex) 164 Java-Schulung System.exit(0); } } Als Ausgabe erhält man: 2 3 4 5 6 3 4 5 6 7 c MM Joachim Lammarsch, Rothenberg (j000200.tex) 165 Java-Schulung Beispiel (continue): public class Con003 { public static void main(String args[]) { int i,j; sch_1: for (i=1; i<=5; i++) { sch_2: for (j=1; j<=5; j++) { System.out.print(i+j + "\t"); if(i+j == 7) { System.out.println(""); continue sch_1; } } System.out.println(""); } c MM Joachim Lammarsch, Rothenberg (j000200.tex) 166 Java-Schulung System.exit(0); } } Als Ausgabe erhält man: 2 3 4 5 6 3 4 5 6 7 c MM 4 5 6 5 6 7 6 7 7 Joachim Lammarsch, Rothenberg (j000200.tex) 167 Kapitel 6 Felder (Arrays oder Vektoren) Felder speichern mehrere Variablen eines Datentyps, beispielsweise fünf Variablen des Datentyps int unter einem Variablennamen. • Ein einzelner Platz in einem Feld heißt Element. • Die Anzahl der Elemente ist gleich der Größe des Feldes. • Jedes Element bekommt einen Index zugeordnet entsprechend seiner Position im Feld. • Die Numerierung beginnt stets bei Null. Felder müssen deklariert, allokiert und initialisiert werden. 168 Java-Schulung Ein Feld wird in Java als Objekt behandelt und über Referenzen verwaltet. Seine Behandlung unterliegt folgenden Gesichtspunkten: • Felder werden über Referenzen manipuliert. • Felder werden mittels new dynamisch generiert. • Felder werden vom garbage Collector entsorgt. c MM Joachim Lammarsch, Rothenberg (j000130.tex) 169 Java-Schulung 6.1 Anlegen eines Feldes 6.1.1 Deklaration eines Feldes Felder müssen von einem bestimmten Datentyp sein. Der erste Schritt ist das Anlegen einer Variablen (Referenz), die das Feld aufnimmt. Syntax: datentyp [] variablenname Beispiel: int [] Zahl; double [] Gzahl; Wichtig ist, daß die Größe des Feldes hier nicht angegeben wird. Die eckigen Klammern können vor oder hinter dem Bezeichner angeordnet werden. Sie dienen nur der Information, daß es sich um ein Feld handelt. Beispiel: int [] Zahl; int Zahl []; c MM Joachim Lammarsch, Rothenberg (j000130.tex) 170 Java-Schulung 6.1.2 Allokierung eines Feldes Im nächsten Schritt müssen wir Speicherplatz anfordern. Die geschieht mittels des Befehls new. Syntax: variablenname = new datentyp[elementanzahl] Beispiel: Zahl = new int [2]; Gzahl = new double [2]; Wenn Felder auf diese Weise angelegt werden, so werden alle Element mit Defaultwerten (0) belegt. c MM Joachim Lammarsch, Rothenberg (j000130.tex) 171 Java-Schulung 6.1.3 Initialisierung eines Feldes Mittels des Befehls new haben wir ein Feld angelegt und es muß nun mit Werten belegt werden. Syntax: variablenname[index] = wert Beispiel: Zahl[0] = 24; Zahl[1] = 12; c MM Joachim Lammarsch, Rothenberg (j000131.tex) 172 Java-Schulung 6.1.4 Gleichzeitiges Initialisieren und Anlegen eines Feldes Es ist ferner möglich Deklaration, Allokierung und Initialisierung in einem Schritt durchzuführen. Syntax: datentyp [] variablenname = {wert1,wert2,wert3,...} Beispiel: int [] Zahl = {24,18,12,6}; double [] Gzahl = {1.2345,2.3456,3.4567}; Die Werte dürfen auch errechnete Werte sein, wenn sie zur Generierungszeit eindeutig definiert sind. c MM Joachim Lammarsch, Rothenberg (j000131.tex) 173 Java-Schulung Beispiel: public class Feld01 { public static void main(String args[]) { int [] Zahl; int [] Zahl2; Zahl = new int[2]; Zahl2 = new int[2]; Zahl[0] = 12; Zahl[1] = 24; double [] Gzahl = {6.54321,1.23456,2.22222}; System.out.println(Zahl[0]*Zahl[1]); System.out.println(Zahl2[0]+" "+Zahl2[1]); System.out.println(Gzahl[0]+Gzahl[1]+Gzahl[2]); } } c MM Joachim Lammarsch, Rothenberg (j000131.tex) 174 Java-Schulung ergibt als Ausgabe am Bildschirm: 288 0 0 9.99999 Bei jedem Zugriff auf ein Feldelement wird überprüft, ob das Element innerhalb der Dimensionen des Feldes liegt. c MM Joachim Lammarsch, Rothenberg (j000131.tex) 175 Java-Schulung Durch die Instanzvariable length kann man zu jeder Zeit überprüfen, wieviele Elemente in dem Feld enthalten sind. Beispiel: public class Feld02 { public static void main(String args[]) { int [] Zahl = new int[2]; System.out.println("Anzahl der Elemente: " + Zahl.length); System.exit(0); } } ergibt als Ausgabe am Bildschirm: Anzahl der Elemente: c MM Joachim Lammarsch, Rothenberg 2 (j000131.tex) 176 Java-Schulung 6.2 Schleifen und Felder Felder können mittels Schleifen bearbeitet werden: Beispiel: public class Schl01 { public static void main(String args[]) { int i,summe=0; int [] feld = new int[11]; for(i=1;i<=10;i++) feld[i]=2*i; for(i=1;i<=10;i++) System.out.print(feld[i] + " System.out.println("\n"); "); for(i=1;i<=10;i++) c MM Joachim Lammarsch, Rothenberg (j000240.tex) 177 Java-Schulung summe+=feld[i]; System.out.println("Die Summe ist: " + summe); System.exit(0); } } ergibt als Ausgabe am Bildschirm: 2 4 6 8 10 12 14 16 18 20 Die Summe ist: 110 c MM Joachim Lammarsch, Rothenberg (j000240.tex) 178 Java-Schulung 6.2.1 Beispiel: Sieb des Eratosthenes Durch das Sieb des Eratosthenes kann man schnell Primzahlen errechnen. Zum Beispiel Berechnung der Primzahlen von 1 bis 100: 1 11 21 31 41 51 61 71 81 91 c MM 2 12 22 32 42 52 62 72 82 92 3 13 23 33 43 53 63 73 83 93 Joachim Lammarsch, Rothenberg 4 14 24 34 44 54 64 74 84 94 5 15 25 35 45 55 65 75 85 95 (j000250.tex) 6 16 26 36 46 56 66 76 86 96 7 17 27 37 47 57 67 77 87 97 8 18 28 38 48 58 68 78 88 98 9 19 29 39 49 59 69 79 89 99 10 20 30 40 50 60 70 80 90 100 179 Java-Schulung Schritt 1: (Löschen der Vielfachen von 2) -11 21 31 41 51 61 71 81 91 c MM 2 ---------- 3 13 23 33 43 53 63 73 83 93 ----------- 5 15 25 35 45 55 65 75 85 95 Joachim Lammarsch, Rothenberg ----------- 7 17 27 37 47 57 67 77 87 97 ----------- (j000250.tex) 9 19 29 39 49 59 69 79 89 99 ----------- 180 Java-Schulung Schritt 2: (Löschen der Vielfachen von 3) -11 -31 41 -61 71 -91 c MM 2 ---------- 3 13 23 -43 53 -73 83 -- ----------- 5 -25 35 -55 65 -85 95 Joachim Lammarsch, Rothenberg ----------- 7 17 -37 47 -67 77 -97 ----------- (j000250.tex) -19 29 -49 59 -79 89 -- ----------- 181 Java-Schulung Schritt 3: (Löschen der Vielfachen von 5) -11 -31 41 -61 71 -91 c MM 2 ---------- 3 13 23 -43 53 -73 83 -- ----------- 5 ---------- Joachim Lammarsch, Rothenberg ----------- 7 17 -37 47 -67 77 -97 ----------- (j000250.tex) -19 29 -49 59 -79 89 -- ----------- 182 Java-Schulung Schritt 4: (Löschen der Vielfachen von 7) -11 -31 41 -61 71 --- c MM 2 ---------- 3 13 23 -43 53 -73 83 -- ----------- 5 ---------- Joachim Lammarsch, Rothenberg ----------- 7 17 -37 47 -67 --97 ----------- (j000250.tex) -19 29 --59 -79 89 -- ----------- 183 Java-Schulung Als Ergebnis erhält man alle Primzahlen zwischen 1 und 100: 2 11 31 41 61 71 3 13 23 5 7 17 19 29 37 47 43 53 59 67 73 83 79 89 97 c MM Joachim Lammarsch, Rothenberg (j000250.tex) 184 Java-Schulung 6.2.1.1 Variante 1 Um dieses Verfahren zu Programmieren kann man man wie folgt vorgehen: public class Sieb { public static void main(String args[]) { // 1. Deklaration der Variablen int i, j; int [] sieb = new int[101]; // 2. Initialisierung des Feldes, sieb[0] unbenutzt for (i=1; i<=100; i++) sieb[i]=i; // 3. Loeschen der Vielfachen for (i=2; i<=10; i++) for (j=2*i; j<=100; j+=i) sieb[j]=0; c MM Joachim Lammarsch, Rothenberg (j000250.tex) 185 Java-Schulung // 4. Ausgabe der Primzahlen for (i=2; i<=100; i++) if (sieb[i]>0) System.out.println(sieb[i]); // Beenden des Programms System.exit(0); } } c MM Joachim Lammarsch, Rothenberg (j000250.tex) 186 Java-Schulung ergibt als Ausgabe am Bildschirm: 2 3 5 7 11 13 17 19 23 29 31 37 41 43 c MM 47 53 59 61 67 71 73 79 83 89 97 Joachim Lammarsch, Rothenberg (j000250.tex) 187 Java-Schulung 6.2.1.2 Variante 2 Die Umsetzung des Verfahrens ist nicht besonders effektiv, daher werden einige Verbessungungen vorgenommen: public class Sieb2 { public static void main(String args[]) { // 1. Deklaration der Variablen int i, j; int [] sieb = new int[101]; // 2. Initialisierung des Feldes // Neu: Feld wird erst ab 2. Element initialisiert for (i=2; i<=100; i++) sieb[i]=i; // 3. Loeschen der Vielfachen // Neu: Gerade Zahlen werden separat behandelt for (j=4; j<=100; j+=2) c MM Joachim Lammarsch, Rothenberg (j000250.tex) 188 Java-Schulung sieb[j]=0; // Neu: Mit bereits gestrichenen Zahlen wird nicht mehr // gestrichen; gerade Zahlen werden übergangen for (i=3; i<=10; i++) if (sieb[i]>0) for (j=3*i; j<=100; j=j+2*i) sieb[j]=0; // 4. Ausgabe der Primzahlen // Neu: Ausgabe des Index statt Inhalt des Feldelements for (i=2; i<=100; i++) if (sieb[i]>0) System.out.println(i); // 5. Beenden des Programms System.exit(0); } } c MM Joachim Lammarsch, Rothenberg (j000250.tex) 189 Java-Schulung 6.2.1.3 Variante 3 Als weitere Alternative kann man den Datentyp des Feldes von int auf boolean umstellen: public class Sieb3 { public static void main(String args[]) { // 1. Deklaration der Variablen int i, j; // Neu: Datentyp wird auf boolean umgestellt boolean [] sieb = new boolean[101]; // 2. Initialisierung des Feldes for (i=2; i<=100; i++) // Neu: Feld wird mit true initialisiert sieb[i]=true; // 3. Loeschen der Vielfachen for (j=4; j<=100; j+=2) sieb[j]=false; c MM Joachim Lammarsch, Rothenberg (j000250.tex) 190 Java-Schulung for (i=3; i<=10; i++) // Neu: Feld-Element wird auf true abgefragt if (sieb[i]==true) for (j=3*i; j<=100; j+=2*i) // Neu: Gestrichenes Feld-Element wird auf false gesetzt sieb[j]=false; // 4. Ausgabe der Primzahlen for (i=2; i<=100; i++) // Neu: Feld-Element wird auf true abgefragt if (sieb[i]==true) System.out.println(i); // 5. Beenden des Programms System.exit(0); } } c MM Joachim Lammarsch, Rothenberg (j000250.tex) 191 Java-Schulung 6.2.1.4 Variante 4 Da die Zahl 2 die einzige gerade Primzahl ist, wird nur noch mit ungeraden Zahlen gearbeitet: public class Sieb4 { public static void main(String args[]) { // 1. Deklaration der Variablen int i, j; // Feldgroesse halbiert boolean [] sieb = new boolean[50]; // 2. Initialisierung des Feldes for (i=1; i<50; i++) sieb[i]=true; // 3. Loeschen der Vielfachen for (i=1; i<=10; i++) if(sieb[i]==true) for (j=3*i+1; j<50; j+=2*i+1) c MM Joachim Lammarsch, Rothenberg (j000250.tex) 192 Java-Schulung sieb[j]=false; // 4. Ausgabe der Primzahlen System.out.println(2); for (i=1; i<50; i++) if (sieb[i]==true) System.out.println(2*i+1); // 5. Beenden des Programms System.exit(0); } } c MM Joachim Lammarsch, Rothenberg (j000250.tex) 193 Java-Schulung 6.2.2 Zeitmessung: Sieb des Eratosthenes Um Laufzeit-Vergleiche durchzuführen, wird die Anzahl der Primzahlen bis 1 000 000 für alle 4 Versionen bestimmt. 6.2.2.1 Variante 1 public class Sieba { public static void main(String args[]) { int i, j; int [] sieb = new int[1000001]; for (i=1; i<=1000000; i++) sieb[i]=i; for (i=2; i<=1000; i++) for (j=2*i; j<=1000000; j+=i) sieb[j]=0; j=0; for (i=2; i<=1000000; i++) if (sieb[i]>0) j++; System.out.println("Anzahl der Primzahlen: " + j); c MM Joachim Lammarsch, Rothenberg (j000250.tex) 194 Java-Schulung System.exit(0); } } c MM Joachim Lammarsch, Rothenberg (j000250.tex) 195 Java-Schulung 6.2.2.2 Variante 2 public class Sieb2a { public static void main(String args[]) { int i, j; int [] sieb = new int[1000001]; for (i=2; i<=1000000; i++) sieb[i]=i; for (j=4; j<=1000000; j+=2) sieb[j]=0; for (i=3; i<=1000; i++) if (sieb[i]>0) for (j=3*i; j<=1000000; j=j+2*i) sieb[j]=0; j=0; for (i=2; i<=1000000; i++) if (sieb[i]>0) j++; System.out.println("Anzahl der Primzahlen: " + j); System.exit(0); c MM Joachim Lammarsch, Rothenberg (j000250.tex) 196 Java-Schulung } } c MM Joachim Lammarsch, Rothenberg (j000250.tex) 197 Java-Schulung 6.2.2.3 Variante 3 public class Sieb3a { public static void main(String args[]) { int i, j; boolean [] sieb = new boolean[1000001]; for (i=2; i<=1000000; i++) sieb[i]=true; for (j=4; j<=1000000; j+=2) sieb[j]=false; for (i=3; i<=1000; i++) if (sieb[i]==true) for (j=3*i; j<=1000000; j=j+2*i) sieb[j]=false; j=0; for (i=2; i<=1000000; i++) if (sieb[i]==true) j++; System.out.println("Anzahl der Primzahlen: " + j); System.exit(0); c MM Joachim Lammarsch, Rothenberg (j000250.tex) 198 Java-Schulung } } c MM Joachim Lammarsch, Rothenberg (j000250.tex) 199 Java-Schulung 6.2.2.4 Variante 4 public class Sieb4a { public static void main(String args[]) { int i, j; boolean [] sieb = new boolean[500000]; for (i=1; i<500000; i++) sieb[i]=true; for (i=1; i<500; i++) if(sieb[i]==true) for (j=3*i+1; j<500000; j+=2*i+1) sieb[j]=false; j=1; for (i=1; i<500000; i++) if (sieb[i]==true) j++; System.out.println("Anzahl der Primzahlen: " + j); System.exit(0); } } c MM Joachim Lammarsch, Rothenberg (j000250.tex) 200 Java-Schulung 6.2.2.5 Ergebnisse Als Ergebnis der Zeitmessungen erhält man: Programmname Sieba Sieb2a Sieb3a Sieb4a c MM Joachim Lammarsch, Rothenberg (j000250.tex) Laufzeit in Sekunden 3.71 1.56 1.49 1.09 201 Java-Schulung 6.3 Schleifen und mehrdimensionale Felder Mehrdimensionale Felder werden in Java nicht unterstützt. Allerdings kann man ein Feld mit Felder deklarieren und darauf (wie in C/C++) zugreifen. Diese mehrdimensionalen Felder können ebenfalls mittels Schleifen bearbeitet werden, wobei für jede Dimension meist eine Laufvariable vorgesehen ist: Syntax: int i,j; int [][] name = new int[dimension][dimension] for(i=0;i<dimension;i++) for(j=0;j<dimension;j++) { name[i][j]=befehl; ... } c MM Joachim Lammarsch, Rothenberg (j000260.tex) 202 Java-Schulung Beispiel (Addition zweier Matrizen): public class Schl02 { public static void { // Deklarationen int i,j; int [][] mat_1 = int [][] mat_2 = int [][] mat_3 = main(String args[]) new int[3][3]; new int[3][3]; new int[3][3]; // Initialisierung for(i=0;i<3;i++) for(j=0;j<3;j++) { mat_1[i][j]=3*i+j+1; mat_2[i][j]=(3*i+j+1)*10; } c MM Joachim Lammarsch, Rothenberg (j000260.tex) 203 Java-Schulung // Addition der Matrizen for(i=0;i<3;i++) for(j=0;j<3;j++) mat_3[i][j]=mat_1[i][j]+mat_2[i][j]; // Ausgabe der Matrix mat_1 for(i=0;i<3;i++) { for(j=0;j<3;j++) System.out.print(" " + mat_1[i][j] + " System.out.println(""); } System.out.println(""); // Ausgabe der Matrix mat_2 for(i=0;i<3;i++) { for(j=0;j<3;j++) System.out.print(mat_2[i][j] + " System.out.println(""); } System.out.println(""); c MM Joachim Lammarsch, Rothenberg (j000260.tex) "); "); 204 Java-Schulung // Ausgabe der Matrix mat_3 for(i=0;i<3;i++) { for(j=0;j<3;j++) System.out.print(mat_3[i][j] + " System.out.println(""); } "); // Beenden des Programms System.exit(0); } } c MM Joachim Lammarsch, Rothenberg (j000260.tex) 205 Java-Schulung ergibt als Ausgabe am Bildschirm: 1 4 7 2 5 8 3 6 9 10 40 70 20 50 80 30 60 90 11 44 77 22 55 88 33 66 99 c MM Joachim Lammarsch, Rothenberg (j000260.tex) 206 Teil II Objektorientierte Programmierung mit Java 207 Java-Schulung Folgende Eigenschaften der objektorientierten Programmierung sind in Java integriert: • Java ist eine Sprache, die auf Klassen fußt. • Alle Klassen in Java haben eine gemeinsame Oberklasse, die Klasse Object. • Java implementiert das Konzept des Late Binding. • Java unterstützt nicht die Mehrfachvererbung. • Java unterstützt Polymorphismus. • Java erlaubt das Überladen von Methoden, aber nicht von Operatoren. • Java hat ein Schnittstellenkonzept implementiert. • Java ist eine rein objektorientierte Sprache und verfügt nicht über die Möglichkeit, globale Konstanten, Variablen oder Funktionen zu definieren. c MM Joachim Lammarsch, Rothenberg (j000300.tex) 208 Kapitel 7 Java und Klassen Ein Java-Programm besteht immer aus einer Ansammlung von Klassen. • Klassen sind Datenstrukturen, die aus Variablen und Funktionen bestehen. • Die Variablen bzw. die Klassenvariablen sind die Attribute der Klasse. • Die Funktionen bzw. die Klassenfunktionen sind die Methoden der Klasse. • Jedes Attribut und jede Methode muß zu einer Klasse gehören. • Durch Klassen werden neue Datentypen erzeugt, die Daten enthalten und wissen, wie man mit ihnen umgeht. • In Java werden alle Klassen von einer einzigen Basisklasse abgeleitet. 209 Java-Schulung • Diese Klasse heißt Object. • Wird eine Klasse von Object abgeleitet, muß dies nicht explizit angegeben werden. • Durch den Befehl class wird in Java eine Klasse deklariert. • Durch das Schlüsselwort extents wird die Oberklasse angegeben, von der die deklarierte Klasse abgeleitet wird. Syntax: class Klassenname { // weitere Deklarationen } ist gleichbedeutend mit class Klassenname extents Object { // weitere Deklarationen } c MM Joachim Lammarsch, Rothenberg (j000300.tex) 210 Java-Schulung 7.1 Deklaration einer Klasse Deklarationen beschreiben, wie die Klasse aussehen soll. • Durch die Deklaration wird lediglich der Aufbau beschrieben. • Es wird kein Objekt erzeugt. • Es wird kein Speicherplatz belegt. c MM Joachim Lammarsch, Rothenberg (j000300.tex) 211 Java-Schulung 7.1.1 Deklarationen von Attributen in einer Klasse Attribute werden deklariert, in dem man ihren Datentyp und ihren Namen angibt. Syntax: datentyp name bzw. für mehrere Variablen des selben Datentyps schreibt man datentyp name_1, name_2, ... Beispiel: class Rechteck { int laenge, breite; } c MM Joachim Lammarsch, Rothenberg (j000300.tex) 212 Java-Schulung 7.1.2 Deklarationen von Methoden in einer Klasse Methoden sind mit den Funktionen in anderen Programmiersprachen vergleichbar. Bei Java unterscheidet man Klassen- und Instanzmethoden. Sie werden wie folgt deklariert: Syntax: rueckgabedatentyp methoden_name(parameter_liste) { // Rumpf der Methode } • Methoden können Rückgabewerte liefern, um Fehler anzuzeigen oder um die Ergebnisse von Berechnungen zurückzugeben. • Der Befehl return gibt genau einen Wert zurück. • Die Parameter, die an die Methode übergeben werden, sind hierbei nur die Kopien der Attribute, d.h. sie können innerhalb der Methode verändert werden. • Methoden haben in der Regel einen nur auf ein aktuelles Objekt begrenzten Wirkungsradius. • Der Aufruf von Methoden wird oft auch als das Versenden einer Nachricht an ein Objekt bezeichnet. c MM Joachim Lammarsch, Rothenberg (j000300.tex) 213 Java-Schulung • Eine innerhalb der Methode deklarierte Variable ist nur innerhalb der Methode bekannt. • Ihre Reichweite beginnt bei ihrer Deklaration und endet am Ende des Blocks, in dem sie deklariert wurde. Syntax: class Klassenname { ... ... int methode(datentyp1 parm1, datentyp2 parm2) { ... Befehle ... return(parm3); } ... ... } c MM Joachim Lammarsch, Rothenberg (j000300.tex) 214 Java-Schulung Beispiel: public class Meth01 { // Methode main public static void main(String args[]) { int fl, um, br, la; br = Integer.valueOf(args[0]).intValue(); la = Integer.valueOf(args[1]).intValue(); // Berechnung der Fläche fl = flaeche(br,la); System.out.println("Die Fläche ist: " + fl); // Berechnung des Umfangs um = umfang(br,la); System.out.println("Der Umfang ist: " + um); System.exit(0); } c MM Joachim Lammarsch, Rothenberg (j000300.tex) 215 Java-Schulung // Methode zur Berechnung der Fläche static int flaeche(int xbr, int xla) { return(xbr*xla); } // Methode zur Berechnung des Umfangs static int umfang(int ybr, int yla) { return(2*ybr+2*yla); } } ergibt beim Aufruf durch java Meth01 10 15 als Ausgabe am Bildschirm Die Fläche ist: 150 Der Umfang ist: 50 c MM Joachim Lammarsch, Rothenberg (j000300.tex) 216 Java-Schulung 7.1.2.1 Übergabe von Parametern mittels Referenzen Beim Aufruf einer Methode mit Parametern, die ein Objekt representieren, werden die Variablen an die Methode als Referenz übergeben. Damit wirken sich alle Änderungen, die man an diesen Objekten innerhalb der Methode vornimmt, auf die Orginalvariable aus. Beispiel: public class Feld11 { //Methode zur Bearbeitung des Feldes static int tuwas(int [] ifeld) { int i,z=0; for(i=0;i<ifeld.length;i++) { z++; if(ifeld[i]>4) ifeld[i]*=10; } return(z); } c MM Joachim Lammarsch, Rothenberg (j000300.tex) 217 Java-Schulung //Methode zur Ausgabe Feldes static void ausgabe(int [] ofeld) { System.out.print("Feld: [ "); for(int i=0;i<ofeld.length;i++) System.out.print(ofeld[i] + " "); System.out.println("]"); return; } public static void main(String args[]) { int [] feld={1,3,5,3,1,7,9,3}; int anzahl=0; System.out.print("vorher - "); ausgabe(feld); System.out.println("Anzahl: " + anzahl); anzahl=tuwas(feld); c MM Joachim Lammarsch, Rothenberg (j000300.tex) 218 Java-Schulung System.out.print("nachher - "); ausgabe(feld); System.out.println("Anzahl: " + anzahl); System.exit(0); } } Als Ausgabe erhält man: vorher Anzahl: nachher Anzahl: c MM - Feld: 0 - Feld: 8 Joachim Lammarsch, Rothenberg [ 1 3 5 3 1 7 9 3 ] [ 1 3 50 3 1 70 90 3 ] (j000300.tex) 219 Java-Schulung 7.1.2.2 Rückgabe von Parametern mittels Referenzen Bei der Rückgabe von Objekten wird die Referenz mittels return an das rufende Programm zurückgegeben. Beispiel: public class Folg01 { //Methode zur Generierung der Folge static int [] mfolge(int von,int bis) { int [] ifeld = new int[bis-von+1]; for(int i=0;i<ifeld.length;i++) ifeld[i]=von++; return(ifeld); } c MM Joachim Lammarsch, Rothenberg (j000300.tex) 220 Java-Schulung public static void main(String args[]) { int [] feld; feld=mfolge(2,9); System.out.print("[ "); for(int i=0;i<feld.length;i++) System.out.print(feld[i] + " "); System.out.println("]"); System.exit(0); } } Als Ausgabe erhält man: [ 2 3 4 5 6 7 8 9 ] c MM Joachim Lammarsch, Rothenberg (j000300.tex) 221 Java-Schulung 7.1.3 Instanzierung von Objekten Die Deklaration einer Klasse selbst belegt noch keinen Speicherplatz und die Instanzmethoden führen noch keine Aktion aus. • Mit dem Operator new wird ein Objekt ins Leben gerufen. • Die Objekte werden instanziert und ihnen wird Speicherplatz zugewiesen. • Die so erzeugten Objekte werden Instanzvariablen genannt. • Zu diesem Zeitpunkt kann man die Methoden für das aktuelle Objekt aufrufen. Syntax: klassen-datentyp objekt-name = new klassen-datentyp • Wenn eine Instanzvariable nicht mehr benutzt wird, wird der Speichplatz zur Wiederverwertung markiert. c MM Joachim Lammarsch, Rothenberg (j000300.tex) 222 Java-Schulung Beispiel: public class Meth02 { // Attribute int fl, um, br, la; // Methode main public static void main(String args[]) { int hbr,hla; hbr = Integer.valueOf(args[0]).intValue(); hla = Integer.valueOf(args[1]).intValue(); // Erzeugen der Instanz Meth02 rechteck = new Meth02(); // Eingabe von Breite und Länge rechteck.eingabe(hbr,hla); c MM Joachim Lammarsch, Rothenberg (j000300.tex) 223 Java-Schulung // Berechnung der Fläche rechteck.flaeche(); // Berechnung des Umfangs rechteck.umfang(); // Ausgabe von Fläche und Umfang rechteck.ausgabe(); System.exit(0); } // Methode zur Eingabe von Breite und Länge void eingabe(int xbr,int xla) { br = xbr; la = xla; return; } c MM Joachim Lammarsch, Rothenberg (j000300.tex) 224 Java-Schulung // Methode zur Berechnung der Fläche void flaeche() { fl=br*la; return; } // Methode zur Berechnung des Umfangs void umfang() { um=2*br+2*la; return; } // Methode zur Ausgabe der Fläche und des Umfangs void ausgabe() { System.out.println("Die Fläche ist: " + fl); System.out.println("Der Umfang ist: " + um); return; } } c MM Joachim Lammarsch, Rothenberg (j000300.tex) 225 Java-Schulung ergibt beim Aufruf durch java Meth02 10 15 als Ausgabe am Bildschirm Die Fläche ist: 150 Der Umfang ist: 50 c MM Joachim Lammarsch, Rothenberg (j000300.tex) 226 Java-Schulung Beispiel: public class Feld12 { int [] feld={1,3,5,3,1,7,9,3}; int anzahl=0; //Methode zur Bearbeitung des Feldes void tuwas() { for(int i=0;i<feld.length;i++) { anzahl++; if(feld[i]>4) feld[i]*=10; } } //Methode zur Ausgabe Feldes void ausgabe() { System.out.print("Feld: [ "); for(int i=0;i<feld.length;i++) c MM Joachim Lammarsch, Rothenberg (j000300.tex) 227 Java-Schulung System.out.print(feld[i] + " "); System.out.println("]"); System.out.println("Anzahl: " + anzahl); } public static void main(String args[]) { Feld02 zahlen = new Feld02(); System.out.print("vorher - "); zahlen.ausgabe(); zahlen.tuwas(); System.out.print("nachher - "); zahlen.ausgabe(); System.exit(0); } } c MM Joachim Lammarsch, Rothenberg (j000300.tex) 228 Java-Schulung Als Ausgabe erhält man: vorher Anzahl: nachher Anzahl: c MM - Feld: 0 - Feld: 8 Joachim Lammarsch, Rothenberg [ 1 3 5 3 1 7 9 3 ] [ 1 3 50 3 1 70 90 3 ] (j000300.tex) 229 Java-Schulung Beispiel: public class Folg02 { int [] feld; int von,bis; //Methode zur Generierung der Folge void mfolge() { feld = new int[bis-von+1]; for(int i=0;i<feld.length;i++) feld[i]=von++; } public static void main(String args[]) { Folg02 folge = new Folg02(); c MM Joachim Lammarsch, Rothenberg (j000300.tex) 230 Java-Schulung folge.von=2; folge.bis=9; folge.mfolge(); System.out.print("[ "); for(int i=0;i<folge.feld.length;i++) System.out.print(folge.feld[i] + " "); System.out.println("]"); System.exit(0); } } Als Ausgabe erhält man: [ 2 3 4 5 6 7 8 9 ] c MM Joachim Lammarsch, Rothenberg (j000300.tex) 231 Java-Schulung 7.1.4 Konstruktoren Um ein Objekt zu initialisieren, wird automatisch beim Aufruf von new die KonstruktorMethode der Objekt-Klasse gerufen. • Sie hat den gleichen Namen wie die Klasse, für die sie ein Objekt initialisiert. • Sie hat keinen Rückgabewert, selbst void wird nicht angegeben. • Die Parameter sind wie bei jeder Methode optional. Syntax: class Klassenname { ... Klassenname() // Konstruktormethode { ... //Befehle der Konstruktor-Methode } ... } c MM Joachim Lammarsch, Rothenberg (j000300.tex) 232 Java-Schulung Beispiel: public class Meth03 { // Attribute int fl, um, br, la; // Konstruktor zur Eingabe von Breite und Länge Meth03(int xbr,int xla) { br = xbr; la = xla; return; } // Methode zur Berechnung der Fläche void flaeche() { fl=br*la; return; } c MM Joachim Lammarsch, Rothenberg (j000300.tex) 233 Java-Schulung // Methode zur Berechnung des Umfangs void umfang() { um=2*br+2*la; return; } // Methode zur Ausgabe der Fläche und des Umfangs void ausgabe() { System.out.println("Die Fläche ist: " + fl); System.out.println("Der Umfang ist: " + um); return; } // Methode main public static void main(String args[]) { int hbr,hla; hbr = Integer.valueOf(args[0]).intValue(); c MM Joachim Lammarsch, Rothenberg (j000300.tex) 234 Java-Schulung hla = Integer.valueOf(args[1]).intValue(); // Erzeugen der Instanz Meth03 rechteck = new Meth03(hbr,hla); // Berechnung der Fläche rechteck.flaeche(); // Berechnung des Umfangs rechteck.umfang(); // Ausgabe von Fläche und Umfang rechteck.ausgabe(); System.exit(0); } } ergibt beim Aufruf durch java Meth03 10 15 als Ausgabe am Bildschirm Die Fläche ist: 150 Der Umfang ist: 50 c MM Joachim Lammarsch, Rothenberg (j000300.tex) 235 Java-Schulung Beispiel: public class Auto01 { int anzahl_passagiere; float geschwindigkeit; // Konstruktor Auto01() { anzahl_passagiere=0; geschwindigkeit=0.F; } // Methode Transportieren void transportieren(int mitfahrer) { if((anzahl_passagiere+mitfahrer)>5) System.out.println("Es ist kein Platz mehr frei"); else anzahl_passagiere+=mitfahrer; return; c MM Joachim Lammarsch, Rothenberg (j000300.tex) 236 Java-Schulung } // Methode Beschleunigen void beschleunigen(float g) { geschwindigkeit += g; return; } // Methode main public static void main(String args[]) { // Speicherplatz für Objekt anlegen, Referenz anlegen // Konstruktor aufrufen, d.h. Erzeugen den Instanz: Auto01 mein_auto = new Auto01(); System.out.println("Die Geschwindigkeit ist: " + mein_auto.geschwindigkeit); System.out.println("Die Anzahl der Passagiere ist: " + mein_auto.anzahl_passagiere); mein_auto.transportieren(2); System.out.println("Die Anzahl der Passagiere ist: " + c MM Joachim Lammarsch, Rothenberg (j000300.tex) 237 Java-Schulung mein_auto.anzahl_passagiere); mein_auto.transportieren(2); System.out.println("Die Anzahl der Passagiere ist: " + mein_auto.anzahl_passagiere); mein_auto.transportieren(2); mein_auto.beschleunigen(40); System.out.println("Die Geschwindigkeit ist: " + mein_auto.geschwindigkeit); mein_auto.beschleunigen(-40); System.out.println("Die Anzahl der Passagiere ist: " + mein_auto.anzahl_passagiere); System.out.println("Die Geschwindigkeit ist: " + mein_auto.geschwindigkeit); System.exit(0); } } c MM Joachim Lammarsch, Rothenberg (j000300.tex) 238 Java-Schulung Als Ausgabe erhält man: Die Geschwindigkeit ist: Die Anzahl der Passagiere ist: Die Anzahl der Passagiere ist: Die Anzahl der Passagiere ist: Es ist kein Platz mehr frei Die Geschwindigkeit ist: Die Anzahl der Passagiere ist: Die Geschwindigkeit ist: c MM Joachim Lammarsch, Rothenberg (j000300.tex) 0.0 0 2 4 40.0 4 0.0 239 Java-Schulung 7.1.5 Übergabe bzw. Rückgabe von Objekten Auch Objekte können an Methoden übergeben bzw. von Methoden zurückgegeben werden. Es ist hierbei nur notwendig, die entsprechende Referenz anzugeben. Beispiel: public class Brch01 { // Attribute int zaehler,nenner; // Konstruktor zur Eingabe von Zähler und Nenner Brch01(int z,int n) { zaehler = z; nenner = n; return; } // Konstruktor ohne Eingabe von Zähler und Nenner Brch01() { c MM Joachim Lammarsch, Rothenberg (j000310.tex) 240 Java-Schulung zaehler = 0; nenner = 1; return; } // Methode zur Multiplikation Brch01 mult(Brch01 b) { Brch01 brch = new Brch01(); brch.zaehler=zaehler*b.zaehler; brch.nenner=nenner*b.nenner; return(brch); } void ausgabe() { System.out.println(zaehler + "/" + nenner); return; } // Methode main c MM Joachim Lammarsch, Rothenberg (j000310.tex) 241 Java-Schulung public static void main(String args[]) { int br1z,br1n,br2z,br2n; br1z br1n br2z br2n = = = = Integer.valueOf(args[0]).intValue(); Integer.valueOf(args[1]).intValue(); Integer.valueOf(args[2]).intValue(); Integer.valueOf(args[3]).intValue(); // Erzeugen der Instanzen Brch01 bb1 = new Brch01(br1z,br1n); Brch01 bb2 = new Brch01(br2z,br2n); Brch01 bb3 = new Brch01(); // Ausgabe der Startwerte bb1.ausgabe(); bb2.ausgabe(); bb3.ausgabe(); bb3=bb1.mult(bb2); // Ausgabe des Ergebnisses c MM Joachim Lammarsch, Rothenberg (j000310.tex) 242 Java-Schulung bb3.ausgabe(); System.exit(0); } } ergibt beim Aufruf durch java Brch01 2 3 3 4 Als Ausgabe erhält man: 2/3 3/4 0/1 6/12 c MM Joachim Lammarsch, Rothenberg (j000310.tex) 243 Java-Schulung Möchte man den Aufruf der Methode symetrisch gestalten, muß mit Klassenmethoden gearbeitet werden. In diesem Fall werden die Referenzen aller Objekte als Parameter übergeben. Beispiel: public class Brch02 { // Attribute int zaehler,nenner; // Konstruktor zur Eingabe von Zähler und Nenner Brch02(int z,int n) { zaehler = z; nenner = n; return; } // Konstruktor ohne Eingabe von Zähler und Nenner Brch02() { zaehler = 0; c MM Joachim Lammarsch, Rothenberg (j000310.tex) 244 Java-Schulung nenner = 1; return; } // Methode zur Multiplikation static Brch02 mult(Brch02 b1,Brch02 b2) { Brch02 brch = new Brch02(); brch.zaehler=b1.zaehler*b2.zaehler; brch.nenner=b1.nenner*b2.nenner; return(brch); } void ausgabe() { System.out.println(zaehler + "/" + nenner); return; } // Methode main public static void main(String args[]) c MM Joachim Lammarsch, Rothenberg (j000310.tex) 245 Java-Schulung { int br1z,br1n,br2z,br2n; br1z br1n br2z br2n = = = = Integer.valueOf(args[0]).intValue(); Integer.valueOf(args[1]).intValue(); Integer.valueOf(args[2]).intValue(); Integer.valueOf(args[3]).intValue(); // Erzeugen der Instanzen Brch02 bb1 = new Brch02(br1z,br1n); Brch02 bb2 = new Brch02(br2z,br2n); Brch02 bb3 = new Brch02(); // Ausgabe der Startwerte bb1.ausgabe(); bb2.ausgabe(); bb3.ausgabe(); bb3=mult(bb1,bb2); // Ausgabe des Ergebnisses bb3.ausgabe(); c MM Joachim Lammarsch, Rothenberg (j000310.tex) 246 Java-Schulung System.exit(0); } } ergibt beim Aufruf durch java Brch02 2 3 3 4 Als Ausgabe erhält man: 2/3 3/4 0/1 6/12 c MM Joachim Lammarsch, Rothenberg (j000310.tex) 247 Kapitel 8 Pakete In größeren Programmsystemen reichen Klassen als Strukturelemente alleine nicht aus. Oberhalb der Ebene der Klassen ist mit den Paketen (Packages) eine weitere Kollektion für Programmelemente vorgesehen. Pakete sind eine Sammlung von Klassen, die einen gemeinsamen Zweck verfolgen oder aus anderen Gründen zusammengefaßt werden sollen. Jede Methode und jede Variable ist Bestandteil einer Klasse. Jede Klasse ist Bestandteil genau eines Paketes. Der vollständige Name einer Klasse besteht aus paket.klasse oder paket.unterpaket. klasse. Jeder Teil eines mehrstufigen Paketnamens bezeichnet ein Unterverzeichnis, in dem die gewünschte Klassendatei zu finden ist. Beispielsweise befindet sich das Paket java. util.zip im Unterverzeichnis java/util/zip. Die Suche nach Klassen erfolgt relativ zur Umgebungsvariablen CLASSPATH oder in einem 248 Java-Schulung systemspezifischen Installationsverzeichnis (z.B. c:\java.1.2\bin bzw. /usr/lib/ java/bin) und zusätzlich im aktuellen Verzeichnis. 8.1 Verwendung von Paketen Um eine Klasse verwenden zu können, muß man angeben, in welchem Paket sie liegt. Hierzu gibt es zwei unterschiedliche Möglichkeiten. 1. Angabe des qualifizierten Namens Pakte.Klasse Variable = new Paket.Klasse(); Beispiel: java.util.Date d = new java.util.Date(); 2a. Einbindung einer Klasse am Anfang des Programms import java.util.Date; ... Date d = new Date(); c MM Joachim Lammarsch, Rothenberg (j000330.tex) /* import Paket.Klasse */ 249 Java-Schulung 2b. Einbindung eines Paktes am Anfang des Programms import java.util.*; ... Date d = new Date(); /* import Paket.* */ Diese Variante spart Schreibarbeit und kostet keinen Speicherplatz, da die Klassen erst beim Aufruf im Programm in den Paketen gesucht werden. c MM Joachim Lammarsch, Rothenberg (j000330.tex) 250 Java-Schulung 8.2 Vordefinierte Pakete Die von Sun mitgelieferte Klassenbibliothek ist in mehr als 20 Pakete aufgeteilt, von denen hier nur die wichtigsten genannt werden: java.applet zur Implementierung von Java-Applets, java.awt (Abstract Windowing Toolkit) zur Gestaltung graphischer Benutzeroberflächen, java.awt.image zur AWT Bildverarbeitung, java.io zur Ein- und Ausgabe bei Bildschirm und Dateien, java.lang für die rudimentären Sprachbestandteile, dieses Paket wird implizit von jeder Klasse importiert, java.net zur Netzwerkunterstützung, java.security enthält Sicherheitsdienste, java.security.acl zur Unterstützung von Access Control Lists, java.sql zur Datenbankunterstützung (JDBC), java.util zur Verwendung verschiedener Datenstrukturen wie Dictionary, Hashtables, usw., java.util.zip zur Verwendung von JAR-Files, Kompression, Prüfsummen. c MM Joachim Lammarsch, Rothenberg (j000330.tex) 251 Kapitel 9 Zeichenketten Sie werden durch die Klasse String repräsentiert. Da ein Zeichen in Java im UnicodeZeichensatz dargestellt wird, besteht auch eine Zeichenkette aus Unicode-Zeichen. 252 Java-Schulung 9.1 Statische Zeichenketten 9.1.1 Konstruktoren Die Klasse String bietet eine Reihe von Möglichkeiten neue Instanzen zu erzeugen. Syntax: String(); Erzeugt ein leeres Zeichenketten-Objekt. String(String zeichenkette); Erzeugt eine neue Zeichenkette durch Duplizierung einer bereits vorhandenen. String(char[] feld); Erzeugt eine neue Zeichenkette aus einem vorhandenen Zeichen-Feld. Es werden alle Elemente des Feldes in die Zeichenkette übernommen. Der Inhalt des Feldes wird nicht kopiert. c MM Joachim Lammarsch, Rothenberg (j000350.tex) 253 Java-Schulung 9.1.2 Methoden Die Klasse String definiert eine Vielzahl von Methoden zur Manipulation und zur Bestimmung der Eigenschaften von Zeichenketten. + Verketten von zwei Zeichenketten int length() Länge einer Zeichenkette char charAt(int position) Zeichen an einer Position int compareTo(String zeichenkette) Vergleich von Zeichenketten String substring(int anfangsindex, int endeindex) Teil einer Zeichenkette String toLowerCase() Umwandlung in Kleinbuchstaben String toUpperCase() Umwandlung in Großbuchstaben c MM Joachim Lammarsch, Rothenberg (j000350.tex) 254 Java-Schulung int indexOf (String zeichenkette) Suchen eines Zeichens in einer Zeichenkette (vom Anfang der Zeichenkette an) int indexOf (String zeichenkette, int beginn) Suchen eines Zeichens in einer Zeichenkette (von einer Position an) int lastIndexOf (String zeichenkette) Suchen eines Zeichens in einer Zeichenkette (vom Ende der Zeichenkette beginnend an) int lastIndexOf (String zeichenkette, int beginn) Suchen eines Zeichens in einer Zeichenkette (von einer Position vom Ende beginnend an) c MM Joachim Lammarsch, Rothenberg (j000350.tex) 255 Java-Schulung 9.1.2.1 Verkettung von Zeichenketten Hierzu steht der Operator + zur Verfügung. Syntax: zkneu = zk1 + zk2; zkneu ist die Verkettung der Zeichenketten zk1 und zk2. Beispiel: public class Zk001 { public static void main(String [] args) { String str1 = "Das ist eine Zeichenkette. "; String str2 = "Das ist eine Zeichenkette. "; String str3 = "Das ist eine neue Zeichenkette. "; String str4; str4=str1+str2; System.out.println(str4); c MM Joachim Lammarsch, Rothenberg (j000350.tex) 256 Java-Schulung str1+=str3; System.out.println(str1 + ’\n’); } } Als Ausgabe erhält man: Das ist eine Zeichenkette. Das ist eine Zeichenkette. Das ist eine Zeichenkette. Das ist eine neue Zeichenkette. c MM Joachim Lammarsch, Rothenberg (j000350.tex) 257 Java-Schulung 9.1.2.2 Länge einer Zeichenkette Syntax: int length(); liefert die aktuelle Länge einer Zeichenkette. Ist der Rückgabewert 0, dann ist die Zeichenkette leer. Ist die Zahl größer als 0 enthält die Zeichenkette n Zeichen, die an den Positionen 0 bis n − 1 stehen. Beispiel: public class Zk002 { public static void main(String [] args) { String str1 = "Das ist eine Zeichenkette. "; System.out.println("Länge: " + str1.length()); } } Als Ausgabe erhält man: Länge: c MM 27 Joachim Lammarsch, Rothenberg (j000350.tex) 258 Java-Schulung 9.1.2.3 Zeichenposition Syntax: char charAt(int position); liefert das Zeichen an der Position position. Das erste Element hat die Position 0. Beispiel: public class Zk003 { public static void main(String [] args) { String str1 = "Das ist eine Zeichenkette. "; System.out.println("Zeichen: " + str1.charAt(13)); } } Als Ausgabe erhält man: Zeichen: c MM Z Joachim Lammarsch, Rothenberg (j000350.tex) 259 Java-Schulung 9.1.2.4 Vergleich von Zeichenketten Syntax: int compareTo(String zeichenkette); führt einen lexikalischen Vergleich zweier Zeichenketten durch. Die Zeichen werden paarweise von links nach rechts miteinander verglichen. Bei Gleichheit liefert die Methode den Rückgabewert 0. Beispiel: public class Zk004 { public static void main(String [] args) { String str1 = "Das ist eine Zeichenkette. "; String str2 = "Das ist eine Zeichenkette. "; String str3 = "Das ist eine neue Zeichenkette. "; System.out.println("Vergl1: " + str1.compareTo(str2)); System.out.println("Vergl2: " + str1.compareTo(str3) + ’\n’); } } c MM Joachim Lammarsch, Rothenberg (j000350.tex) 260 Java-Schulung Als Ausgabe erhält man: Vergl1: 0 Vergl2: -20 c MM Joachim Lammarsch, Rothenberg (j000350.tex) 261 Java-Schulung 9.1.2.5 Teile von Zeichenketten Syntax: String substring(int anfangsindex, int endeindex) substring liefert die Teil-Zeichenkette, die zwischen den Indizes anfangsindex und endeindex−1 steht; die Länge der Zeichenkette ist damit anfangsindex−endeindex. Beispiel: public class Zk008 { public static void main(String [] args) { String str2 = "Das ist eine Zeichenkette. "; String str4 = new String(); String str5 = new String(); str4=str2.substring(0,7); str5=str2.substring(8,13); System.out.println(str2); System.out.println(str4); System.out.println(str5); c MM Joachim Lammarsch, Rothenberg (j000350.tex) 262 Java-Schulung } } Als Ausgabe erhält man: Das ist eine Zeichenkette. Das ist eine c MM Joachim Lammarsch, Rothenberg (j000350.tex) 263 Java-Schulung 9.1.2.6 Umwandlung in Groß- bzw. Kleinbuchstaben Syntax: String toLowerCase(); String toUpperCase(); toLowerCase liefert die Zeichenkette, die entsteht, wenn alle Zeichen in Kleinbuchstaben umgewandelt werden. toUpperCase liefert die Zeichenkette, die entsteht, wenn alle Zeichen in Großbuchstaben umgewandelt werden. Beispiel: public class Zk006 { public static void main(String [] args) { String str2 = "Das ist eine Zeichenkette. "; System.out.println("Klein: System.out.println("Gross: " + str2.toLowerCase()); " + str2.toUpperCase()); } } c MM Joachim Lammarsch, Rothenberg (j000350.tex) 264 Java-Schulung Als Ausgabe erhält man: Klein: Gross: c MM das ist eine zeichenkette. DAS IST EINE ZEICHENKETTE. Joachim Lammarsch, Rothenberg (j000350.tex) 265 Java-Schulung 9.1.2.7 Suchen in Zeichenketten indexOf und lastIndexOf suchen nach dem ersten bzw. letzten Zeichen in einer Zeichenkette. Syntax: int int int int indexOf (String zeichenkette); indexOf (String zeichenkette, int beginn); lastIndexOf (String zeichenkette); lastIndexOf (String zeichenkette, int beginn); indexOf sucht das erste Vorkommen der Zeichenkette zk innerhalb eines ZeichenkettenObjekts bzw. beginnt mit der Suche ab der Position beginn. Die Methode lastIndexOf sucht nach dem letzten Vorkommen der Zeichenkette zk innerhalb eines ZeichenkettenObjekts bzw. beginnt mit der Suche ab der Position beginn rückwärts. Beispiel: public class Zk007 { public static void main(String [] args) { String str2 = "Das ist eine Zeichenkette. "; c MM Joachim Lammarsch, Rothenberg (j000350.tex) 266 Java-Schulung System.out.println("Position: " + str2.indexOf("e")); System.out.println("Position: " + str2.indexOf("e",13)); System.out.println("Position: " + str2.lastIndexOf("e")); System.out.println("Position: " + str2.lastIndexOf("e",10) + ’\n’); } } Als Ausgabe erhält man: Position: Position: Position: Position: c MM 8 14 24 8 Joachim Lammarsch, Rothenberg (j000350.tex) 267 Java-Schulung Beispiel: /* Zählen der Zeichen in einer beliebigen Zeichenkette */ public class Zk010 { public static void main(String [] args) { // Definieren der Zeichenkette String zk = "Das ist eine Zeichenkette. "; // Feld für alle Unicode-Zeichen anlegen int [] zkZaehler = new int[65536]; int i; // Bsp.: A hat im Unicode die Position 65, dann liefert // charAt(i) den Buchstaben A und zk.charAt(i) ist der // Feldindex für den Zähler des Buchstabens A, also 65 for(i=0;i<zk.length();i++) zkZaehler[zk.charAt(i)]++; c MM Joachim Lammarsch, Rothenberg (j000350.tex) 268 Java-Schulung for(i=0;i<zkZaehler.length;i++) if(zkZaehler[i]>0) System.out.println((char)i + " [" + i + "] " + zkZaehler[i]); } } Als Ausgabe erhält man: . D Z a c e h i k n s t [32] 4 [46] 1 [68] 1 [90] 1 [97] 1 [99] 1 [101] 6 [104] 1 [105] 3 [107] 1 [110] 2 [115] 2 [116] 3 c MM Joachim Lammarsch, Rothenberg (j000350.tex) 269 Java-Schulung 9.2 Dynamische Zeichenketten Durch die Klasse String werden keine dynamischen Zeichenketten implementiert. Nach der Initialisierung einer Zeichenkette bleiben deren Länge und Inhalt konstant. 9.2.1 Konstruktoren Syntax: StringBuffer(); Erzeugt einen leeren StringBuffer. StringBuffer(String zeichenkette); Erzeugt ein neues StringBuffer-Objekt, durch Kopieren der Zeichenkette zeichenkette. c MM Joachim Lammarsch, Rothenberg (j000350.tex) 270 Java-Schulung 9.2.2 Methoden 9.2.2.1 Einfügen von Elementen append hängt an das StringBuffer-Objekt eine Zeichenkette an und insert fügt eine Zeichenkette ein. Syntax: StringBuffer append(String zeichenkette); StringBuffer insert(int position, String zeichenkette); 9.2.2.2 Konvertieren in eine Zeichenkette Mit dieser Methode kann ein StringBuffer-Objekt in ein String-Objekt verwandelt werden. Syntax: String toString(); c MM Joachim Lammarsch, Rothenberg (j000350.tex) 271 Java-Schulung Beispiel: public class Zk020 { public static void main(String [] args) { String zk1= "Das eine"; String zk2= "ist"; String zk3= "Zeichenkette"; String zk4; StringBuffer zkb = new StringBuffer(zk1); zkb.insert(4,zk2); System.out.println(zkb); zkb.insert(7," "); System.out.println(zkb); zkb.append(" "); zkb.append(zk3); System.out.println(zkb); zk4=zkb.toString(); c MM Joachim Lammarsch, Rothenberg (j000350.tex) 272 Java-Schulung System.out.println(zk4); } } Als Ausgabe erhält man: Das Das Das Das c MM isteine ist eine ist eine Zeichenkette ist eine Zeichenkette Joachim Lammarsch, Rothenberg (j000350.tex) 273 Java-Schulung Beispiel: public class Zk021 { public static void main(String args[]) { int i=1234; double d=3.14159; StringBuffer s1 = new StringBuffer("abcde"); System.out.println("i: " + i); System.out.println("s1: " + s1); s1=s1.append(i); System.out.println("s1: " + s1); s1=s1.insert(0,d); System.out.println("s1: " + s1); } } c MM Joachim Lammarsch, Rothenberg (j000350.tex) 274 Java-Schulung Als Ausgabe erhält man: i: s1: s1: s1: c MM 1234 abcde abcde1234 3.14159abcde1234 Joachim Lammarsch, Rothenberg (j000350.tex) 275 Java-Schulung 9.2.2.3 Länge eines StringBuffer-Objekts length liefert die Länge des Objekts. Syntax: int length(); 9.2.2.4 Verändern von Elementen eines StringBuffer-Objekts setCharAt ersetzt das an der Position position stehende Zeichen durch das Zeichen z. Syntax: void setCharAt(int position, char z); c MM Joachim Lammarsch, Rothenberg (j000350.tex) 276 Kapitel 10 Mathematische Methoden Die Klasse java.lang.Math enthält Funktionen zur Gleitkomma-Arithmetik. Alle Methoden dieser Klasse sind von Typ static und können daher ohne zugehöriges Objekt verwendet werden. Die Konstanten e (Eulersche Zahl) und π (Kreiszahl) werden von der Klasse zur Verfügung gestellt. 277 Java-Schulung 10.1 Winkelfunktionen Die Klasse java.lang.Math stellt die üblichen Winkelfunktionen und ihre Umkehrungen zur Verfügung. Winkelwerte werden dabei im Bogenmaß übergeben. Beispiel: public class Math01 { public static void main(String [] args) { System.out.println( Math.PI ); System.out.println( Math.sin(Math.PI/2.) ); System.out.println( Math.asin(1.) ); System.out.println( Math.cos(Math.PI/2.) ); System.out.println( Math.acos(1.) ); System.out.println( Math.tan(Math.PI/2.) ); System.out.println( Math.atan(1.) ); } c MM Joachim Lammarsch, Rothenberg (j000450.tex) 278 Java-Schulung } Als Ausgabe erhält man: 3.141592653589793 1.0 1.5707963267948966 6.123031769111886E-17 0.0 1.6331778728383844E16 0.7853981633974483 c MM Joachim Lammarsch, Rothenberg (j000450.tex) 279 Java-Schulung 10.2 Minimum und Maximum Die Methoden min und max erwarten zwei numerische Werte als Argument und geben den kleineren bzw. größeren von beiden zurück. Beispiel: public class Math03 { public static void main(String [] args) { int a=3,b=5; float c=3.F,d=5.F; System.out.println( Math.min(a,b) ); System.out.println( Math.max(a,b) ); System.out.println( Math.min(c,d) ); System.out.println( Math.max(c,d) ); } } c MM Joachim Lammarsch, Rothenberg (j000450.tex) 280 Java-Schulung Als Ausgabe erhält man: 3 5 3.0 5.0 c MM Joachim Lammarsch, Rothenberg (j000450.tex) 281 Java-Schulung 10.3 Arithmetik Die nachfolgend aufgelisteten Methoden dienen zur Ausführung folgender arithmetischer Operationen: • Quadratwurzel einer Gleitkommazahl, • Exponentialfunktion zur Basis e, • natürlicher Logarithmus, • Potenzieren einer Gleitpunktzahl mit einer Gleitpunktzahl. Beispiel: public class Math02 { public static void main(String [] args) { System.out.println( Math.sqrt(4.) ); System.out.println( Math.exp(1.) ); System.out.println( Math.log(2.) ); System.out.println( Math.pow(2.,5.) ); } } c MM Joachim Lammarsch, Rothenberg (j000450.tex) 282 Java-Schulung Als Ausgabe erhält man: 2.0 2.718281828459045 0.6931471805599453 32.0 c MM Joachim Lammarsch, Rothenberg (j000450.tex) 283 Java-Schulung 10.4 Runden und Abschneiden Mit Hilfe der Methode abs wird der absolute Betrag eines numerischen Wertes bestimmt. ceil liefert die kleinste ganze Zahl größer oder gleich dem übergebenen Argument. Äquivalent liefert floor die größte ganze Zahl kleiner oder gleich dem übergebenen Argument. Mit Hilfe von round kann ein Wert gerundet werden. Beispiel: public class Math05 { public static void main(String [] args) { float a=3.4F, b=3.6F; System.out.println( System.out.println( System.out.println( System.out.println( System.out.println( System.out.println( Math.ceil(a) ); Math.ceil(b) ); Math.floor(a) ); Math.floor(b) ); Math.round(a) ); Math.round(b) ); } c MM Joachim Lammarsch, Rothenberg (j000450.tex) 284 Java-Schulung } Als Ausgabe erhält man: 4.0 4.0 3.0 3.0 3 4 Wie man auch hier wieder sieht, wird durch den Datentyp des übergebenen Arguments die Methode bestimmt, die zum Berechnen verwendet wird. Ein Beispiel für die sinnvolle Anwendung von überlagerten Methoden. c MM Joachim Lammarsch, Rothenberg (j000450.tex) 285 Java-Schulung Beispiel: public class Math04 { public static void main(String [] args) { int a=3, b=-5; float c=3.F, d=-5.F; System.out.println( System.out.println( System.out.println( System.out.println( Math.abs(a) Math.abs(b) Math.abs(c) Math.abs(d) ); ); ); ); } } Als Ausgabe erhält man: 3 5 3.0 5.0 c MM Joachim Lammarsch, Rothenberg (j000450.tex) 286 Java-Schulung 10.5 Zufallszahlen Mit Hilfe der Methode random erzeugt man eine Zufallszahl zwischen 0.0 und 1.0. public class Math06 { public static void main(String [] args) { System.out.println( Math.random() ); System.out.println( Math.random() ); System.out.println( Math.random() ); System.out.println( Math.random() + "\n"); // Simulieren eines System.out.println( System.out.println( System.out.println( System.out.println( Würfels (int)(Math.random()*100000)%6+1 (int)(Math.random()*100000)%6+1 (int)(Math.random()*100000)%6+1 (int)(Math.random()*100000)%6+1 ); ); ); ); } } c MM Joachim Lammarsch, Rothenberg (j000450.tex) 287 Java-Schulung Ausgabe: 0.3141913506943965 0.5097704406491489 0.1805366288803688 0.8388583417197011 3 1 1 5 c MM Joachim Lammarsch, Rothenberg (j000450.tex) 288 Kapitel 11 Exceptions 11.1 Behandlung von Laufzeitfehlern Mit den Exceptions existiert in Java ein Mechanismus zur Behandlung von Laufzeitfehlern. Die Behandlung von Ausnahmen erfolgt mit Hilfe der try...catch-Anweisung. Syntax: try { Anweisung; ... } 289 Java-Schulung catch(Ausnahmetyp x) { Anweisung; ... } Der try-Block enthält eine oder mehrere Anweisungen, bei deren Ausführung eine Exception des Typs Ausnahmetyp auftreten kann. In diesem Fall wird innerhalb des catch-Blocks fortgefahren. c MM Joachim Lammarsch, Rothenberg (j000400.tex) 290 Java-Schulung Beispielsweise ist das folgende Programm fehlerhaft: Beispiel: public class Exc001 { public static void main(String[] args) { int a, c, i; a=60; for(i=4;i>=-4;i--) { c=a/i; System.out.println("Quotient: " + c); } } } c MM Joachim Lammarsch, Rothenberg (j000400.tex) 291 Java-Schulung Als Ausgabe erhält man: Quotient: Quotient: Quotient: Quotient: Exception 15 20 30 60 in thread "main" java.lang.ArithmeticException: / by zero at Exc001.main(Exc001.java:11) Das Programm wird abgebrochen, da versucht wird, durch die Zahl 0 zu dividieren. Dieser Versuch löst eine Arithmetic-Exception aus. c MM Joachim Lammarsch, Rothenberg (j000400.tex) 292 Java-Schulung Durch Einschließen des Programmteils, der den Fehler verursacht, in eine try...catchAnweisung, kann dies vermieden werden. public class Exc002 { public static void main(String[] args) { int a=60, c, i; try { for(i=4;i>=-4;i--) { c=a/i; System.out.println("Quotient: " + c); } } catch(ArithmeticException e) { System.out.println("Division durch Null."); } } } c MM Joachim Lammarsch, Rothenberg (j000400.tex) 293 Java-Schulung Als Ausgabe erhält man: Quotient: 15 Quotient: 20 Quotient: 30 Quotient: 60 Division durch Null. Der Fehler tritt immer noch auf. Das Programm fängt ihn aber ab und gibt eine Fehlermeldung aus. c MM Joachim Lammarsch, Rothenberg (j000400.tex) 294 Java-Schulung 11.2 Das Fehlerobjekt In der catch-Anweisung wird ein formaler Parameter angegeben, der beim Auftreten der Ausnahme ein Fehlerobjekt übernehmen soll. Dieses Objekt enthält Informationen über die Art des aufgetretenen Fehlers. Die Methode setMessage erzeugt einen Fehlertext über die Art des aufgetretenen Fehlers, und printStackTrace gibt einen Auszug aus dem Laufzeitstack aus. Syntax: public String getMessage(); public void printStackTrace(); Beispiel: public class Exc003 { public static void main(String[] args) { int a, c, i; a=60; c MM Joachim Lammarsch, Rothenberg (j000400.tex) 295 Java-Schulung try { for(i=4;i>=-4;i--) { c=a/i; System.out.println("Quotient: " + c); } } catch(ArithmeticException e) { System.out.println("Ein Fehler ist aufgetreten!\n" + "Die Ursache ist: " + e.getMessage()); System.out.println("\nStacktrace:"); e.printStackTrace(); } } } c MM Joachim Lammarsch, Rothenberg (j000400.tex) 296 Java-Schulung Als Ausgabe erhält man: Quotient: 15 Quotient: 20 Quotient: 30 Quotient: 60 Ein Fehler ist aufgetreten! Die Ursache ist: / by zero Stacktrace: java.lang.ArithmeticException: / by zero at Exc003.main(Exc003.java:13) c MM Joachim Lammarsch, Rothenberg (j000400.tex) 297 Java-Schulung 11.3 Fortfahren von Fehlern Tritt eine Ausnahme auf, muß nicht zwangsläufig das Programm beendet werden. Setzt man beispielsweise alle try...catch-Anweisungen in die Schleife, fährt das Programm nach einem Fehler fort und versucht die nächste Division durchzuführen. Beispiel: public class Exc004 { public static void main(String[] args) { int a, c, i; a=60; for(i=4;i>=-4;i--) { try { c=a/i; System.out.println("Quotient: " + c); c MM Joachim Lammarsch, Rothenberg (j000400.tex) 298 Java-Schulung } catch(ArithmeticException e) { System.out.println("Division durch Null."); } } } } Als Ausgabe erhält man: Quotient: 15 Quotient: 20 Quotient: 30 Quotient: 60 Division durch Null. Quotient: -60 Quotient: -30 Quotient: -20 Quotient: -15 c MM Joachim Lammarsch, Rothenberg (j000400.tex) 299 Java-Schulung 11.4 Mehrere catch-Klauseln Es ist möglich, daß ein Programm auf mehrere Fehler reagieren muß. Dies ist möglich, indem man mehrere catch-Klauseln verwendet. Jede catch-Klausel fängt die Fehler ab, die zum Typ des angegebenen Fehlerobjekts passen. Beispiel: public class Exc005 { public static void main(String[] args) { int c, i, j; int [] a = {60,120}; for(i=3;i>=-3;i--) { for(j=0;j<=2;j++) { try { c=a[j]/i; c MM Joachim Lammarsch, Rothenberg (j000400.tex) 300 Java-Schulung System.out.println("Quotient: " + c); } catch(ArithmeticException e1) { System.out.println("-- ArithmeticException: " + e1.getMessage()); } catch(IndexOutOfBoundsException e2) { System.out.println("-- IndexOutOfBoundsException: " + e2.getMessage()); } } } } } c MM Joachim Lammarsch, Rothenberg (j000400.tex) 301 Java-Schulung Als Ausgabe erhält man: Quotient: 20 Quotient: 40 -- IndexOutOfBoundsException: 2 Quotient: 30 Quotient: 60 -- IndexOutOfBoundsException: 2 Quotient: 60 Quotient: 120 -- IndexOutOfBoundsException: 2 -- ArithmeticException: / by zero -- ArithmeticException: / by zero -- IndexOutOfBoundsException: 2 Quotient: -60 Quotient: -120 -- IndexOutOfBoundsException: 2 Quotient: -30 Quotient: -60 -- IndexOutOfBoundsException: 2 Quotient: -20 Quotient: -40 -- IndexOutOfBoundsException: 2 c MM Joachim Lammarsch, Rothenberg (j000400.tex) 302 Java-Schulung 11.5 Die finally-Klausel Die try...catch-Anweisung besitzt als optionale Möglichkeit die finally-Klausel, die als letzter Bestandteil einer try...catch-Anweisung verwendet werden kann. Sie wird immer aufgerufen, wenn die try-Klausel ausgeführt wurde, ganz gleich welches Ereignis dafür verantwortlich war. Beispiel: public class Exc006 { public static void main(String[] args) { int a=60, c, i; try { for(i=4;i>=-4;i--) { c=a/i; System.out.println("Quotient: " + c); } c MM Joachim Lammarsch, Rothenberg (j000400.tex) 303 Java-Schulung } catch(ArithmeticException e) { System.out.println("Division durch Null."); } finally { System.out.println("Eine Exception wurde aufgerufen."); } } } Als Ausgabe erhält man: Quotient: 15 Quotient: 20 Quotient: 30 Quotient: 60 Division durch Null. Eine Exception wurde aufgerufen. c MM Joachim Lammarsch, Rothenberg (j000400.tex) 304 Java-Schulung 11.6 Exceptions bei der Eingabe Bei der Eingabe wird die IOException bereits vom Java-Compiler abgefangen, d.h. wenn keine Exception codiert wurde, wird ein Fehler erzeugt. Beispiel: public class Inpt01 { public static void main(String args[]) { char ch=’ ’; System.out.println("Geben Sie a, b oder c!"); try { ch=(char)System.in.read(); } catch(java.io.IOException e) { System.out.println("Fehlerhafte Eingabe!"); System.exit(4); c MM Joachim Lammarsch, Rothenberg (j000400.tex) 305 Java-Schulung } switch(ch) { case ’a’: System.out.println("Eingabe: " + ch); break; case ’b’: System.out.println("Eingabe: " + ch); break; case ’c’: System.out.println("Eingabe: " + ch); break; default: System.out.println("falsche Eingabe: " + ch); } System.exit(0); } } c MM Joachim Lammarsch, Rothenberg (j000400.tex) 306 Java-Schulung 11.7 Deklaration von Exceptions mit throws Wenn keine explizite Behandlung mittels try und catch vorgesehen ist, müssen zumindest die möglichen Fehler deklariert werden. Beispiel: public class Inpt02 { public static void main(String args[]) throws java.io.IOException { char ch=’ ’; System.out.println("Geben Sie ein Zeichen ein!"); ch=(char)System.in.read(); System.out.println("Das Zeichen ist: " + ch); System.exit(0); } } c MM Joachim Lammarsch, Rothenberg (j000400.tex) 307 Kapitel 12 Eingabe 12.1 Eingabe von Zeichenketten Bei den ersten Versionen von Java gab es nur byteorientierte Datenströme. Mit Java 1.1 wurde diese Einschränkung abgeschafft. Zusätzlich zu den byteorientierten Klassen InputStream und OutputStream wurden die zeichenorientierten Klassen Reader und Writer eingeführt. Beispiel: import java.io.*; public class Zkin01 308 Java-Schulung { public static void main(String args[]) { InputStreamReader inrd=new InputStreamReader(System.in); BufferedReader bfrd=new BufferedReader(inrd); String strg= new String(); try { do { System.out.print("> "); strg=bfrd.readLine(); System.out.println("Echo: " + strg); } while((strg!=null)&(strg.length()>0)); } catch (IOException e) { System.out.println("Fehler bei der Eingabe."); System.exit(4); c MM Joachim Lammarsch, Rothenberg (j000420.tex) 309 Java-Schulung } System.exit(0); } } Als Ausgabe erhält man: > Das Echo: > Das Echo: > Das Echo: > Echo: c MM ist Das ist Das ist Das die ist die ist die ist 1. Zeile die 1. Zeile 2. Zeile die 2. Zeile 3. Zeile die 3. Zeile Joachim Lammarsch, Rothenberg (j000420.tex) 310 Java-Schulung 12.2 Lesen von Dateien Wenn man Dateien einlesen möchte, kann man ebenfalls mit BufferedReader arbeiten. Allerdings wird dieser auf einem FileReader aufgesetzt. Beispiel: import java.io.*; public class Dain01 { public static void main(String args[]) { String strg= new String(); if(args.length<1) System.exit(2); try { FileReader fird=new FileReader(args[0]); BufferedReader bfrd=new BufferedReader(fird); c MM Joachim Lammarsch, Rothenberg (j000420.tex) 311 Java-Schulung while( (strg=bfrd.readLine()) != null) { System.out.println(strg); } } catch (IOException e) { if(e instanceof FileNotFoundException) System.out.println("Datei existiert nicht."); else System.out.println("Fehler bei der Eingabe."); System.exit(4); } System.exit(0); } } c MM Joachim Lammarsch, Rothenberg (j000420.tex) 312 Kapitel 13 Erstellung eigener Pakete Hierzu wird die Anweisung package verwendet, die als erste Anweisung im Programm stehen muß. package Paketname; Beispiel: Datei A.java im Unterverzeichnis demo: package demo; public class A { 313 Java-Schulung public void hello() { System.out.println("Hier ist A"); } } c MM Joachim Lammarsch, Rothenberg (j000500.tex) 314 Java-Schulung Datei B.java im Unterverzeichnis demo: package demo; public class B { public void hello() { System.out.println("Hier ist B"); } } Datei C.java im Unterverzeichnis demo/tools: package demo.tools; public class C { public void hello() { System.out.println("Hier ist C"); } } c MM Joachim Lammarsch, Rothenberg (j000500.tex) 315 Java-Schulung Hauptprogramm – Datei paket.java: import demo.*; import demo.tools.*; public class paket { public static void main(String[] args) { (new A()).hello(); (new B()).hello(); (new C()).hello(); } } Es genügt die Datei paket.java zu übersetzen, der Compiler übersetzt automatisch alle noch nicht übersetzten Quellen und bindet die entstehenden class-Dateien ein. c MM Joachim Lammarsch, Rothenberg (j000500.tex) 316 Java-Schulung 13.1 Das Default-Paket In Java gibt es ein Default-Paket, welches genau dann verwendet wird, wenn keine anderen Paket-Zuordnungen für eine Klasse getroffen wurden. Die Klassen des Default-Paketes können ohne explizite import-Anweisung verwendet werden. Jedes beliebige Unterverzeichnis kann die Rolle des Default-Paketes übernehmen, d.h. es können beliebig viele Default-Pakete erzeugt werden. 13.2 Das public-Attribut Damit eine Klasse A eine andere Klasse B einbinden darf, muß eine der beiden folgenden Bedingungen erfüllt sein: • entweder gehören A und B zu demselben Paket oder • die Klasse B wurde als public deklariert. Wenn nur Default-Pakete verwendet werden, liegen beide Klassen im selben Paket und die public-Deklaration ist überflüssig. Werden jedoch Klassen aus externen Paketen eingebunden, so müssen diese public sein. c MM Joachim Lammarsch, Rothenberg (j000500.tex) 317 Java-Schulung 13.3 Namensraum von Paketen Basierend auf der Plattformunabhängigkeit von Java wurde für die Pakete ein Namensraum definiert, der internetweit mögliche Namenskollisionen von Klassen und Paketen vermeiden soll. Dazu wird die jeweilige Internet-Domain des Unternehmens in umgekehrter Reihenfolge vor den Paketnamen gestellt. Bei einem Unternehmen Namens markt.de heißt also die Klasse wirtschaft.personal dann vollständig de.markt.wirtschaft.personal Dies bedingt natürlich, daß sich das Paket wirtschaft beispielsweise im Verzeichnis usr/classes/de/markt/wirtschaft befindet. Ganz offensichtlich lassen sich verschiedene Abteilungen des Unternehmens ebenfalls problemlos in diesem Namensraum abbilden. c MM Joachim Lammarsch, Rothenberg (j000500.tex) 318 Kapitel 14 Attribute von Klassen, Methoden und Variablen Die Attribute definieren die Eigenschaften von Klassen, Methoden und Variablen. Sie haben insbesondere Einfluß auf Lebensdauer, Sichtbarkeit und Veränderbarkeit dieser Elemente. 14.1 private • Elemente des Typs privat sind lediglich in der Klasse selbst sichtbar. Für abgeleitete Klassen und für Aufrufer von Objekten der Klasse (Instanzen) bleiben privateVariablen und -Methoden verdeckt. • privat-Elemente sollten immer dann verwendet werden, wenn implementierungsabhängige Details zu verstecken sind, die auch in abgeleiteten Klassen nicht sichtbar sein sollen. 319 Java-Schulung 14.2 protected • Elemente des Typs protected sind in der Klasse selbst und in abgeleiteten Klassen sichtbar. Für Aufrufer von Objekten der Klasse (Instanzen) sind protected-Variablen und -Methoden nur dann verwendbar, wenn sie in dem selben Paket definiert wurden. • protected-Elemente sind vor Zugriffen von außen geschützt, können aber von abgeleiteten Klassen verwendet werden. • Werden Variablen und Methoden ohne eines der drei Attribute private, protected oder public definiert, so entspricht ihr Verhalten im wesentlichen dem von Elementen des Typs protected. 14.3 public • Elemente des Typs public sind im Rahmen ihrer Lebensdauer überall sichtbar. Sie können daher von den Methoden in der eigenen Klasse und von beliebigen anderen Klassen verwendet werden. Das Attribut public ist zusätzlich auch bei der Klassendefinition selbst von Bedeutung, denn nur Klassen, die als public definiert wurden, sind außerhalb des Paketes sichtbar, in dem sie definiert wurden. • public-Elemente bilden die für alle sichtbaren Teile einer Klassendefinition und können daher als ihre Schnittstelle angesehen werden. In jeder Quelldatei darf nur eine Klasc MM Joachim Lammarsch, Rothenberg (j000600.tex) 320 Java-Schulung se mit dem Attribut public angelegt werden. 14.4 static • Varaiblen und Methoden mit dem Attribut public sind nicht an die Existenz eines konkreten Objekts gebunden, sonder existieren vom Laden der Klasse bis zum Beenden des Programms. Das static-Attribut beeinflußt bei Instanzmerkmalen ihre Lebensdauer und erlaubt bei Methoden den Aufruf, ohne daß der Aufrufer ein Objekt der Klasse besitzt, in der die Methode definiert wurde. • Wird das Attribut static nicht verwendet, so sind Varaiblen innerhalb einer Klasse immer an eine konkrete Instanz gebunden. Ihre Lebensdauer beginnt mit dem Anlegen des Objekts und dem Aufruf eines Konstruktors und endet mit der Freigabe des Objekts durch den Garbage Collector. 14.5 final • Variablen mit dem Attribut final dürfen nicht verändert werden, sind also als Konstanten anzusehen. Methoden des Typs final dürfen nicht überlagert werden; ebensowenig dürfen Klassen des Typs final zur Ableitung neuer Klassen verwendet werden. • Falls eine Methode oder Klasse das Attribut final besitzt kann der Compiler in der Regel c MM Joachim Lammarsch, Rothenberg (j000600.tex) 321 Java-Schulung auf die dynamische Methodensuche verzichten, final-Methoden können daher schneller aufgerufen werden als normale Methoden. Einige der bei Java mitgelieferten Klassen sind aus diesem Grund als final deklariert, ein Beispiel hierfür ist die Klasse String. Dies führt aber gleichzeitig dazu, daß diese Klassen nicht mehr erweitert werden können. c MM Joachim Lammarsch, Rothenberg (j000600.tex) 322 Kapitel 15 Die Wrapper-Klassen Zu jedem primitiven Datentyp gibt es eine korrespondierende Wrapper-Klasse. Diese kapselt die primitive Variable in einer objektorientierten Hülle und stellt eine Reihe von Methoden zum Zugriff auf die Variable zur Verfügung. Die Anwendung einer Wrapper-Klasse kann sinnvoll sein, bei der • Übergabe von Objekten per Referenz an eine Methode, damit lassen sich Parameter aus Methoden an den Aufrufer zurückgeben, • Erweiterung des Pakets java.util. Hierin werden eine Reihe von Verbundklassen zur Verfügung gestellt, die beliebige Objekte speichern können. Für elementare Typen müssen anstelle der primitiven Typen ihre Wrapper-Klassen verwendet werden. Wrapper-Klassen existieren zu allen numerischen Typen und zu den Typen char und boolean. 323 Java-Schulung 15.1 Korrespondierende primitive Typen Wrapper-Klasse Byte Short Integer Long Double Float Boolean Character Void 15.2 Primitiver Typ byte short int long double float boolean char void Instanzierung der Wrapper-Klasse Die Instanzierung einer Wrapper-Klasse kann meist auf zwei unterschiedliche Arten erfolgen: • Übergabe des korrespondierenden primitiven Typs an den Konstruktor, um ein Objekt desselben Wertes zu erzeugen, • Übergabe eines Strings an den Konstruktor und anschließende Konvertierung in den gewünschten primitiven Typ, um damit die Wrapper-Klasse zu initialisieren. c MM Joachim Lammarsch, Rothenberg (j000600.tex) 324 Java-Schulung 15.3 Konstruktoren public Integer(int i); public Integer(String s); throws NumberFormatException; public Long(long l); public Long(String s); throws NumberFormatException; public Float(float f); public Float(double d); public Float(String s); throws NumberFormatException; public Double(double d); public Double(String s); throws NumberFormatException; public Boolean(boolean b); public Boolean(String s); c MM Joachim Lammarsch, Rothenberg (j000600.tex) 325 Java-Schulung public Character(char c); 15.4 Rückgabe eines Wertes Wie man sieht besitzen die meisten Wrapper-Klassen zwei Methoden, um einen Wert zurückzugeben. • Eine Methode liefert den Wert passend zum korrespondierenden Grundtyp. Hierzu wird ein Name bestehend aus dem Basistyp und der Erweiterung Value gebildet, z.B. intValue, charValue, booleanValue. Die numerischen Methoden intValue, longValue, floatValue und doubleValue stehen dabei für alle numerischen Wrapper-Klassen zur Verfügung. • Die andere Methode liefert den Wert als String, ihr Name ist toString. Sie steht in allen Wrapper-Klassen zur Verfügung. public public public public public public c MM boolean booleanValue(); char charValue(); int intValue(); long longValue(); float floatValue(); double doubleValue(); Joachim Lammarsch, Rothenberg (j000600.tex) 326 Java-Schulung public String toString(); 15.5 Numerische Konstanten Die numerische Wrapper-Klassen stellen Konstanten zur Bezeichnung spezieller Elemente zur Verfügung. Es gibt in jeder der Klassen Byte, Short, Integer, Long, Float und Double die Konstanten MIN_VALUE und MAX_VALUE, die das kleinste bzw. größte Element des Wertebereichs wiedergeben. In den Klassen Float und Double gibt es zusätzlich die Konstanten NEGATIVE_INFINITY, POSITIVE_INFINITY und NaN. Sie stellen die Werte −∞, +∞ und „undefiniert“ dar. c MM Joachim Lammarsch, Rothenberg (j000600.tex) 327 Kapitel 16 Interfaces (Schnittstellen) Interfaces dienen dazu Methodendeklarationen von mehreren Klassen zu vererben. Ein Interface ist ein besondere Form einer Klasse, die ausschließlich die Definition von Methoden und Konstanten enthält, nicht aber ihre Implementierung, sogenannte abstrakte Objekte. Syntax: public interface Interface-Name { ... } 328 Java-Schulung Beispiel: public interface Forbewegungsmittel { public int kapazitaet(); public double kilometerpreis(); } c MM Joachim Lammarsch, Rothenberg (j000600.tex) 329 Java-Schulung Das Interface muß in der Klasse implementiert werden, hier zu dient der Befehl implement. Hierbei wird überprüft, ob zu allen abstrakten Methoden auch die zugehörigen Implentationen vorhanden sind. Syntax: public class Klassen-Name implements Interface-Name { ... } c MM Joachim Lammarsch, Rothenberg (j000600.tex) 330 Java-Schulung Beispiel: public class Auto implements Forbewegungsmittel { public String name; public int erstzulassung; public int leistung; public int anzahlsitze; public double spritverbrauch; public double spritpreis; public int kapazitaet(); { return anzahlsitze; } public double kilometerPreis(); { return spritverbrauch*spritpreis/100; } } c MM Joachim Lammarsch, Rothenberg (j000600.tex) 331 Java-Schulung Ebenso wie die Klasse Auto könnte auch jede andere Klasse das Interface Fortbewegungsmittel implementieren und Konkretisierungen der beiden Methode vornehmen. Eine andere Klasse, die in keinem Zusammenhang mit der Klasse Auto und ihrer Vererbungshierarchie steht, könnte ebenfalls das Interface implementieren, beispielsweise die Klasse Teppich. Weiter gilt: • Auch abgeleitete Klassen können Interfaces implementieren. • Eine Klasse kann eine beliebige Anzahl von Interfaces implementieren. • Interfaces lassen sich vererben. Interfaces kann man als Typvereinbarung ansehen. Eine Klasse, die dieses Interface implementiert ist dann vom Typ dieses Interfaces. Wegen der Mehrfachvererbung von Interfaces kann eine Instanzvariable damit insbesondere mehrere Typen haben und zu mehr als einem Typen zuweisungskompatibel sein. c MM Joachim Lammarsch, Rothenberg (j000600.tex) 332 Java-Schulung 16.1 Konstanten in Interfaces Neben abstrakten Methoden können Interfaces auch Konstanten, also Variablen mit den Attributen static oder final, enthalten. Mit der Implementierung dieses Interfaces in einer Klasse, erbt sie alle diese Konstanten. In einem größeren Programm mit sehr vielen Konstanten kann es nützlich sein, alle Konstantendefinitionen aus den einzelnen Klassen in einem Interface zusammenzufassen. Die Konstanten können dann statt mit Klasse.Name direkt mit ihrem Namen aufgerufen werden. c MM Joachim Lammarsch, Rothenberg (j000600.tex) 333 Kapitel 17 Applets Statt der Methode main() bei Java-Applikationen wird für Applets die Steuerung verschiedener Ereignisse beispielsweise Initialisierung, Bildschirmausgabe, Tastatur- und Mausbewegungen benötigt. Diese Interaktion muß mit dem Browser erfolgen, der die entsprechenden Methoden aufrufen muß. Daher sind alle Applets Ableitungen der Klasse Applet, die die Methoden als Platzhalter vordefiniert hat. Syntax: public public public public void void void void init() { ... } start() { ... } stop() { ... } destroy() { ... } 334 Java-Schulung 17.1 Applets und der Internet-Browser Benutzeraktion im Browser Starte Browser Lade HTML-Seite Verlasse HTML-Seite Lade HTML-Seite erneut Beende Browser c MM Joachim Lammarsch, Rothenberg Browseraktion mit Applet (Methoden) – Init, Start Stop Start Stop, Destroy (j000700.tex) 335 Java-Schulung Java-Programme (Applikationen) und Java-Applets unterscheiden sich gar nicht so stark voneinander. Sie werden mit denselben Werkzeugen und Techniken konstruiert. Vereinfacht kann man sagen, daß • Java-Applikationen sind eigenständige Programme sind, die zur Ausführung den StandAlone-Java-Interpreter benötigen, • während Java-Applets werden aus HTML-Seiten heraus aufgerufen und benötigen zur Ausführung einen Web-Browser. Die Kommunikation zwischen einem Applet und seinem Browser läuft über Methodenaufrufe ab. Die aus dem Applet abgeleitete Klasse ist dafür verantwortlich die Methoden zu überlagern und mit der erforderlichen Funktionalität auszustatten. 17.1.1 Instanzierung des Applets Hierzu ruft der Browser ein Objekt der abgeleiteten Applet-Klasse auf, den parameterlosen Default-Konstruktor: Syntax: public Applet(); c MM Joachim Lammarsch, Rothenberg (j000700.tex) 336 Java-Schulung 17.1.2 Initialisierung des Applets Nach der Instanzierung ruft der Browser die Methode init auf, um dem Applet die Möglichkeit zu geben, Initialisierungen vorzunehmen: Syntax: public void init(); 17.1.3 Starten des Applets Nachdem die Initialisierung abgeschlossen ist, wird die Methode start aufgerufen, um die Ausführung des Applets zu starten: Syntax: public void start(); Das Starten eines Applets kann mehrfach erfolgen. Wenn der Browser eine andere Web-Seite lädt, wird das Applet nur gestoppt. Beim erneuten Aufruf der Seite wird die Methode start erneut aufgerufen. c MM Joachim Lammarsch, Rothenberg (j000700.tex) 337 Java-Schulung 17.1.4 Stoppen des Applets Durch Aufrufen der Methode stop zeigt der Browser dem Applet an, daß es gestoppt werden soll: Syntax: public void stop(); Da ein Applet mehrfach gestartet und gestoppt werden darf, dürfen keine Resourcen entfernt werden, die bei einem eventuellen Neustart wieder benötigt werden. 17.1.5 Zerstören des Applets Wenn ein Applet nicht mehr benötigt wird, beispielsweise beim Beenden des Browsers, ruft der Browser die Methode destroy auf: Syntax: public void destroy(); Diese kann überlagert werden, um auch noch Aufräumarbeiten zu erledigen. c MM Joachim Lammarsch, Rothenberg (j000700.tex) 338 Java-Schulung 17.1.6 Einbinden eines Applets Die Einbindung eines Applets in ein HTML-Dokument erfolgt unter Verwendung des AppletTags. Syntax: <APPLET CODE="Klassenname.class" WIDTH=nnn HEIGHT=nnn> Falls das Applet nicht aufgerufen werden kann erscheint dieser Text. </APPLET> c MM Joachim Lammarsch, Rothenberg (j000700.tex) 339 Java-Schulung 17.2 Ein erstes Beispiel 17.2.1 Der Java-Kode import java.awt.*; public class Appl01 extends java.applet.Applet { public void init() { super.init(); System.out.println("Init()"); } public void start() { System.out.println("Start()"); } public void stop() { System.out.println("Stop()"); c MM Joachim Lammarsch, Rothenberg (j000700.tex) 340 Java-Schulung } public void destroy() { System.out.println("Destroy()"); } public void paint() { System.out.println("Paint()"); } } c MM Joachim Lammarsch, Rothenberg (j000700.tex) 341 Java-Schulung 17.2.2 Zugehöriger HTML-Code <HTML> <HEAD> <TITLE> Hello! </TITLE> </HEAD> <BODY> Hier ist unser Test: <p> <APPLET CODE="Appl01.class" WIDTH=500 HEIGHT=300> </APPLET> </BODY> </HTML> c MM Joachim Lammarsch, Rothenberg (j000700.tex) 342 Java-Schulung 17.3 Ein zweites Beispiel Beispiel: import java.awt.*; public class Helo01 extends java.applet.Applet { public void paint (Graphics g) { g.drawString("Hallo, viel Erfolg mit Java!",50,100); } } c MM Joachim Lammarsch, Rothenberg (j000700.tex) 343 Java-Schulung 17.4 Schriften Veränderungen der Schrift sowie Schriftgröße und Schriftart geschehen mittels des FontObjekts. Syntax: Font name = new Font("schriftname", Font.schriftart, groesse); In der Methode paint wird die Schrift aktiviert. Ebenso kann eine andere Farbe gewählt werden. Syntax: g.setFont(name) g.setColor(Color.farbe) c MM Joachim Lammarsch, Rothenberg (j000700.tex) 344 Java-Schulung Beispiel: import java.awt.*; public class Helo02 extends java.applet.Applet { Font f = new Font("TimesRoman",Font.BOLD,36); public void paint(Graphics g) { g.setFont(f); g.setColor(Color.red); g.drawString("Hallo Applet!",5,40); } } c MM Joachim Lammarsch, Rothenberg (j000700.tex) 345 Java-Schulung Beispiel: import java.awt.*; public { Font Font Font Font class Text03 extends java.applet.Applet f = new Font("TimesRoman",Font.PLAIN,36); fb = new Font("TimesRoman",Font.BOLD,36); fi = new Font("TimesRoman",Font.ITALIC,36); fbi = new Font("TimesRoman",Font.BOLD+Font.ITALIC,36); public void paint(Graphics g) { g.setFont(f); g.drawString("Normal",10,50); g.setFont(fb); g.drawString("Fett",10,100); g.setFont(fi); g.drawString("Schräg",10,150); g.setFont(fbi); g.drawString("Fett und Schräg",10,200); } } c MM Joachim Lammarsch, Rothenberg (j000700.tex) 346 Java-Schulung 17.5 Parameterübergabe Die Übergabe von Parametern an Applets erfolgt in zwei Teilen durch eine Zeichenkette mit einem frei wählbaren Namen und dem Wert des Parameters. Syntax: name = getParameter ("name") Wird kein Parameterwert in der HTML-Datei definiert, gibt getParamter den Wert null zurück. Beispiel: import java.awt.*; public class Helo03 extends java.applet.Applet { Font f = new Font("TimesRoman",Font.BOLD,18); String name; public void init() { c MM Joachim Lammarsch, Rothenberg (j000700.tex) 347 Java-Schulung name=getParameter("name"); if (name==null) name="Java-Programmierer"; name="Hallo " + name + "!"; } public void paint(Graphics g) { g.setFont(f); g.setColor(Color.blue); g.drawString(name,5,40); } } c MM Joachim Lammarsch, Rothenberg (j000700.tex) 348 Java-Schulung wird aufgerufen mit <HTML> <HEAD> <TITLE> Hello! </TITLE> </HEAD> <BODY> Hier ist unser Test: <p> <APPLET CODE="Helo03.class" WIDTH=300 HEIGHT=150> </APPLET> <p> <APPLET CODE="Helo03.class" WIDTH=300 HEIGHT=150> <PARAM NAME=name VALUE="Kursleiter"> </APPLET> </BODY> </HTML> c MM Joachim Lammarsch, Rothenberg (j000700.tex) 349 Java-Schulung 17.6 Verwendung von Farben Veränderungen der Farbe geschieht mit der Klasse Color. Java verwendet ein abstraktes Farbmodell mit 24 Bit Farbtiefe, um Farben als Gemisch aus den Grundtönen Rot, Grün und Blau darzustellen (RGB-Modell). Jede Komponente kann einen Wert zwischen 0 und 255 annehmen. Das abstrakte Farbmodell von Java wird auf das Farbmodell der Plattform abgebildet, auf der das Applet läuft. Syntax: Color.farbname Color name = new Color(rotwert, grünwert, blauwert) c MM Joachim Lammarsch, Rothenberg (j000700.tex) 350 Java-Schulung Objekt-Name Color.white Color.black Color.gray Color.lightGray Color.darkGray Color.red Color.green Color.blue Color.yellow Color.magenta Color.cyan Color.pink Color.orange c MM Joachim Lammarsch, Rothenberg Farbe Weiß Schwarz Grau Hellgrau Dunkelgrau Rot Grün Blau Gelb Magenta Cyan Rosa Orange (j000700.tex) RGB-Wert 255, 255, 255 0, 0, 0 128, 128, 128 192, 192, 192 64, 64, 64 255, 0, 0 0, 255, 0 0, 0, 255 255, 255, 0 255, 0, 255 0, 255, 255 255, 175, 175 255, 200, 0 351 Java-Schulung Beispiel: import java.awt.*; public class Farb01 extends java.applet.Applet { Dimension dim; public void init() { dim=getSize(); System.out.println("Breite: " + dim.width + ", Höhe: " + dim.height); } public void paint(Graphics g) { int i,j,rval,gval,bval; for(i=25;i<dim.height-30;i+=30) for(j=25;j<dim.width-30;j+=30) { c MM Joachim Lammarsch, Rothenberg (j000700.tex) 352 Java-Schulung rval=(int)Math.floor(Math.random()*256); gval=(int)Math.floor(Math.random()*256); bval=(int)Math.floor(Math.random()*256); g.setColor(new Color(rval,gval,bval)); g.fillRect(j,i,25,25); g.setColor(Color.black); g.drawRect(j,i,25,25); } } } c MM Joachim Lammarsch, Rothenberg (j000700.tex) 353 Java-Schulung 17.7 Figuren Beispiel 1: import java.awt.*; public class Figu01 extends java.applet.Applet { public void paint(Graphics g) { g.drawRect(50,50,400,200); g.drawRect(80,60,100,50); g.setColor(Color.red); g.fillRect(200,60,100,50); g.setColor(Color.green); g.fillRect(320,60,100,50); g.setColor(Color.black); g.drawOval(80,125,100,50); g.setColor(Color.cyan); g.fillOval(225,125,50,50); g.setColor(Color.pink); g.fillOval(320,125,100,50); g.setColor(Color.black); g.drawRoundRect(80,190,100,50,20,20); g.setColor(Color.yellow); g.fillRoundRect(200,190,100,50,40,40); g.setColor(Color.blue); c MM Joachim Lammarsch, Rothenberg (j000700.tex) 354 Java-Schulung g.fillRoundRect(320,190,100,50,100,50); } } c MM Joachim Lammarsch, Rothenberg (j000700.tex) 355 Java-Schulung Beispiel 2: import java.awt.*; public class Figu02 extends java.applet.Applet { public void paint(Graphics g) { g.drawRect(50,50,400,200); g.setColor(Color.green); for(int i=60;i<=240;i+=10) g.drawLine(60,i,440,i); for(int i=60;i<=440;i+=10) g.drawLine(i,60,i,240); g.setColor(Color.red); Polygon pg1 = new Polygon(); pg1.addPoint(80,80); pg1.addPoint(100,120); pg1.addPoint(140,120); pg1.addPoint(180,80); g.drawPolygon(pg1); c MM Joachim Lammarsch, Rothenberg (j000700.tex) 356 Java-Schulung Polygon pg2 = new Polygon(); pg2.addPoint(280,80); pg2.addPoint(260,120); pg2.addPoint(340,120); pg2.addPoint(420,80); g.fillPolygon(pg2); g.drawArc(80,160,100,60,0,360); g.drawArc(200,160,100,60,30,270); g.fillArc(320,160,100,60,30,270); } } c MM Joachim Lammarsch, Rothenberg (j000700.tex) 357 Java-Schulung 17.7.1 Befehle für Figuren g.drawLine(x-start, y-start, x-ende, y-ende) g.drawRect(x-linke-ecke, y-linke-ecke, breite, höhe) g.fillRect(x-linke-ecke, y-linke-ecke, breite, höhe) g.drawRoundRect(x-ecke-l, y-ecke-l, breite, höhe, r1, r2) g.fillRoundRect(x-ecke-l, y-ecke-l, breite, höhe, r1, r2) g.draw3DRect(x-ecke-l, y-ecke-l, breite, höhe, boolean) g.drawPolygon(x1, x2, ..., y1, y2, ..., anzahl) g.drawOval(x-linke-ecke, y-linke-ecke, breite, höhe) g.fillOval(x-linke-ecke, y-linke-ecke, breite, höhe) g.drawArc(x-start, y-start, breite, höhe, winkel, wbereich) g.fillArc(x-start, y-start, breite, höhe, winkel, wbereich) objektname.addPoint(x, y) g.copyarea(x-quelle, y-quelle, breite, höhe, x-ziel, y-ziel) g.clearRect(x-linke-ecke, y-linke-ecke, breite, höhe) c MM Joachim Lammarsch, Rothenberg (j000700.tex) 358 Java-Schulung 17.8 Einbinden von Bildern Beispiel: import java.awt.*; import java.net.*; public class Bild01 extends java.applet.Applet { Image bild; URL url; Dimension dim; public void init() { System.out.println("INIT - Anfang"); try { url=new URL(getCodeBase(), "images/world.gif"); } catch(MalformedURLException e) c MM Joachim Lammarsch, Rothenberg (j000700.tex) 359 Java-Schulung { System.out.println(e); } System.out.println("URL: " + url); bild=getImage(url); System.out.println("INIT - Ende"); } public void paint(Graphics g) { int iw=bild.getWidth(this); int ih=bild.getHeight(this); g.drawImage(bild,30,30,iw,ih,this); g.drawImage(bild,30,180,iw*2,ih*2,this); g.drawImage(bild,220,30,iw*4,ih*4,this); } } c MM Joachim Lammarsch, Rothenberg (j000700.tex) 360 Java-Schulung 17.9 Threads Beispiel: import java.awt.*; import java.util.*; public class Zeit01 extends java.applet.Applet implements Runnable { Font theFont = new Font("TimesRoman",Font.BOLD,24); GregorianCalendar theDate; Thread runner; public void start() { if(runner==null) { runner=new Thread(this); runner.start(); } } c MM Joachim Lammarsch, Rothenberg (j000700.tex) 361 Java-Schulung public void stop() { if(runner!=null) { runner.stop(); runner=null; } } public void run() { while(true) { repaint(); try { Thread.sleep(1000); } catch(InterruptedException e) { System.out.println(e); c MM Joachim Lammarsch, Rothenberg (j000700.tex) 362 Java-Schulung } } } public void paint(Graphics g) { theDate=new GregorianCalendar(); g.setFont(theFont); g.drawString(" " + theDate.getTime(), 10, 50); } } c MM Joachim Lammarsch, Rothenberg (j000700.tex) 363 Java-Schulung 17.10 Ereignisse Beispiel mit Schaltknöpfen: import java.awt.*; public class Butt01 extends java.applet.Applet { public void init() { Button bu1 = new Button("Taste1"); Button bu2 = new Button("Taste2"); Button bu3 = new Button("Taste3"); add(bu1); add(bu2); add(bu3); } } c MM Joachim Lammarsch, Rothenberg (j000700.tex) 364 Java-Schulung Beispiel 2: import java.awt.*; import java.awt.event.*; public class { Button bu1 Button bu2 Button bu3 Butt02 extends java.applet.Applet = new Button("Taste1"); = new Button("Taste2"); = new Button("Taste3"); Label l = new Label(" "); class Bl implements ActionListener { public void actionPerformed(ActionEvent e) { l.setText("Die " + e.getActionCommand() + " wurde angeklickt!."); } } Bl al = new Bl(); c MM Joachim Lammarsch, Rothenberg (j000700.tex) 365 Java-Schulung public void init() { add(bu1); bu1.addActionListener(al); add(bu2); bu2.addActionListener(al); add(bu3); bu3.addActionListener(al); add(l); } } c MM Joachim Lammarsch, Rothenberg (j000700.tex) 366 Java-Schulung Beispiel 3: import java.awt.*; import java.awt.event.*; public class Pan001 extends java.applet.Applet { TextField tx1 = new TextField("Textfeld1",20); TextField tx2 = new TextField("Textfeld2",20); TextField tx3 = new TextField("Textfeld3",20); Checkbox kr1 = new Checkbox("Markierung1"); Checkbox kr2 = new Checkbox("Markierung2"); Checkbox kr3 = new Checkbox("Markierung3"); Button bu1 = new Button("Taste1"); Button bu2 = new Button("Taste2"); Button bu3 = new Button("Taste3"); Label la1 = new Label("Label1"); Label la2 = new Label("Label2"); Label la3 = new Label("Label3"); c MM Joachim Lammarsch, Rothenberg (j000700.tex) 367 Java-Schulung Choice aw1 = new Choice(); Choice aw2 = new Choice(); Choice aw3 = new Choice(); class Tl implements ActionListener { public void actionPerformed(ActionEvent e) { System.out.println("\nTextfeld-Ereignis:"); System.out.println(e.getActionCommand()); System.out.println(e.getModifiers()); System.out.println(e.paramString()); } } Tl tl = new Tl(); class Il implements ItemListener { public void itemStateChanged(ItemEvent e) { System.out.println("\nAnkreuzfeld-Ereignis:"); c MM Joachim Lammarsch, Rothenberg (j000700.tex) 368 Java-Schulung System.out.println(e.getItem()); System.out.println(e.getItemSelectable()); System.out.println(e.getStateChange()); System.out.println(e.paramString()); } } Il il = new Il(); class Bl implements ActionListener { public void actionPerformed(ActionEvent e) { System.out.println("\nSchaltaste-Ereignis:"); System.out.println(e.getActionCommand()); System.out.println(e.getModifiers()); System.out.println(e.paramString()); } } Bl al = new Bl(); class Cl implements ItemListener { c MM Joachim Lammarsch, Rothenberg (j000700.tex) 369 Java-Schulung public void itemStateChanged(ItemEvent e) { System.out.println("\nAuswahlfeld-Ereignis:"); System.out.println(e.getItem()); System.out.println(e.getItemSelectable()); System.out.println(e.getStateChange()); System.out.println(e.paramString()); } } Cl cl = new Cl(); public void init() { add(la1); add(tx1); tx1.addActionListener(tl); add(kr1); kr1.addItemListener(il); add(bu1); bu1.addActionListener(al); add(la2); c MM Joachim Lammarsch, Rothenberg (j000700.tex) 370 Java-Schulung add(tx2); tx2.addActionListener(tl); add(kr2); kr2.addItemListener(il); add(bu2); bu2.addActionListener(al); add(la3); add(tx3); tx3.addActionListener(tl); add(kr3); kr3.addItemListener(il); add(bu3); bu3.addActionListener(al); aw1.addItem("Möglichkeit aw1.addItem("Möglichkeit aw1.addItem("Möglichkeit aw1.addItem("Möglichkeit add(aw1); aw1.addItemListener(cl); aw2.addItem("Möglichkeit c MM Joachim Lammarsch, Rothenberg (j000700.tex) 1-1"); 1-2"); 1-3"); 1-4"); 2-1"); 371 Java-Schulung aw2.addItem("Möglichkeit aw2.addItem("Möglichkeit aw2.addItem("Möglichkeit add(aw2); aw2.addItemListener(cl); aw3.addItem("Möglichkeit aw3.addItem("Möglichkeit aw3.addItem("Möglichkeit aw3.addItem("Möglichkeit add(aw3); aw3.addItemListener(cl); 2-2"); 2-3"); 2-4"); 3-1"); 3-2"); 3-3"); 3-4"); } } c MM Joachim Lammarsch, Rothenberg (j000700.tex) 372 Java-Schulung Beispiel 4: import java.awt.*; import java.awt.event.*; public class Sreg01 extends java.applet.Applet { // Anlegen der Beschriftungen Scrollbar sc1 = new Scrollbar(Scrollbar.VERTICAL,0,1,0,15); Scrollbar sc2 = new Scrollbar(Scrollbar.VERTICAL,0,1,0,15); Scrollbar sc3 = new Scrollbar(Scrollbar.VERTICAL,0,1,0,15); class Sl1 implements AdjustmentListener { public void adjustmentValueChanged(AdjustmentEvent e) { System.out.println("\nScrollfeld-Ereignis 1:"); System.out.println(e.getAdjustable()); System.out.println(e.getAdjustmentType()); System.out.println(e.paramString()); System.out.println(e.getValue()); } c MM Joachim Lammarsch, Rothenberg (j000700.tex) 373 Java-Schulung } Sl1 sl1 = new Sl1(); class Sl2 implements AdjustmentListener { public void adjustmentValueChanged(AdjustmentEvent e) { System.out.println("\nScrollfeld-Ereignis 2:"); System.out.println(e.getAdjustable()); System.out.println(e.getAdjustmentType()); System.out.println(e.paramString()); System.out.println(e.getValue()); } } Sl2 sl2 = new Sl2(); class Sl3 implements AdjustmentListener { public void adjustmentValueChanged(AdjustmentEvent e) { System.out.println("\nScrollfeld-Ereignis 3:"); System.out.println(e.getAdjustable()); c MM Joachim Lammarsch, Rothenberg (j000700.tex) 374 Java-Schulung System.out.println(e.getAdjustmentType()); System.out.println(e.paramString()); System.out.println(e.getValue()); } } Sl3 sl3 = new Sl3(); public void init() { add(sc1); sc1.addAdjustmentListener(sl1); add(sc2); sc2.addAdjustmentListener(sl2); add(sc3); sc3.addAdjustmentListener(sl3); } } c MM Joachim Lammarsch, Rothenberg (j000700.tex) 375 Inhaltsverzeichnis 1 Einleitung 1.1 Geschichte . . . . . . . . . . . . . . . . . . . 1.2 Was ist Java? . . . . . . . . . . . . . . . . . 1.3 Wie arbeitet Java? . . . . . . . . . . . . . . . 1.4 Einführungsbeispiel 1 . . . . . . . . . . . . . 1.5 Einführungsbeispiel 1b . . . . . . . . . . . . 1.6 Einführungsbeispiel 1c . . . . . . . . . . . . 1.7 Der Zeichensatz . . . . . . . . . . . . . . . . 1.8 Besondere Zeichen- und Zeichenkettenobjekte 1.9 Einführungsbeispiel 2 . . . . . . . . . . . . . 1.10 Einführungsbeispiel 2b . . . . . . . . . . . . 1.11 Bearbeitung eines Java-Programms . . . . . . 376 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 6 8 9 10 14 16 18 19 20 25 28 Java-Schulung I Prozedurale Programmierung mit Java 29 2 Bezeichner, Variablen, Kommentare 2.1 Bezeichner . . . . . . . . . . . . . 2.2 Variablen . . . . . . . . . . . . . . 2.2.1 Initialisierung von Variablen 2.2.2 Schlüsselworte . . . . . . . 2.3 Kommentare . . . . . . . . . . . . . 2.3.1 Zeilenkommentare . . . . . 2.3.2 Blockkommentare . . . . . 2.3.3 HTML-Kommentare . . . . . . . . . . . . 30 30 32 33 34 35 36 37 38 . . . . . . . . . 40 40 41 47 49 49 50 51 53 54 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Datentypen und Konstanten 3.1 Datentypen . . . . . . . . . . . . . . . . . . . . 3.1.1 Ganze Zahlen . . . . . . . . . . . . . . . 3.1.2 Gleitkomma-Zahlen (Gleitpunkt-Zahlen) 3.1.3 Boolsche Zahlen . . . . . . . . . . . . . 3.1.4 Zeichen . . . . . . . . . . . . . . . . . . 3.2 Datentyp-Umwandlungen . . . . . . . . . . . . . 3.2.1 Aufwand für Konvertierungen . . . . . . 3.3 Literale . . . . . . . . . . . . . . . . . . . . . . 3.3.1 Ganzzahlige Konstanten . . . . . . . . . c MM Joachim Lammarsch, Rothenberg (toc) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 377 Java-Schulung . . . . . . 55 56 57 58 59 60 . . . . . . . . . . . 63 63 65 68 69 70 71 74 74 76 79 93 Verzweigungen 5.1 Entscheidungen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94 94 3.4 4 5 3.3.2 Gleitkomma-Konstanten . . . . . . . . . . 3.3.3 Zeichen-Konstanten . . . . . . . . . . . . 3.3.4 Zeichenketten-Konstanten . . . . . . . . . 3.3.5 Boolsche Konstanten . . . . . . . . . . . . Parameter bei main . . . . . . . . . . . . . . . . . 3.4.1 Konvertierung der Zeichenketten args[n] Operatoren 4.1 Zuweisungsoperator (=) . . . . . . . . . . . . . 4.2 Arithmetische Operatoren . . . . . . . . . . . . 4.2.1 Arithmetik von Gleitkommazahlen . . . 4.2.2 Verkürzte Schreibweisen . . . . . . . . 4.2.3 Inkrement- und Dekrement-Operatoren 4.2.4 Prefix- und Postfix-Operatoren . . . . . 4.3 Vergleichsoperatoren . . . . . . . . . . . . . . 4.4 Logische Operatoren . . . . . . . . . . . . . . 4.4.1 Wahrheitstafeln . . . . . . . . . . . . . 4.4.2 Bitweise Operatoren . . . . . . . . . . 4.4.3 Verkürzte logische Operatoren . . . . . c MM Joachim Lammarsch, Rothenberg (toc) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 378 Java-Schulung 5.2 6 5.1.1 if-Anweisung . . . . . . . . . . . . . . . . . . . . 5.1.2 if-else-Anweisung . . . . . . . . . . . . . . . . 5.1.3 Bedingte Ausdrücke . . . . . . . . . . . . . . . . . 5.1.4 Geschachtelte if- oder if...else-Anweisungen 5.1.5 switch-Anweisung . . . . . . . . . . . . . . . . . . Wiederholungen . . . . . . . . . . . . . . . . . . . . . . . . 5.2.1 while-Anweisung . . . . . . . . . . . . . . . . . . 5.2.2 Geschachtelte while-Anweisungen . . . . . . . . . 5.2.3 do ... while-Anweisung . . . . . . . . . . . . 5.2.4 Geschachtelte do ... while-Anweisungen . . . 5.2.5 for-Anweisung . . . . . . . . . . . . . . . . . . . 5.2.6 Geschachtelte for-Anweisungen . . . . . . . . . . 5.2.7 Weitere Anwendungen für Schleifen . . . . . . . . . 5.2.8 Die Anweisung break . . . . . . . . . . . . . . . . 5.2.9 Die Anweisung continue . . . . . . . . . . . . . 5.2.10 Benannte Schleifen . . . . . . . . . . . . . . . . . . Felder (Arrays oder Vektoren) 6.1 Anlegen eines Feldes . . . . . . . 6.1.1 Deklaration eines Feldes . 6.1.2 Allokierung eines Feldes . 6.1.3 Initialisierung eines Feldes c MM Joachim Lammarsch, Rothenberg (toc) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95 97 104 107 110 118 119 125 128 134 137 144 147 155 160 163 . . . . 168 170 170 171 172 379 Java-Schulung 6.2 6.3 6.1.4 Gleichzeitiges Initialisieren und Anlegen eines Feldes Schleifen und Felder . . . . . . . . . . . . . . . . . . . . . . 6.2.1 Beispiel: Sieb des Eratosthenes . . . . . . . . . . . . 6.2.2 Zeitmessung: Sieb des Eratosthenes . . . . . . . . . . Schleifen und mehrdimensionale Felder . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 173 177 179 194 202 II Objektorientierte Programmierung mit Java 207 7 Java und Klassen 7.1 Deklaration einer Klasse . . . . . . . . . . . . . . . 7.1.1 Deklarationen von Attributen in einer Klasse 7.1.2 Deklarationen von Methoden in einer Klasse 7.1.3 Instanzierung von Objekten . . . . . . . . . 7.1.4 Konstruktoren . . . . . . . . . . . . . . . . . 7.1.5 Übergabe bzw. Rückgabe von Objekten . . . 209 211 212 213 222 232 240 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 Pakete 248 8.1 Verwendung von Paketen . . . . . . . . . . . . . . . . . . . . . . . . . . . . 249 8.2 Vordefinierte Pakete . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 251 9 Zeichenketten 252 9.1 Statische Zeichenketten . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 253 c MM Joachim Lammarsch, Rothenberg (toc) 380 Java-Schulung 9.2 9.1.1 Konstruktoren . . . 9.1.2 Methoden . . . . . Dynamische Zeichenketten 9.2.1 Konstruktoren . . . 9.2.2 Methoden . . . . . 10 Mathematische Methoden 10.1 Winkelfunktionen . . . . 10.2 Minimum und Maximum 10.3 Arithmetik . . . . . . . . 10.4 Runden und Abschneiden 10.5 Zufallszahlen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 Exceptions 11.1 Behandlung von Laufzeitfehlern . . . . . 11.2 Das Fehlerobjekt . . . . . . . . . . . . . 11.3 Fortfahren von Fehlern . . . . . . . . . . 11.4 Mehrere catch-Klauseln . . . . . . . . 11.5 Die finally-Klausel . . . . . . . . . . 11.6 Exceptions bei der Eingabe . . . . . . . . 11.7 Deklaration von Exceptions mit throws c MM Joachim Lammarsch, Rothenberg (toc) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 253 254 270 270 271 . . . . . 277 278 280 282 284 287 . . . . . . . 289 289 295 298 300 303 305 307 381 Java-Schulung 12 Eingabe 308 12.1 Eingabe von Zeichenketten . . . . . . . . . . . . . . . . . . . . . . . . . . . 308 12.2 Lesen von Dateien . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 311 13 Erstellung eigener Pakete 13.1 Das Default-Paket . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13.2 Das public-Attribut . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13.3 Namensraum von Paketen . . . . . . . . . . . . . . . . . . . . . . . . . . . 313 317 317 318 14 Attribute von Klassen, Methoden und Variablen 14.1 private . . . . . . . . . . . . . . . . . . . . . 14.2 protected . . . . . . . . . . . . . . . . . . . 14.3 public . . . . . . . . . . . . . . . . . . . . . 14.4 static . . . . . . . . . . . . . . . . . . . . . . 14.5 final . . . . . . . . . . . . . . . . . . . . . . . . . . . 319 319 320 320 321 321 . . . . . 323 324 324 325 326 327 15 Die Wrapper-Klassen 15.1 Korrespondierende primitive Typen 15.2 Instanzierung der Wrapper-Klasse . 15.3 Konstruktoren . . . . . . . . . . . . 15.4 Rückgabe eines Wertes . . . . . . . 15.5 Numerische Konstanten . . . . . . . c MM Joachim Lammarsch, Rothenberg (toc) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 382 Java-Schulung 16 Interfaces (Schnittstellen) 328 16.1 Konstanten in Interfaces . . . . . . . . . . . . . . . . . . . . . . . . . . . . 333 17 Applets 17.1 Applets und der Internet-Browser . 17.1.1 Instanzierung des Applets 17.1.2 Initialisierung des Applets 17.1.3 Starten des Applets . . . . 17.1.4 Stoppen des Applets . . . 17.1.5 Zerstören des Applets . . 17.1.6 Einbinden eines Applets . 17.2 Ein erstes Beispiel . . . . . . . . . 17.2.1 Der Java-Kode . . . . . . 17.2.2 Zugehöriger HTML-Code 17.3 Ein zweites Beispiel . . . . . . . . 17.4 Schriften . . . . . . . . . . . . . . 17.5 Parameterübergabe . . . . . . . . 17.6 Verwendung von Farben . . . . . 17.7 Figuren . . . . . . . . . . . . . . 17.7.1 Befehle für Figuren . . . . 17.8 Einbinden von Bildern . . . . . . 17.9 Threads . . . . . . . . . . . . . . c MM Joachim Lammarsch, Rothenberg (toc) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 334 335 336 337 337 338 338 339 340 340 342 343 344 347 350 354 358 359 361 383 Java-Schulung 17.10Ereignisse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 364 c MM Joachim Lammarsch, Rothenberg (toc) 384 Java-Schulung c MM Joachim Lammarsch, Rothenberg (toc) 385 Java-Schulung c MM Joachim Lammarsch, Rothenberg (toc) 386 Java-Schulung c MM Joachim Lammarsch, Rothenberg (toc) 387 Java-Schulung c MM Joachim Lammarsch, Rothenberg (toc) 388 Java-Schulung c MM Joachim Lammarsch, Rothenberg (toc) 389 Java-Schulung c MM Joachim Lammarsch, Rothenberg (toc) 390 Java-Schulung c MM Joachim Lammarsch, Rothenberg (toc) 391 Java-Schulung c MM Joachim Lammarsch, Rothenberg (toc) 392