mitp Professional Java 7 - Das Übungsbuch - Bd. II Über 180 Aufgaben mit vollständigen Lösungen von Elisabeth Jung 1. Auflage Java 7 - Das Übungsbuch - Bd. II – Jung schnell und portofrei erhältlich bei beck-shop.de DIE FACHBUCHHANDLUNG Thematische Gliederung: Objektorientierte Programmierung mitp/bhv 2012 Verlag C.H. Beck im Internet: www.beck.de ISBN 978 3 8266 9203 1 Inhaltsverzeichnis: Java 7 - Das Übungsbuch - Bd. II – Jung Einleitung Java 7 Das Übungsbuch Band II ist die Fortführung von Java 7 Das Übungsbuch Band I, das im Oktober 2011 beim mitp-Verlag erschienen ist. Der erste Band enthält Kapitel zur objektorientierten Programmierung, zur grafischen Darstellung mit dem Abstract Windowing Toolkit (AWT) und Swing, zu inneren Klassen, Generizität, Ausnahmebehandlung, Reflection und zu den Neuerungen dazu durch Java 6 und Java 7. Mit dem zweiten Band kommen weitere Kapitel mit einer ebenso detaillierten Behandlung von Themen wie Dateien und Streams, Threads, Applets, Multimedia und Netzwerkprogrammierung und den jeweiligen Neuerungen durch Java 6 und Java 7 hinzu. Der Schwerpunkt dieses Buches liegt auf einfachen Beispielen, die keine umfangreichen Algorithmen mit der Java-Programmiersprache umsetzen, da immer wieder die Erfahrung gemacht wird, dass diese beim Lernen einer Programmiersprache keine große Hilfe sind. Java 7 Das Übungsbuch Band II bietet sowohl vom Inhalt als auch von der Art und Weise, wie weitere Themen zu der Java-Programmiersprache behandelt werden, eine wichtige Ergänzung zu Band I. Mit dieser Auflage wird das 2. Kapitel komplett neu überarbeitet, um die Neuerungen aus Java 5, 6 und 7 gemäß den Entwicklungen und Abläufen von Multithreading-Applikationen auf Multi-Prozessor- und Multikern-Rechnern in Programmen anzupassen. Gleichzeitig wurden die Kapitel 1 und 7 um die neuen NIO.2-Themen von Java 7 ergänzt: das neue File-System-API und die Erweiterungen der asynchronen I/O. Als Begleitliteratur zum Lernen der Programmiersprache Java wendet es sich nicht nur an Lehrer, Schüler und Studenten, sondern ist auch zum Selbststudium geeignet. Gerade für Anfänger, denen oft Beispiele von Java-Programmen fehlen, die die teilweise komplizierten Ausdrücke im Programmaufbau klarer werden lassen und eine Hilfestellung beim Schreiben von eigenen Programmen bieten, ist dieses Übungsbuch (in Kombination mit einem Lehrbuch) geeignet. Auch in Projektarbeiten kann auf die ausgearbeiteten Details zurückgegriffen werden, wenn tief liegende Fehler schwer zu finden sind. Der Schwerpunkt liegt auch in Band II auf verständlich formulierten Erläuterungen zu den wichtigsten Begriffen der Programmiersprache und den zugrunde liegenden Konzepten. Anhand derer soll der Leser in die Lage versetzt werden, die wesentlichen Merkmale vertiefend zu erlernen. Dazu werden die Beispiele in jedem Kapitel von ganz einfachen Anfangsbeispielen bis hin zu komplexeren Aufgaben erweitert. 21 Einleitung Alle Übungen werden vom ersten Ansatz bis zum Ergebnis vollständig durchgeführt. Die Programm-Codes der Lösungsvorschläge werden mit Kommentaren umfassend erklärt. Großer Wert wird auf die Reihenfolge gelegt, in der die Begriffe definiert und in Beispielen benutzt werden, auch wenn, wie so oft in Java und in vielen anderen Programmiersprachen, die Begriffe so eng miteinander verknüpft sind, dass eine optimale Reihenfolge in ihrer Behandlung nicht immer einfach zu finden ist. Lässt sich eine Abweichung von der vorher gewählten Reihenfolge nicht vermeiden, wird darauf hingewiesen. Wie auch im ersten Band wird den Java-Standard-Klassen mit ihren Feld- und Methoden-Definitionen besonders große Aufmerksamkeit geschenkt. Oft ist es nicht sinnvoll, eigene Methoden oder Klassen zu implementieren, da diese dem Programmierer bereits von der Java-Standard-API zur Verfügung gestellt werden. In solchen Fällen werden diese Methoden und Klassen detailliert beschrieben. Das Buch soll außerdem den Umgang mit der Online-Dokumentation von Java vertiefen. Beide Bände des Java-7-Übungsbuches heben die wichtigsten Änderungen von Java 5, 6 und 7 zu den jeweiligen Themen hervor. Es wird viel mit den mit Java 5 eingeführten und im ersten Band in einem eigenen Kapitel behandelten generischen Klassen und Interfaces gearbeitet und immer wieder auf Beispiele mit parametrisierten Typen von Daten zurückgegriffen. Vorkenntnisse Für die Arbeit mit diesem Buch werden Grundlagen im Bereich der Programmierung und im Umgang mit dem Betriebssystem vorausgesetzt. Es ist ein Übungsbuch, das zusätzlich zu allen Lehrbüchern von Java benutzt werden kann und durch das Lösen der Aufgaben dem Leser die Möglichkeit gibt, den darin enthaltenen Stoff zu vertiefen. Auf einfache, verständliche und zu jeder Thematik aussagekräftige Beispiele wird besonders großer Wert gelegt. So können alle beschriebenen Themen tiefgehend und präzise eingeübt und die dabei erzielten Ergebnisse anhand der Lösungsvorschläge überprüft werden. Die Lektüre des ersten Bandes Java 7 Das Übungsbuch ist nicht zwingend erforderlich, da alle Kapitel von Band II sowohl vollständig unabhängig von diesem als auch unabhängig voneinander bearbeitet werden können. Die in Band I enthaltenen Definitionen und Erläuterungen von Begriffen als auch die Aufgaben selbst können aber in vielen Fällen eine wichtige Hilfe sein. In Band I werden die wichtigsten Grundlagen der Programmiersprache Java und der GUI-Programmierung mit Java behandelt. In Band II finden Sie viele nützliche Ergänzungen dazu. 22 Aufbau des Buches Aufbau des Buches In der Einführung zu jedem einzelnen Kapitel wird der Stoff, der in den Übungsaufgaben dieses Kapitels verwendet wird, kurz beschrieben. Danach folgen die Aufgabenstellungen der Übungen und am Ende des Kapitels Lösungsvorschläge. Alle Kapitel enthalten Wiederholungsaufgaben, in denen die bis dahin definierten Begriffe noch einmal eingesetzt werden müssen. Der Schwierigkeitsgrad der Aufgaben wird wie auch in Band 1 im Aufgabenkopf durch 1 bis 3 Sternchen gekennzeichnet: 1 Sternchen für besonders einfache Aufgaben, die auch von Anfängern leicht bewältigt werden können; 2 Sternchen für etwas kompliziertere Aufgaben, die einen durchschnittlichen Aufwand benötigen; 3 Sternchen für Aufgaben, die sich an geübte Programmierer richten und einen wesentlich höheren Aufwand oder die Kenntnis spezieller Details erfordern. In Kapitel 1 werden die wichtigsten Stream-Klassen von Java in Beispielklassen eingebaut und der Umgang mit File- und URL-Objekten beschrieben, die Dateien bzw. Ressourcen aus dem Internet oder auf dem lokalen Rechner repräsentieren. Es wird auf die Unterschiede zwischen den Datentypen, ihrer Ablage in Dateien oder im Speicher sowie auf ihren Zugriff eingegangen. Byte-Streams und CharacterStreams werden parallel vorgestellt. Dabei wird von Anfang an auf die dazu definierten Klassen sowie auf die Gemeinsamkeiten und Unterschiede beim Erzeugen und beim Zugriff auf diese Streams hingewiesen. Es werden die mit Java 5 eingeführten Klassen Scanner und Formatter, die eine wichtige Rolle bei der Ein- und Ausgabe von Daten spielen, eingesetzt sowie die mit dieser Version neu implementierten Methoden genutzt. Das Kapitel beschreibt zusätzlich, wie Objekt-Serialisierungen vorzunehmen sind und wie die Vergabe einer Versionsnummer für Java-Klassen durchgeführt werden kann. Das mit Java 7 neu implementierte Path-Interface sowie die neue Files-Klasse, die das File-System-API ergänzen, werden parallel zur File-Klasse in neuen Aufgaben angewandt. Mit Java 1.4 wurde mit dem NIO (»new input/output«) ein neues I/O-API eingeführt, das auf Channels basiert. Dieses wurde in Java 7 mit dem NIO.2 erweitert. Der neue Datentyp AsynchronousFileChannel unterstützt mit asynchronen I/OOperationen die Nebenläufigkeit und Skalierbarkeit von Programmen auf MultiProzessor- und Multicore-Architekturen und wird in Beispielen parallel zur streamorientierten Vorgehensweise genutzt. 23 Einleitung Im Kapitel 2 erfolgt nach einer allgemeinen Beschreibung von Java-Threads eine Gegenüberstellung von alten und neuen Synchronisationsmechanismen für Threadabläufe mit impliziten und expliziten Locks. Es wird gezeigt, wie eine direkte Anwendung des synchronized-Schlüsselworts durch eine Benutzung der neuen Klassen und Interfaces aus den mit Java 5 eingeführten Concurrency Utilities vermieden werden kann. Eine besondere Aufmerksamkeit wird auch den Threads von grafischen Benutzeroberflächen zuteil, insbesondere durch die Benutzung der mit Java 6 eingeführten SwingWorker-Klasse. Heutzutage, wo das Einsparen von Rechenzeit generell kein Problem mehr darstellt und auf Multi-Prozessor- und Multicore-Systemen die Nebenläufigkeit von Threadabläufen »in echt« realisierbar ist, sollte ein exklusives Sperren von kritischen Bereichen eher vermieden werden und auf die neueren Modelle von Synchronisation zurückgegriffen werden. Darum wird in vielen Aufgaben auf die Bedeutung von »immutable«-Klassen und die des volatile-Schlüsselworts als Synchronisationsform eingegangen. Dabei werden die wichtige Rolle, die das JMM in der Erstellung von threadsicheren Klassen spielt, und die Erkenntnisse, dass eine unerwünschte Publikation (Veröffentlichung) eines Objekts zu schwer auffindbaren Fehlern führen kann sowie dass das Starten und Beenden eines Threads auch Sichtbarkeitsgarantien mit sich bringt, ebenfalls nicht außer Acht gelassen. Das mit Java 7 neu eingeführte Fork/Join-Framework wurde darauf ausgerichtet, die Vorteile von Multi-Prozessor- und Multikernel-Systemen besonders effizient zu nutzen. Wir zeigen, wie umfangreiche Berechnungen sich in Teilaufgaben untergliedern lassen, um von mehreren Tasks parallel ausgeführt zu werden. In Kapitel 3 werden Applet- und JApplet-Komponenten mit ihren Parallelitäten und Unterschieden zu den in Band I behandelten Frame- und JFrame-Komponenten eingeführt und es wird deren Ausführung innerhalb von HTML-Seiten sowohl mit dem Applet-Viewer als auch in einem Webbrowser geübt. In Kapitel 4 wird auf die von Java bereitgestellten Multimedia-Fähigkeiten für diese Komponenten eingegangen. Die Benutzung von Bild- und Sound-Dateien wird in Fenster- und Applet-Klassen mit vielen Bemerkungen zum Ablauf dargestellt. Dazu werden die Rolle, die der MediaTracker und der ImageObserver beim Laden von Bilddateien spielen, und die Unterschiede beim Einsatz beschrieben und mit Beispielen demonstriert. In Kapitel 5 wird der Einsatz von Threads für Animationen mit vielen einfachen und auch etwas umfangreicheren Klassendefinitionen sowohl für Applet- als auch für Fenster-Komponenten gezeigt und die Synchronisation von Threads und die damit verbundenen »Objekt-« und »Klassen-Sperren« wie auch die Kommunikation zwischen Threads vertieft. Das Kapitel 6 erläutert die Kommunikation zwischen mehreren Applets sowie zwischen einem Applet und dem Webbrowser. Da Applets in erster Linie für den Einsatz im Internet konzipiert wurden, unterliegen sie standardisierten Sicher- 24 Benötigte Software heitsbestimmungen bezüglich Zugriffsrechten, die von einem Sicherheitsmanager überwacht und von Programmen beachtet werden müssen. Wenn im Internet eine Webseite über einen Browser angefordert wird, verbirgt sich dahinter eine Netzwerkkommunikation. Java liefert eine Vielzahl von eingebauten Netzwerkfähigkeiten, die das Entwickeln von Servern und Clients, die über unterschiedliche Protokolle kommunizieren können, möglich machen. Diese werden in Kapitel 7 anhand vielseitiger Beispiele demonstriert. Der Leser wird schon in früheren Kapiteln beim Ausführen von Applets in einem Webbrowser mit einer Client-Server-Kommunikation im Netzwerk konfrontiert, ohne dass dabei direkt darauf hingewiesen wird. In Kapitel 7 werden Server und Clients für die Kommunikation über TCP- und UDP-Transportprotokolle programmiert, URL-Verbindungen näher erläutert und webbasierte Client-Server-Architekturen, die über das http-Protokoll abgewickelt werden, beispielhaft dargestellt. Dabei werden auch die Möglichkeiten für die Realisierung von parallelen Servern sowie die neuen Features von Java 6 und 7 zum Thema Netzwerkprogrammierung beachtet. Auch das Kapitel 7 wurde um die wichtigsten Neuerungen des NIO.2 für eine zuverlässige Client-Server-Kommunikation ergänzt. Das neue Interface NetworkChannel aus dem Paket java.nio.channels gibt die Methoden vor, die von Socket-Klassen für eine auf Channels basierende Kommunikation implementiert werden müssen. Dieses wird sowohl von den synchronen Channel-Klassen ServerSocketChannel, SocketChannel und DatagrammSocket aus Java 1.4 als auch von den neuen asynchronen Channel-Klassen AsynchronousSocketChannel und AsynchronousServerSocketChannel von Java 7 implementiert, die in neuen Beispielklassen, auf die schon vorhandene Aufgaben umgestellt werden, zum Einsatz kommen. Benötigte Software Für die Durchführung der Übungen können Sie das Java Development Kit (JDK) der Java Standard Edition (SE) Version 5.x, 6.x oder 7.x verwenden. Für die Übungen, in denen die Versionen 6.x und 7.x benötigt werden, wird dies in den entsprechenden Aufgabenstellungen angegeben. Das aktuelle JDK der Java SE können Sie sich kostenlos von der Java-Homepage von Sun unter der Adresse http://java.sun.com/javase/downloads/index.jsp herunterladen. Das JDK umfasst sowohl die Software zur Programmerstellung als auch das Java Runtime Environment (JRE) für die Programmausführung. Grafische Entwicklungsoberflächen wie zum Beispiel Eclipse sind weder Voraussetzung noch Bestandteil dieses Buches. Die vorgestellten Programme lassen sich grundsätzlich mit einem einfachen Texteditor wie beispielsweise Notepad++ oder Wordpad eingeben und über die Kommandozeile durch den Aufruf des Programmes javac übersetzen. Das Starten von Applikationen kann durch das Programm 25 Einleitung java erfolgen und Applets können sowohl mit dem Programm appletviewer als auch in einem Webbrowser durch Angabe der dazugehörigen HTML-Datei ausgeführt werden. Die vollständigen Programmaufrufe sind bei jeder Aufgabe angegeben. Selbstverständlich können die Programm- und Klassendateien zum Testen oder Ergänzen auch in eine Entwicklungsumgebung eingebettet werden. Webseite zum Buch Die Webseite zum Buch unter http://www.mitp.de/9203 beinhaltet den plattformunabhängigen Quellcode der Lösungsvorschläge und die für Windows 7 kompilierte ausführbare Version als Download-Archiv. Dort finden Sie alle JavaQuellcodes, übersetzten Klassen sowie Bild- und Sounddateien in einer Verzeichnisstruktur, die mit der im Buch beschriebenen übereinstimmt. Ich wünsche Ihnen weiterhin viel Spaß und Erfolg beim Programmieren mit Java. Elisabeth Jung Autorin Elisabeth Jung ist freie Autorin und wohnhaft in Frankfurt am Main. Nach dem Studium der Mathematik an der Universität Temeschburg (Timisoara) in Rumänien hat die Autorin Grundlagen der Informatik und Fortran unterrichtet. Im Jahr 1982 hat sie bereits eine Aufgabensammlung für Fortran an der gleichen Universität veröffentlicht. Zwischen den Jahren 1984 und 2001 hat Elisabeth Jung bei der Firma Siemens in Frankfurt in einer Vielzahl von Projektarbeiten umfangreiche Erfahrungen gesammelt in den Bereichen Programmiersprachen (Assembler, Fortran, Pascal, C, C++, Java), Datenbanken (Text-Retrieval, relationale Systeme, Client-Server-Architekturen) und der Entwicklung und dem Test von Hardware-naher Systemsoftware. Seit 2001 beschäftigt sie sich mit ihren bevorzugten Themen, der Mathematik und den objektorientierten Programmiersprachen, insbesondere Java. Ihr Buch ist aus der Erfahrung im Unterricht und dem Erlernen von Programmiersprachen entstanden, bei dem insbesondere das eigene Programmieren und die praktische Anwendung des Gelernten eine große Rolle spielt. 26