Vorwort
»Mancher glaubt, schon darum höflich zu sein, weil er sich überhaupt noch der Worte und nicht der Fäuste bedient.«
– Friedrich Hebbel (1813–1863)
Am Anfang war das Wort. Viel später, am 23. Mai 1995, stellten auf der SunWorld in San Francisco der Chef des damaligen Science Office von Sun Microsystems, John Gage, und Netscape-Mitbegründer Marc Andreessen die neue Programmiersprache Java und deren Integration in den Webbrowser Netscape vor. Damit begann der Siegeszug einer Sprache, die uns elegante Wege eröffnet, plattformunabhängig zu programmieren und objektorientiert unsere Gedanken auszudrücken. Die Möglichkeiten der Sprache und Bibliotheken sind an sich nichts Neues, aber so gut verpackt, dass Java angenehm und flüssig zu programmieren ist und Java heute zu den populärsten Programmiersprachen auf unserem Planeten zählt. Dieses Buch beschäftigt sich in 23 Kapiteln mit der Java-Technologie und intensiv mit der Programmiersprache Java. Wichtige Themen sind objektorientierte Programmierung, Design von Klassen und der Aufbau der Java-Standardbibliotheken.
Über dieses Buch
Die Zielgruppe
Die Kapitel dieses Buches sind für Einsteiger in die Programmiersprache Java wie auch für Fortgeschrittene konzipiert. Kenntnisse in einer strukturierten Programmiersprache wie C, Delphi oder Visual Basic und Wissen über objektorientierte Technologien sind hilfreich, weil das Buch nicht explizit auf eine Rechnerarchitektur eingeht oder auf die Frage, was Programmieren eigentlich ist. Wer also schon in einer beliebigen Sprache programmiert hat, der liegt mit diesem Buch genau richtig! Objektorientiertes Vorwissen ist von Vorteil, aber nicht notwendig.
Was dieses Buch nicht ist
Dieses Buch darf nicht als Programmierbuch für Anfänger verstanden werden. Wer noch nie programmiert hat und mit dem Wort »Übersetzen« in erster Linie »Dolmetschen« verbindet, der sollte besser ein anderes Tutorial bevorzugen oder parallel lesen. Viele Bereiche aus dem Leben eines Industrieprogrammierers behandelt die »Insel« bis zu einer allgemein verständlichen Tiefe, doch sie ersetzt nicht die Java Language Specification (JLS: http://tutego.de/go/jls).
Die Java-Technologien sind in den letzten Jahren explodiert, sodass die anfängliche Überschaubarkeit einer starken Spezialisierung gewichen ist. Heute ist es kaum mehr möglich, alles in einem Buch zu behandeln, und das möchte ich mit der »Insel« auch auf keinen Fall. Ein Buch, das sich speziell mit der grafischen Oberfläche JavaFX oder Swing beschäftigt – beides Teile von Standard-Java –, ist genauso umfangreich wie die jetzige »Insel«. Nicht anders verhält es sich mit den anderen Spezialthemen, wie etwa objektorientierter Analyse/Design, UML, paralleler oder verteilter Programmierung, Enterprise JavaBeans, Datenbankanbindung, OR-Mapping, Webservices, dynamischen Webseiten und vielen anderen Themen. Hier muss ein Spezialbuch die Neugier befriedigen.
Die »Insel« trainiert die Syntax der Programmiersprache, den Umgang mit den wichtigen Standardbibliotheken, Entwicklungstools und Entwicklungsumgebungen, objektorientierte Analyse und Design, Entwurfsmuster und Programmkonventionen. Sie hilft aber weniger, am Abend auf der Party die hübschen Mädels und coolen IT-Geeks zu beeindrucken und mit nach Hause zu nehmen. Sorry.
Mein Leben und Java – oder warum es noch ein Java-Buch gibt
Meine Beschäftigung mit Java begann vor über 15 Jahren und hängt mit einer universitären Pflichtveranstaltung zusammen. In unserer Projektgruppe befassten wir uns 1997 mit einer objektorientierten Dialogspezifikation. Ein Zustandsautomat musste programmiert werden, und die Frage nach der Programmiersprache stand an. Da ich den Seminarteilnehmern Java vorstellen wollte, arbeitete ich einen Foliensatz für den Vortrag aus. Parallel zu den Folien erwartete der Professor eine Ausarbeitung in Form einer Seminararbeit. Die Beschäftigung mit Java machte mir Spaß und war etwas ganz anderes, als ich bis dahin gewohnt war. Vor Java hatte ich rund zehn Jahre in Assembler kodiert, später dann mit den Hochsprachen Pascal und C, vorwiegend Compiler. Ich probierte aus, schrieb meine Erfahrungen auf und lernte dabei Java und die Bibliotheken kennen. Die Arbeit wuchs mit meinen Erfahrungen. Während der Projektgruppe sprach mich ein Kommilitone an, ob ich nicht Lust hätte, als Referent eine Java-Weiterbildung zu geben. Lust hatte ich – aber keine Unterlagen. So schrieb ich weiter, um für den Kurs Schulungsunterlagen zu haben. Als der Professor am Ende der Projektgruppe nach der Seminararbeit fragte, war die Vorform der »Insel« schon so umfangreich, dass die vorliegende Einleitung mehr oder weniger zur Seminararbeit wurde.
Das war 1997, und natürlich hätte ich mit dem Schreiben sofort aufhören können, nachdem ich die Seminararbeit abgegeben hatte. Doch bis heute macht mir Java immer noch viel Spaß, und ich freue mich auf jede neue Version. Und mit meinem Optimismus bin ich nicht allein: Die Prognosen für Java stehen ungebrochen gut, weil der Einsatz von Java mittlerweile so gefestigt ist wie der von COBOL bei Banken und Versicherungen. Daher wird immer wieder davon gesprochen, Java sei das neue COBOL.
Nach über fünfzehn Jahren sehe ich die »Insel« heute als ein sehr facettenreiches Java-Buch für die ambitionierten Entwickler an, die hinter die Kulissen schauen wollen. Der Detailgrad der »Insel« wird von keinem anderen (mir bekannten) deutsch- oder englischsprachigen Grundlagenbuch erreicht.[ 1 ](Und vermutlich gibt es weltweit kein anderes IT-Fachbuch, das so viele unanständige Wörter im Text versteckt. ) Die Erweiterung der »Insel« macht mir Spaß, auch wenn viele Themen kaum in einem normalen Java-Kurs angesprochen werden.
Software und Versionen
Als Grundlage für dieses Buch dient die Java Platform Standard Edition (Java SE) in der Version 11 in der freien Implementierung OpenJDK, wobei JDK für Java Development Kit steht. Das JDK besteht im Wesentlichen aus einem Compiler und einer Laufzeitumgebung (JVM) und ist für die Plattformen Windows, macOS, Linux und Solaris erhältlich. Ist das System keines der genannten, gibt es Laufzeitumgebungen von anderen Unternehmen bzw. vom Hersteller der Plattform: IBM bietet für IBM System i (ehemals iSeries) zum Beispiel eine eigene Laufzeitumgebung. Die Einrichtung dieser Exoten wird in diesem Buch nicht besprochen.
Eine grafische Entwicklungsoberfläche (IDE) ist kein Teil des JDK. Zwar verlasse ich mich ungern auf einen Hersteller, weil die Hersteller unterschiedliche Entwicklergruppen ansprechen, doch sollen in diesem Buch die freien Entwicklungsumgebungen Eclipse und NetBeans Verwendung finden. Die Beispielprogramme lassen sich grundsätzlich mit beliebigen anderen Entwicklungsumgebungen, wie etwa IntelliJ IDEA oder Oracle JDeveloper, verarbeiten oder mit einem einfachen ASCII-Texteditor – wie Notepad (Windows) oder vi (Unix) – eingeben und auf der Kommandozeile übersetzen. Diese Form der Entwicklung ist allerdings nicht mehr zeitgemäß, sodass ein grafischer Kommandozeilenaufsatz die Programmerstellung vereinfacht.
Welche Java-Version verwenden wir?
Seit Oracle (damals noch von Sun geführt) die Programmiersprache Java 1995 mit Version 1.0 vorstellte, hat sich die Versionsspirale bis Version 14 gedreht, und halbjährlich gibt es eine neue Version. Besonders für Java-Buch-Autoren stellt sich die Frage, auf welcher Java-Version ihr Text aufbauen muss und welche Bibliotheken sie beschreiben sollen. Ich beschreibe immer die Möglichkeiten der neuesten Version, was zur Drucklegung Java 14 war. Für die Didaktik der objektorientierten Programmierung ist die Versionsfrage glücklicherweise unerheblich.
Da viele Unternehmen noch mit der Java-Version 8 entwickeln, wirft die breite Nutzung von Features der Java-Version 14 unter Umständen Probleme auf, denn nicht jedes Beispielprogramm aus der »Insel« lässt sich per Copy & Paste fehlerfrei in das eigene Projekt übertragen. Da Java 10, Java 11 und Java 14 kleine Änderungen an der Sprache mitbringen, kann ein Java-8-Compiler natürlich nicht alles übersetzen. Um das Problem zu entschärfen und um nicht viele Beispiele im Buch ungültig zu machen, werden die Bibliotheksänderungen und Sprachneuerungen bis Java 14 zwar ausführlich in den einzelnen Kapiteln beschrieben, aber die Beispielprogramme in anderen Kapiteln bleiben auf dem Sprachniveau von Java 8 und nutzen zum Beispiel nicht die verkürzte Variablendeklaration mit var oder Switch-Ausdrücke. So laufen mehrheitlich alle Beispielprogramme unter der verbreiteten Version Java 8. Auch wenn die aktuellen Sprachänderungen zu einer Programmverkürzung führen, ist es unrealistisch, anzunehmen, dass jedes Unternehmen sofort auf Java 14 oder das Long-Term-Support-Release Java 11 wechselt – dafür bereitet das Modulsystem aus Java 9 noch zu viele Sorgen, zudem ist Java 11 nach Java 8 das erste Release mit Langzeitunterstützung. Es ist daher nur naheliegend, das Buch für den Großteil der Entwicklergemeinde auszulegen anstatt für ein paar wenige, die sofort mit der neuesten Version arbeiten können.
Das Buch in der Lehre einsetzen
Die »Insel« eignet sich ideal zum Selbststudium. Das erste Kapitel dient zum Warmwerden. Wer auf dem Rechner noch keine Entwicklungsumgebung installiert hat, der sollte zuerst das JDK von Oracle installieren. Weil das JDK nur Kommandozeilentools installiert, sollte jeder Entwickler eine grafische IDE (Integrated Development Environment) installieren, da eine IDE die Entwicklung von Java-Programmen deutlich komfortabler macht. Eine IDE bietet gegenüber der rohen Kommandozeile einige Vorteile:
Das Editieren, Compilieren und Laufenlassen eines Java-Programms sind schnell und einfach über einen Tastendruck oder Mausklick möglich.
Ein Editor sollte die Syntax von Java farbig hervorheben (Syntax-Highlighting).
Eine kontextsensitive Hilfe zeigt bei Methoden die Parameter an, und gleichzeitig verweist sie auf die API-Dokumentation.
Weitere Vorteile wie GUI-Builder, Projektmanagement und Debuggen kommen dazu, spielen in diesem Buch aber keine Rolle.
In der Softwareentwicklung ist die Dokumentation der API-Schnittstellen unerlässlich. Sie ist von der Entwicklungsumgebung aus in der Regel über einen Tastendruck einsehbar oder online zu finden. Unter welcher URL sie verfügbar ist, erklärt ebenfalls Kapitel 1.
Richtig los geht es mit Kapitel 2, und von da an geht es didaktisch Schritt für Schritt weiter. Wer Kenntnisse in C, C# oder C++ hat, kann Kapitel 2 überblättern. Wer schon in C#/C++ objektorientiert programmiert hat, kann Kapitel 3 überfliegen und dann einsteigen. Objektorientierter Mittelpunkt des Buches sind Kapitel 6 und Kapitel 7: Sie vermitteln die OO-Begriffe Klasse, Methode, Assoziation, Vererbung und dynamisches Binden. Nach Kapitel 7 ist die objektorientierte Grundausbildung abgeschlossen, und nach Kapitel 14 sind die Grundlagen von Java bekannt. Es folgen Überblicke in einzelne Bereiche der Java-Standardbibliothek, die ich in meinem Buch »Java SE 9 Standard-Bibliothek« umfassend behandle.
Mit diesem Buch und einer Entwicklungsumgebung des Vertrauens lassen sich die ersten Programme entwickeln. Um eine neue Programmiersprache zu erlernen, reicht das Lesen aber nicht aus. Mit den Übungsaufgaben kann jeder Leser deshalb die eigene Fingerfertigkeit trainieren. Da viele Lösungen unter www.rheinwerk-verlag.de/5141 verfügbar sind, lassen sich die eigenen Ergebnisse gut mit den Musterlösungen vergleichen. Vielleicht bietet die Buchlösung noch eine interessante Lösungsidee oder Alternative an.
Persönliche Lernstrategien
Wer das Buch im Selbststudium nutzt, wird wissen wollen, was eine erfolgreiche Lernstrategie ist. Der Schlüssel zur Erkenntnis ist, wie so oft, die Lernpsychologie, die untersucht, unter welchen Lesebedingungen ein Text optimal verstanden werden kann. Die Methode, die ich vorstellen möchte, heißt PQ4R-Methode, benannt nach den Anfangsbuchstaben der Schritte, die die Methode vorgibt:
Vorschau (Preview): Zunächst sollten Sie sich einen ersten Überblick über das Kapitel verschaffen, etwa durch Blättern im Inhaltsverzeichnis und in den Seiten der einzelnen Kapitel. Schauen Sie sich die Abbildungen und Tabellen etwas länger an, da sie schon den Inhalt verraten und Lust auf den Text vermitteln.
Fragen (Question): Jedes Kapitel versucht, einen thematischen Block zu vermitteln. Vor dem Lesen sollten Sie sich überlegen, welche Fragen das Kapitel beantworten soll.
Lesen (Read): Jetzt geht’s los – der Text wird durchgelesen. Wenn es nicht gerade ein geliehenes Büchereibuch ist, sollten Sie Passagen, die Ihnen wichtig erscheinen, mit vielen Farben hervorheben und mit Randbemerkungen versehen. Das Gleiche gilt für neue Begriffe. Die zuvor gestellten Fragen sollte jeder beantworten können. Sollten neue Fragen auftauchen – im Gedächtnis abspeichern!
Nachdenken (Reflect): Egal, ob motiviert oder nicht – das ist ein interessantes Ergebnis einer anderen Studie –, lernen kann jeder immer. Der Erfolg hängt nur davon ab, wie tief das Wissen verarbeitet wird (elaborierte Verarbeitung). Dazu müssen die Themen mit anderen Themen verknüpft werden. Überlegen Sie, wie die Aussagen mit den anderen Teilen zusammenpassen. Dies ist auch ein guter Zeitpunkt für praktische Übungen. Für die angegebenen Beispiele im Buch sollten Sie sich eigene Beispiele überlegen. Wenn der Autor eine if-Abfrage am Beispiel des Alters beschreibt, wäre eine eigene Idee etwa eine if-Abfrage zur Hüpfballgröße.
Wiedergeben (Recite): Die zuvor gestellten Fragen sollten sich nun beantworten lassen, und zwar ohne den Text. Für mich ist das Schreiben eine gute Möglichkeit, über mein Wissen zu reflektieren, doch sollte dies jeder auf seine Weise tun. Allemal ist es lustig, sich während des Duschens über alle Schlüsselwörter und ihre Bedeutung, den Zusammenhang zwischen abstrakten Klassen und Schnittstellen usw. klar zu werden. Ein Tipp: Lautes Erklären hilft bei vielen Arten der Problemlösung – quatschen Sie einfach mal den Toaster zu. Noch schöner ist es, mit jemandem zusammen zu lernen und sich gegenseitig die Verfahren zu erklären. Eine interessante Visualisierungstechnik ist die Mind-Map. Sie dient dazu, den Inhalt zu gliedern.
Rückblick (Review): Nun gehen Sie das Kapitel noch einmal durch und schauen, ob Sie alles ohne weitere Fragen verstanden haben. Manche »schnellen« Erklärungen haben sich vielleicht als falsch herausgestellt. Vielleicht klärt der Text auch nicht alles. Dann ist ein an mich gerichteter Hinweis (ullenboom@gmail.com) angebracht.
Die PQ4R-Methode erleichtert den Wissenserwerb. Allerdings ist es so wie mit allen gelernten Dingen: Wer Wissen nicht regelmäßig auffrischt, vergisst es. Der PQ4R-Methode sollte daher für einen langfristigen Erfolg ein zusätzliches »R« verpasst werden: »R« für »repeat« oder »refresh«. In der Regel überliest man etwas am Anfang oder schenkt Details kaum Bedeutung. Erst später, wenn mehr Hintergrundwissen vorhanden ist, kann auch Grundlegendes in neuem Licht erscheinen und sich gut zum Gesamtbild fügen. Leser sollten sich daher immer wieder die »Insel« vornehmen und querblättern.
[»] Persönliche Bemerkung
Schreiben ist eine Lernstrategie für mich. Wenn ich mich in neue Gebiete einarbeite, lese ich erst einmal auf Masse und beginne dann, Zusammenfassungen zu schreiben. Erst beim Schreiben wird mir richtig bewusst, was ich noch nicht weiß. Dieses Lernprinzip hat auch zu meinem ersten Buch über Amiga-Maschinensprachprogrammierung geführt. Doch das MC680x0-Buch kam nicht auf den Markt, denn die Verlage teilten mir mit, dass die Zeit der Homecomputer vorbei sei.[ 2 ](Damit verlor ich eine Wette gegen Georg und Thomas – sie durften bei einer großen Imbisskette so viel essen, wie sie wollten. Ich hatte später meinen Spaß, als wir mit dem Auto nach Hause fuhren und dreimal zur Magenleerung anhalten mussten. Jetzt ist das Buch online unter http://retrobude.de/dokumente/amiga-assembler-buch. ) Mit Java war das anders, denn hier war ich zur richtigen Zeit am richtigen Ort.
Fokus auf das Wesentliche
Einige Abschnitte sind für erfahrene Programmierer oder Informatiker geschrieben. Besonders der Neuling wird an einigen Stellen den sequenziellen Pfad verlassen müssen, da spezielle Kapitel mehr Hintergrundinformationen und Vertrautheit mit Programmiersprachen erfordern. Verweise auf JavaScript, C(++), C# oder andere Programmiersprachen dienen aber nicht wesentlich dem Verständnis, sondern nur dem Vergleich.
*-Abschnitte
Das Java-Universum ist reich an Feinheiten und verwirrt Einsteiger oft. Die »Insel« gewichtet aus diesem Grund das Wissen auf zwei Arten. Zunächst gibt es vom Text abgesetzte Boxen, die zum Teil spezielle und fortgeschrittene Informationen bereitstellen. Des Weiteren enden einige Überschriften auf ein *, was bedeutet, dass dieser Abschnitt übersprungen werden kann, ohne dass dem Leser etwas Wesentliches für die späteren Kapitel fehlt.
Organisation der Kapitel
Kapitel 1, »Java ist auch eine Sprache«, zeigt die Besonderheiten der Sprache Java auf. Ich ziehe in ihm einige Vergleiche mit anderen populären objektorientierten Sprachen. Es ist nicht besonders technisch und beschreibt auch den historischen Ablauf der Entwicklung von Java. Das Kapitel ist nicht didaktisch aufgebaut, sodass einige Begriffe erst in den hinteren Kapiteln vertieft werden; Einsteiger sollten es querlesen. Ebenso wird hier dargestellt, wie ein JDK zu beziehen und zu installieren ist, damit die ersten Programme übersetzt und gestartet werden können. Mit einer Entwicklungsumgebung macht es mehr Spaß, daher gibt es auch dazu eine Einführung.
Richtig los geht es in Kapitel 2, »Imperative Sprachkonzepte«. Es hebt Variablen, Typen und die imperativen Sprachelemente hervor und schafft mit Anweisungen und Ausdrücken die Grundlagen für jedes Programm. Hier finden auch Fallanweisungen, die diversen Schleifentypen und Methoden ihren Platz. Das alles geht noch ohne große Objektorientierung.
Objektorientiert wird es dann in Kapitel 3, »Klassen und Objekte«. Dabei kümmern wir uns erst einmal um die in der Standardbibliothek vorhandenen Klassen und entwickeln eigene Klassen später, denn im Mittelpunkt stehen die grundlegenden Konzepte, wie das Schlüsselwort new, Referenzen, die null-Referenz sowie Referenzvergleiche. Die Bibliothek ist so reichhaltig, dass allein mit den vordefinierten Klassen und diesem Basiswissen schon viele Programme entwickelt werden können. Speziell die bereitgestellten Datenstrukturen lassen sich vielfältig einsetzen.
Mehrere Datentypen lassen sich in einem Array zusammenfassen. Kapitel 4, »Arrays und ihre Anwendungen«, stellt das Konzept vor. Arrays stecken auch hinter einigen Java-Konzepten wie variablen Argumentlisten und dem erweiterten for.
Der Grund vieler Probleme ist der gewandelte »Umgang mit Zeichenketten«, den ich in Kapitel 5 vorstelle. Die wichtigen Typen Character (Datentyp für einzelne Zeichen), String und StringBuilder (Datentypen für Zeichenfolgen) werden eingeführt. Bei den Zeichenketten müssen Teile ausgeschnitten, erkannt und konvertiert werden. Ein split(…) vom String und der Scanner zerlegen Zeichenfolgen anhand von Trennern in Teilzeichenketten. Format-Objekte bringen beliebige Ausgaben in ein gewünschtes Format. Dazu gehört auch die Ausgabe von Dezimalzahlen.
Mit diesem Vorwissen über Objekterzeugung und Referenzen kann der nächste Schritt erfolgen: In Kapitel 6 werden wir »Eigene Klassen schreiben«. Anhand von Spielen und Räumen modellieren wir Objekteigenschaften. Wichtige Konzepte – wie Konstruktoren, statische Eigenschaften sowie Aufzählungen – finden dort ihren Platz.
Objektbeziehungen, also Assoziationen zwischen Objekten, die auch Benutzt-Beziehungen genannt werden, sowie Vererbungsbeziehungen, sind das Thema von Kapitel 7, »Objektorientierte Beziehungsfragen«. Das Kapitel führt in die »echte« objektorientierte Programmierung ein und behandelt dynamisches Binden, abstrakte Klassen und Schnittstellen (Interfaces) sowie die Sichtbarkeit. Da Klassen in Java auch innerhalb anderer Klassen liegen können (geschachtelte Klassen), setzt sich ein eigener Abschnitt damit auseinander.
Exceptions, die wir in Kapitel 8, »Ausnahmen müssen sein«, behandeln, bilden ein wichtiges Rückgrat in Programmen, da sich Fehler kaum vermeiden lassen. Da ist es besser, die Behandlung aktiv zu unterstützen und den Programmierer zu zwingen, sich um Fehler zu kümmern und diese zu beheben.
Kapitel 9, »Geschachtelte Typen«, beschreibt, wie sich Klassen ineinander verschachteln lassen. Das verbessert die Kapselung, denn auch Implementierungen können dann sehr lokal sein.
Kapitel 10, »Besondere Typen der Java SE«, geht auf die Klassen ein, die für die Java-Bibliothek zentral sind, etwa Vergleichsklassen, Wrapper-Klassen oder die Klasse Object, die die Oberklasse aller Java-Klassen ist.
Mit Generics lassen sich Klassen, Schnittstellen und Methoden mit einer Art Typ-Platzhalter deklarieren, wobei der konkrete Typ erst später festgelegt wird. Kapitel 11, »Generics<T>«, gibt einen Einblick in die Technik.
Lambda-Ausdrücke gibt es seit Java 8; sie vereinfachen insbesondere das funktionale Programmieren. Wir widmen den Spracheigenschaften Kapitel 12, »Lambda-Ausdrücke und funktionale Programmierung«. Hier lernen Sie auch viele Standardtypen kennen, die bei der funktionalen Programmierung auftauchen.
Danach sind die Fundamente gelegt, und die verbleibenden Kapitel dienen dazu, das bereits erworbene Wissen auszubauen. Kapitel 13, »Architektur, Design und angewandte Objektorientierung«, zeigt Anwendungen guter objektorientierter Programmierung und stellt Entwurfsmuster (Design Patterns) vor. An unterschiedlichen Beispielen demonstriert das Kapitel, wie Schnittstellen und Klassenhierarchien gewinnbringend in Java eingesetzt werden. Es ist der Schlüssel dazu, nicht nur im Kleinen zu denken, sondern auch große Applikationen zu schreiben.
Kapitel 14, »Java Platform Module System«, beantwortet die Frage, wie in Java einzelne Komponenten oder Systeme von Komponenten flexibel für andere Anwendungen eingesetzt werden können. Das Java Platform Module System ist eine zentrale Neuerung von Java 9.
Nach den ersten 14 Kapiteln haben die Leser die Sprache Java nahezu komplett kennengelernt. Da Java aber nicht nur eine Sprache ist, sondern auch ein Satz von Standardbibliotheken, konzentriert sich die zweite Hälfte des Buches auf die grundlegenden APIs. Jeweils am Ende eines Kapitels findet sich ein Abschnitt »Zum Weiterlesen« mit Verweisen auf interessante Internetadressen – in der Java-Sprache finally genannt. Hier kann der Leser den sequenziellen Pfad verlassen und sich einzelnen Themen widmen, da die Themen in der Regel nicht direkt voneinander abhängen.
Die Java-Bibliothek besteht aus mehr als 4.200 Klassen, Schnittstellen, Aufzählungen, Ausnahmen und Annotationen. Kapitel 15, »Die Klassenbibliothek«, (und auch der Anhang) gibt eine Übersicht über die wichtigsten Pakete und greift einige Klassen aus der Bibliothek heraus, etwa zum Laden von Klassen. Hier sind auch Klassen zur Konfiguration von Anwendungen oder Möglichkeiten zum Ausführen externer Programme zu finden.
Kapitel 16 bis Kapitel 21 geben einen Überblick über ausgewählte APIs der Java SE. Die Bibliotheken sind sehr umfangreich, und das aufbauende Expertenbuch »Java SE 9 Standard-Bibliothek. Das Handbuch für Java-Entwickler« vertieft die APIs weiter. Kapitel 16 gibt eine »Einführung in die nebenläufige Programmierung«. Kapitel 17, »Einführung in Datenstrukturen und Algorithmen«, zeigt praxisnah geläufige Datenstrukturen wie Listen, Mengen und Assoziativspeicher. Einen Kessel Buntes bietet Kapitel 18, »Einführung in grafische Oberflächen«, wo es um die Swing-Bibliothek geht. Im Kern steht eine bildgeführte Anleitung, wie sich mit einer Entwicklungsumgebung einfach grafische Oberflächen entwickeln lassen. Darüber, wie aus Dateien gelesen und geschrieben wird, gibt Kapitel 19, »Einführung in Dateien und Datenströme«, einen Überblick. Wer zum Abspeichern von Daten eine relationale Datenbank nutzen möchte, der findet in Kapitel 20, »Einführung ins Datenbankmanagement mit JDBC«, Hilfestellungen. Alle genannten Kapitel geben aufgrund der Fülle nur einen Einblick, und ihre Themen werden in »Java SE 9 Standard-Bibliothek« tiefer aufgefächert. Kapitel 21 stellt »Bits und Bytes, Mathematisches und Geld« vor. Die Klasse Math hält typische mathematische Methoden bereit, um etwa trigonometrische Berechnungen durchzuführen. Mit einer weiteren Klasse können Zufallszahlen erzeugt werden. Auch behandelt das Kapitel den Umgang mit beliebig langen Ganz- oder Fließkommazahlen.
Ein automatischer Test von Anwendungen hilft, Fehler in Code aufzuspüren, insbesondere wenn später dumme Codeänderungen gemacht wurden und sich das Programm nicht mehr konform mit der Spezifikation verhält. Kapitel 22, »Testen mit JUnit«, stellt die Idee der Testfälle vor und demonstriert, wie diese einfach und automatisch ausführbar werden. Zudem setzt das Kapitel den Schwerpunkt auf das Design von testbaren Anwendungen.
Abschließend liefert Kapitel 23, »Die Werkzeuge des JDK«, eine Kurzübersicht der Kommandozeilenwerkzeuge javac zum Übersetzen von Java-Programmen und java zum Starten der JVM und Ausführen der Java-Programme.
Der Anhang, »Java SE-Module und Paketübersicht«, erklärt alle Java-Module und -Pakete kurz mit einem Satz und erläutert zudem alle Typen im absolut essenziellen Paket java.lang.
Konventionen
In diesem Buch werden folgende Konventionen verwendet:
Neu eingeführte Begriffe sind kursiv gesetzt, und der Index verweist genau auf diese Stelle. Des Weiteren sind Dateinamen, HTTP-Adressen, Namen ausführbarer Programme, Programmoptionen und Dateiendungen (.txt) kursiv. Einige Links führen nicht direkt zur Ressource, sondern werden über http://tutego.de/go zur tatsächlichen Quelle umgeleitet, was nachträgliche URL-Änderungen erleichtert.
Begriffe der Benutzeroberfläche stehen in Kapitälchen.
Listings, Methoden und sonstige Programmelemente sind in nichtproportionaler Schrift gesetzt. An einigen Stellen wurde hinter eine Listingzeile ein abgeknickter Pfeil () als Sonderzeichen gesetzt, der den Zeilenumbruch markiert. Der Code aus der nächsten Zeile gehört also noch zur vorangehenden.
Bei Methodennamen und Konstruktoren folgt immer ein Klammerpaar, um Methoden/Konstruktoren von Attributen abgrenzen zu können. So ist bei der Schreibweise System.out und System.gc() klar, dass Ersteres ein Attribut ist und Letzteres eine Methode.
Hat eine Methode bzw. ein Konstruktor einen Parameter, so steht der Typ in Klammern. Beispiele: Math.abs(double a), Point(int x, int y). Oft wird auch der Parametername ausgelassen. Beispiel: »System.exit(int) beendet das Programm mit einem Rückgabewert.« Die Java-API-Dokumentation macht das genauso. Hat eine Methode bzw. ein Konstruktor eine Parameterliste, ist diese aber im Text gerade nicht relevant, wird sie mit »…« abgekürzt. Beispiel: »Die Methode System.out.print(…) konvertiert die übergebenen Argumente in Strings und gibt sie aus.« Ein leeres Klammerpaar bedeutet demnach, dass eine Methode bzw. ein Konstruktor wirklich keine Parameterliste hat. Um die Angabe kurz und dennoch präzise zu machen, gibt es im Text teilweise Angaben wie getProperty(String key[, String def]), was eine Abkürzung für getProperty(String key) und getProperty(String key, String def) ist.
Um eine Gruppe von Methoden anzugeben, symbolisiert die Kennung XXX einen Platzhalter. So steht zum Beispiel printXXX(…) für die Methoden println(…), print(…) und printf(…). Aus dem Kontext geht hervor, welche Methoden gemeint sind.
Lange Paketnamen werden teilweise abgekürzt, sodass com.tutego.insel.game etwa zu c.t.i.g wird.
Um im Programmcode Compilerfehler oder Laufzeitfehler anzuzeigen, steht in der Zeile ein . So ist auf den ersten Blick abzulesen, dass die Zeile nicht compiliert wird oder zur Laufzeit aufgrund eines Programmierfehlers eine Ausnahme auslöst. Beispiel:
int p = new java.awt.Point(); // Compilerfehler: Type mismatch
Bei Compilerfehlern – wie im vorangehenden Punkt – kommen die Fehlermeldungen in der Regel von Eclipse. Sie sind dort anders benannt als in NetBeans bzw. im Kommandozeilencompiler javac. Aber natürlich führen beide Compiler zu ähnlichen Fehlermeldungen.
Raider heißt jetzt Twix, und Sun ging Anfang 2010 an Oracle. Auch wenn es für langjährige Entwickler hart ist: Der Name »Sun« verschwindet, und der geliebte Datenbankhersteller tritt an seine Stelle. Sun taucht immer nur dann auf, wenn es um eine Technologie geht, die von Sun initiiert wurde und zu der Zeit auf den Markt kam, zu der Sun sie verantwortete.
Programmlistings
Komplette Programmlistings sind wie folgt aufgebaut:
class Person {
}
Der abgebildete Quellcode befindet sich in der Datei Person.java. Befindet sich der Typ (Klasse, Aufzählung, Schnittstelle, Annotation) in einem Paket, steht die Pfadangabe beim Dateinamen:
package com.tutego.insel.Person;
class Person { }
Um Platz zu sparen, stellt das Buch oftmals Quellcode-Ausschnitte dar. Der komplette Quellcode ist im Internet verfügbar (https://www.rheinwerk-verlag.de/5141). Wird ein Ausschnitt einer Datei Person.java abgebildet, steht »Ausschnitt« oder »Teil 1«, »Teil 2« ... dabei:
Gibt es Beispielprogramme für bestimmte Klassen, so enden die Klassennamen dieser Programme im Allgemeinen auf Demo. Für die Java-Klasse DateFormat heißt somit ein Beispielprogramm, das die Funktionalität der Klasse DateFormat vorführt, DateFormatDemo.
API-Dokumentation im Buch
Attribute, Konstruktoren und Methoden finden sich in einer speziellen Auflistung, die es ermöglicht, sie leicht im Buch zu finden und die »Insel« als Referenzwerk zu nutzen.
abstract class java.text.DateFormat
extends Format
implements Cloneable, Serializable
Date parse(String source) throws ParseException
Parst einen Datums- oder einen Zeit-String.
Im Rechteck steht der vollqualifizierte Klassen- oder Schnittstellenname (etwa die Klasse DateFormat im Paket java.text) bzw. der Name vom Annotations- oder Aufzählungstyp. In den folgenden Zeilen sind die Oberklasse (DateFormat erbt von Format) und die implementierten Schnittstellen (DateFormat implementiert Cloneable und Serializable) aufgeführt. Da jede Klasse, die keine explizite Oberklasse hat, automatisch von Object erbt, ist diese nicht extra angegeben. Die Sichtbarkeit ist, wenn nicht anders angegeben, public, da dies für Bibliotheksmethoden üblich ist. Wird eine Schnittstelle beschrieben, sind die Methoden automatisch abstrakt und öffentlich, und die Schlüsselwörter abstract und public werden nicht zusätzlich angegeben. In der anschließenden Aufzählung folgen Konstruktoren, Methoden und Attribute. Wenn nicht anders angegeben, ist die Sichtbarkeit public. Sind mit throws Fehler angegeben, dann handelt es sich nicht um RuntimeExceptions, sondern nur um geprüfte Ausnahmen. Veraltete (deprecated) Methoden sind nicht aufgeführt, sie werden lediglich erwähnt, wenn es überhaupt keine Alternative gibt.
Ausführbare Programme
Ausführbare Programme auf der Kommandozeile sind durch ein Dollarzeichen am Anfang zu erkennen (auch wenn andere Betriebssysteme und Kommandozeilen ein anderes Prompt anzeigen). Die vom Anwender einzugebenden Zeichen sind fett gesetzt, die Ausgabe nicht:
$ java FirstLuck
Hart arbeiten hat noch nie jemanden getötet. Aber warum das Risiko auf sich nehmen?
Über die richtige Programmierer-»Sprache«
Die Programmierersprache in diesem Buch ist Englisch, um ein Vorbild für »echte« Programme zu sein. Bezeichner wie Klassennamen, Methodennamen und auch eigene API-Dokumentationen sind auf Englisch, um eine Homogenität mit der englischsprachigen Java-Bibliothek zu schaffen. Zeichenketten und Konsolenausgaben sowie die Zeichenketten in Ausnahmen (Exceptions) sind in der Regel auf Deutsch, da es in realistischen Programmen kaum hart einkodierte Meldungen gibt – spezielle Dateien halten unterschiedliche Landessprachen vor. Zeilenkommentare sind als interne Dokumentation ebenfalls auf Deutsch vorhanden.
Online-Informationen und Aufgaben
Ausführliche Informationen zu diesem Buch liefert das Internet unter den Adressen http://tutego.de/javabuch und https://www.rheinwerk-verlag.de/5141. Die Webseiten informieren umfassend über das Buch und über die kommenden Versionen, etwa Erscheinungsdatum oder Bestellnummer. Der Quellcode der Beispielprogramme ist entweder komplett oder mit den bedeutenden Ausschnitten im Buch abgebildet. Ein ZIP-Archiv mit allen Beispielen ist auf der oben genannten Buch-Webseite erhältlich. Alle Programmteile sind frei von Rechten und können ungefragt in eigene Programme übernommen und modifiziert werden.
Wer eine Programmiersprache erlernen möchte, muss sie wie eine Fremdsprache sprechen. Begleitend gibt es eine Aufgabensammlung unter http://tutego.de/javabuch/aufgaben. Viele Musterlösungen sind dabei. Die Seite wird in regelmäßigen Abständen mit neuen Aufgaben und Lösungen aktualisiert.
Passend zur Online-Version verschließt sich das Buch nicht den Kollaborationsmöglichkeiten des Webs 2.0. Neue Kapitel und Abschnitte des Buches werden immer im Java-Insel-Blog http://tutego.de/blog/javainsel veröffentlicht. So kann jeder Leser – mehrere Monate bevor die Texte überhaupt zum Lektorat und schlussendlich ins Buch wandern – seine Meinung äußern und Kritik üben. Es gibt weltweit nur wenige Autoren, die so konsequent alle Texte ihres Buches vorveröffentlichen und bereit sind, sie in aller Öffentlichkeit zu diskutieren. Der Vorteil für die Leser zahlt sich aus: In den über zwanzig Jahren, seit denen die »Insel« schon existiert, liegt die Anzahl fachlicher Fehler bei fast null.
Neben den reinen Buchaktualisierungen publiziert der Blog auch tagesaktuelle Nachrichten über die Java-Welt und Java-Tools. Google zählt den Insel-Blog weltweit zu den Top-Java-Blogs und platziert ihn seit Jahren auf Platz 1.
Facebook-Nutzer können ein Fan der »Insel« werden (http://tutego.de/go/fb), und Twitter-Nutzer können den Nachrichtenstrom unter http://twitter.com/javabuch abonnieren.
Weiterbildung durch tutego
Unternehmen, die zur effektiven Weiterbildung ihrer Mitarbeiter IT-Schulungen wünschen, können einen Blick auf http://tutego.de/seminare werfen. tutego bietet über dreihundert IT-Seminare zu Java-Themen, C(++), C#/.NET, Softwaredesign, Datenbanken (Oracle, MySQL), XML (XSLT, Schema), Netzwerken, Internet, Office etc. Zu den Java-Themen zählen unter anderem:
Java-Einführung, Java für Fortgeschrittene, Java für Umsteiger, Eclipse
Spring Boot, Spring Framework, Microservices
Java EE, EJB, OR-Mapping mit JPA, Hibernate, JavaServer Faces (JSF)
Android, mobile Entwicklung
Build-Management mit Maven, Hudson/Jenkins
.NET, C#, HTML5/CSS3-Frameworks, Vue, React, Anguar
Danksagungen
Ich war 9 Jahre alt, als mir meine Eltern mit dem C64 den Weg in die Welt der Computer öffneten. Ein Medium zum Speichern der Programme und Daten fehlte mir, und so blieb mir nichts anderes übrig, als nach dem Neustart alles wieder neu einzugeben – auf diesem Weg lernte ich das Programmieren. An meine Eltern einen großen Dank für den Computer, für die Liebe und das Vertrauen.
Dank gebührt Sun Microsystems, die 1991 mit der Entwicklung an Java begannen. Ohne Sun gäbe es kein Java, und ohne Java gäbe es auch nicht dieses Buch. Dank gehört auch der Oracle Company als Käufer von Sun, denn vielleicht wäre ohne die Übernahme Java bald am Ende gewesen.
Die professionellen, aufheiternden Comics stammen von Andreas Schultze (akws@aol.com). Ich danke auch den vielen Buch- und Artikelautoren für ihre interessanten Werke, aus denen ich mein Wissen über Java schöpfen konnte. Ein weiteres Dankeschön geht an verschiedene treue Leser, deren Namen aufzulisten viel Platz kosten würde; ihnen ist die Webseite http://tutego.de/javabuch/korrekteure.html gewidmet.
Java lebt – vielleicht sollte ich sogar »überlebt« sagen – durch viele freie gute Tools und eine aktive Open-Source-Community. Ein Dank geht an alle Entwickler, die großartige Java-Tools, -Bibliotheken und -Frameworks wie Eclipse, Maven, JUnit, Spring, Tomcat oder WildFly schreiben und warten: Ohne sie wäre Java heute nicht da, wo es ist.
Abschließend möchte ich dem Rheinwerk Verlag meinen Dank für die Realisierung und die unproblematische Zusammenarbeit aussprechen. Für die Zusammenarbeit mit meiner Lektorin bin ich sehr dankbar.
Feedback
Auch wenn wir die Kapitel noch so sorgfältig durchgegangen sind, sind bei über 1.200 Seiten Unstimmigkeiten wahrscheinlich, so wie auch jede Software rein statistisch Fehler aufweist. Wer Anmerkungen, Hinweise, Korrekturen oder Fragen zu bestimmten Punkten oder zur allgemeinen Didaktik hat, der sollte sich nicht scheuen, mir eine E-Mail unter der Adresse ullenboom@gmail.com zu senden. Ich bin für Anregung, Lob und Tadel stets empfänglich.
Und jetzt wünsche ich Ihnen viel Spaß beim Lesen und Lernen von Java!
Dortmund im Jahr 2020, Jahr 10 nach der Übernahme durch Oracle[ 3 ](Das war am 17. Januar 2010 zum Preis von 7,4 Milliarden USD. )
Christian Ullenboom
Vorwort zur 15. Auflage
Die letzte Auflage liegt schon eine ganze Zeit zurück. Das ist auch gut so, denn Fehler gibt es so gut wie keine, daher wäre eine Auflage auch nicht zwingend nötig. Zudem lässt sich leider feststellen, dass die Entwicklergemeinde die halbjährlichen Updates nicht wirklich annimmt. Da Oracle lediglich im Dreijahresrhythmus sogenannte Long-Term Support Releases (LTS) veröffentlicht, sind die meisten Unternehmen nicht sonderlich erpicht auf die allerneueste Version, sondern halten sich an die LTS-Versionen; Java 11 ist ein LTS und Java 17 wird auch ein LTS sein. Rund 60 % der Java-Entwicklung wird immer noch in Java 8 vorgenommen, und diese Version stammt vom März 2014, dem Jahr, als die deutschen Fußballer Weltmeister wurden und Südkorea noch kein COVID-19 hatte.
Diese Auflage beschreibt natürlich die Neuerungen von Java 12, Java 13 und Java 14, aber besonders viel Neues ist nicht dabei. Eine der wichtigen Sprachneuerungen sind die sogenannten Switch-Ausdrücke. Das bedeutet, dass eine Konstruktion mit switch auch als Ausdruck eingesetzt werden kann, der Switch-Ausdruck also ein Ergebnis liefern kann.
Kapitel 12, »Lambda-Ausdrücke und funktionale Programmierung«, wurde umfangreich überarbeitet, sodass die Leser einfacher die Konzepte der funktionalen Programmierung verstehen können. In Kapitel 8, »Ausnahmen müssen sein«, wurden einige Abschnitte etwas umsortiert. Schlussendlich wurde Kapitel 22, »Testen mit JUnit«, von JUnit 4 auf JUnit 5 aktualisiert. Hamcrest wurde im Zuge dieser Überarbeitung entfernt und AssertJ etwas genauer beschrieben.
Kapitel 5, »Der Umgang mit Zeichenketten«, wurde etwas ausgedünnt; Teile dieses Kapitels wurden in mein Buch zur Java SE Standard-Bibliothek verschoben. Das gilt auch für einige Spezialitäten der JavaBeans, die nun zu Reflection/Annotationen in mein zweites Buch gewandert sind.
Nach dem Vorwort ist es jetzt an der Zeit, das Leben zwischen den geschweiften Klammern zu genießen und dem griechischen Philosophen Platon zu folgen, der sagte: »Der Beginn ist der wichtigste Teil der Arbeit.«