Java Übungsbuch: Aufgaben mit vollständigen Lösungen für die Versionen Java 8 bis Java 17
Book information
Description
Trainieren Sie Ihre Java-Kenntnisse Learning by Doing anhand praktischer Übungen Mit vollständigen und kommentierten Lösungen Dieses Buch ist kein Lehrbuch, sondern ein reines Übungsbuch und wendet sich an Leser, die ihre Java-Kenntnisse anhand zahlreicher praktischer Übungen durch »Learning by Doing« vertiefen und festigen möchten. Es ist ideal, um sich auf Prüfungen vorzubereiten oder das Programmieren mit Java praktisch zu üben. Jedes Kapitel beginnt mit einer kompakten Zusammenfassung des Stoffs, der in den Übungsaufgaben dieses Kapitels verwendet wird. Anschließend haben Sie die Möglichkeit, zwischen Aufgaben in drei verschiedenen Schwierigkeitsstufen – von einfach bis anspruchsvoll – zu wählen. Anhand dieser Aufgaben können Sie Ihr Wissen praktisch testen. Am Ende der Kapitel finden Sie vollständige und kommentierte Musterlösungen. Es werden folgende Themen abgedeckt: Die Kapitel 1 bis 3 enthalten Aufgaben zur objektorientierten Programmierung mit Java. In Kapitel 4 geht es im Detail um Generics und das Collection Framework, seine generischen Klassen und Interfaces sowie die Definition von Enumerationen. Kapitel 5 erläutert das Exception Handling. Kapitel 6 beschäftigt sich mit den neuen Sprachmitteln von Java 8, Lambdas und Streams. Kapitel 7 bietet einen Einblick in die mit Java 9 vorgenommene Modularisierung der Java-Plattform. In Kapitel 8 werden Weiterentwicklungen aus den Java-Versionen 14 bis 17 behandelt. Dazu gehören die Einführung von Records und Sealed Classes sowie das Pattern Matching (sowohl für den instanceof-Operator als auch für switch). Kapitel 9 enthält viele Aufgaben zu Tests mit JUnit 5 und Gradle sowie eine kurze Einführung in beide Systeme. Nach dem Durcharbeiten des Buches verfügen Sie über fundierte Programmierkenntnisse und einen umfangreichen Fundus an Beispielcode. Aus dem Inhalt: Klassendefinition und Objektinstanziierung Abgeleitete Klassen und Vererbung Abstrakte Klassen und Interfaces Die Definition von Annotationen Innere Klassen Generics und Reflection Lambdas Funktionale Interfaces Switch Expressions Local Variable Type Inference Definition und Nutzung von Streams Das Modulsystem von Java Records Sealed Classes und Interfaces Pattern Matching für den instanceof-Operator Pattern Matching für switch Tests mit JUnit 5 und Gradle Impressum Einleitung Vorkenntnisse Aufbau des Buches Benötigte Software Downloads Autorin Kapitel 1: Klassendefinition und Objektinstanziierung 1.1 Klassen und Objekte Aufgabe 1.1: Definition einer Klasse Aufgabe 1.2: Objekt (Instanz) einer Klasse erzeugen 1.2 Das Überladen von Methoden Aufgabe 1.3: Eine Methode überladen 1.3 Die Datenkapselung, ein Prinzip der objektorientierten Programmierung Aufgabe 1.4: Zugriffsmethoden 1.4 Das »aktuelle Objekt« und die »this-Referenz« Aufgabe 1.5: Konstruktordefinitionen 1.5 Die Wert- und Referenzübergabe in Methodenaufrufen Aufgabe 1.6: Wertübergabe in Methoden (»call by value«) 1.6 Globale und lokale Referenzen Aufgabe 1.7: Der Umgang mit Referenzen 1.7 Java-Pakete Aufgabe 1.8: Die package-Anweisung Aufgabe 1.9: Die import-Anweisung 1.8 Die Modifikatoren für Felder und Methoden in Zusammenhang mit der Definition von Paketen Aufgabe 1.10: Pakete und die Sichtbarkeit von Membern einer Klasse 1.9 Standard-Klassen von Java 1.10 Die Wrapper-Klassen von Java und das Auto(un)boxing Aufgabe 1.11: Das Auto(un)boxing 1.11 Das Paket java.lang.reflect 1.12 Arrays (Reihungen) und die Klassen Array und Arrays Aufgabe 1.12: Der Umgang mit Array-Objekten 1.13 Zeichenketten und die Klasse String Aufgabe 1.13: Der Umgang mit String-Objekten Aufgabe 1.14: Der Umgang mit Textblöcken 1.14 Sprachmerkmale, die in den weiteren Beispielen genutzt werden Aufgabe 1.15: Methoden mit variablen Argumentenlisten 1.15 Den Zugriff auf Klassen und Felder minimieren: Unveränderliche (immutable) Klassen und Objekte 1.16 Die alte und neue Date&Time-API als Beispiel für veränderliche und unveränderliche Klassen Aufgabe 1.16: Die Methoden von Date/Time-Klassen 1.17 Private Konstruktoren Aufgabe 1.17: Objekte mithilfe eines privaten Konstruktors erzeugen 1.18 Lösungen Lösung 1.1 Lösung 1.2 Lösung 1.3 Lösung 1.4 Lösung 1.5 Lösung 1.6 Lösung 1.7 Lösung 1.8 Lösung 1.9 Lösung 1.10 Lösung 1.11 Lösung 1.12 Lösung 1.13 Lösung 1.14 Lösung 1.15 Lösung 1.16 Lösung 1.17 Kapitel 2: Abgeleitete Klassen und Vererbung 2.1 Abgeleitete Klassen 2.2 Die Konstruktoren von abgeleiteten Klassen 2.3 Abgeleitete Klassen und die Sichtbarkeit von Feldern und Methoden Aufgabe 2.1: Test von Sichtbarkeitsebenen im Zusammenhang mit abgeleiteten Klassen 2.4 Das Verdecken von Klassenmethoden und das statische Binden von Methoden Aufgabe 2.2: Der Aufruf von verdeckten Klassenmethoden 2.5 Das Überschreiben von Instanzmethoden und das dynamische Binden von Methoden Aufgabe 2.3: Das dynamische Binden von Methoden 2.6 Vererbung und Komposition Aufgabe 2.4: Die Komposition Aufgabe 2.5: Die Vererbung 2.7 Kovariante Rückgabetypen in Methoden Aufgabe 2.6: Die Benutzung von kovarianten Rückgabetypen 2.8 Verdeckte Felder 2.9 Vergrößernde und verkleinernde Konvertierung (»up- und down-casting«) 2.10 Der Polymorphismus, ein Prinzip der objektorientierten Programmierung Aufgabe 2.7: Der »Subtyp-Polymorphismus« im Kontext einer Klassenhierarchie 2.11 Die Methoden der Klassen java.lang.Object und java.util.Objects Aufgabe 2.8: Die equals()- und hashCode()-Methoden von Object Aufgabe 2.9: Die equals()-Methode und die Vererbung 2.12 Das Klonen und die Gleichheit von geklonten Objekten Aufgabe 2.10: Das Klonen von Instanzen der eigenen Klasse Aufgabe 2.11: Das Klonen von Instanzen anderer Klassen Aufgabe 2.12: Das Klonen und der Copy-Konstruktor 2.13 Der Garbage Collector und das Beseitigen von Objekten 2.14 Lösungen Lösung 2.1 Lösung 2.2 Lösung 2.3 Lösung 2.4 Lösung 2.5 Lösung 2.6 Lösung 2.7 Lösung 2.8 Lösung 2.9 Lösung 2.10 Lösung 2.11 Lösung 2.12 Kapitel 3: Die Definition von abstrakten Klassen, Interfaces und Annotationen 3.1 Abstrakte Klassen 3.2 Abstrakte Java-Standard-Klassen und eigene Definitionen von abstrakten Klassen Aufgabe 3.1: Die abstrakte Klasse Number und ihre Unterklassen Aufgabe 3.2: Definition einer eigenen abstrakten Klasse 3.3 Interfaces (Schnittstellen) Aufgabe 3.3: Die Definition eines Interface 3.4 Die Entscheidung zwischen abstrakten Klassen und Interfaces Aufgabe 3.4: Paralleler Einsatz von Interfaces und abstrakten Klassen 3.5 Implementieren mehrerer Interfaces für eine Klasse Aufgabe 3.5: Das Ableiten von Interfaces 3.6 Die Definition von inneren Klassen Aufgabe 3.6: Ein Beispiel mit anonymer Klasse 3.7 Erweiterungen in der Definition von Interfaces Aufgabe 3.7: Private Interface-Methoden 3.8 Die Definition von Annotationen 3.9 Vordefinierte Annotationstypen Aufgabe 3.8: Annotationen an Methoden und Parameter von Methoden anheften Aufgabe 3.9: Eine Klasse annotieren Aufgabe 3.10: Die @Override- und @Inherited-Annotation 3.10 Lösungen Lösung 3.1 Lösung 3.2 Lösung 3.3 Lösung 3.4 Lösung 3.5 Lösung 3.6 Lösung 3.7 Lösung 3.8 Lösung 3.9 Lösung 3.10 Kapitel 4: Generics 4.1 Die Generizität 4.2 Generische Klassen und Interfaces Aufgabe 4.1: Generischer Datentyp als Behälter für die Instanzen vom Typ des Klassenparameters Aufgabe 4.2: Generischer Datentyp als »Über-Typ« für die Instanzen vom Typ des Klassenparameters 4.3 Wildcardtypen Aufgabe 4.3: Ungebundene Wildcardtypen Aufgabe 4.4: Obere und untere Schranken für Wildcardtypen 4.4 Legacy Code, Erasure und Raw-Typen Aufgabe 4.5: Raw-Typen am Beispiel einer generischen Klasse mit zwei Typparametern Aufgabe 4.6: Brückenmethoden (»bridge methods«) 4.5 Generische Arrays Aufgabe 4.7: Erzeugen von generischen Arrays 4.6 Generische Methoden Aufgabe 4.8: Generische Methodendefinitionen 4.7 Generische Standard-Klassen und -Interfaces 4.8 for-each-Schleifen für Collections Aufgabe 4.9: Das Interface List und die Klasse ArrayList Aufgabe 4.10: Das Interface Collection und die Klasse Vector Aufgabe 4.11: Das Interface Map und die Klasse TreeMap 4.9 Factory-Methoden in Collections Aufgabe 4.12: Factory-Methoden für List, Set und Map 4.10 Die Interfaces Enumeration, Iterable und Iterator 4.11 Enumerationen und die generische Klasse Enum Aufgabe 4.13: Die Definition von Enumerationen 4.12 Die Interfaces Comparable und Comparator und das Sortieren von Objekten Aufgabe 4.14: Das Comparable-Interface Aufgabe 4.15: Comparable versus Comparator 4.13 Typinferenz für Methoden 4.14 Typinferenz beim Erzeugen von Instanzen eines generischen Typs Aufgabe 4.16: Typinferenz beim Instanziieren von generischen Klassen Aufgabe 4.17: Der Diamond-Operator in Java 9 4.15 Lösungen Lösung 4.1 Lösung 4.2 Lösung 4.3 Lösung 4.4 Lösung 4.5 Lösung 4.6 Lösung 4.7 Lösung 4.8 Lösung 4.9 Lösung 4.10 Lösung 4.11 Lösung 4.12 Lösung 4.13 Lösung 4.14 Lösung 4.15 Lösung 4.16 Lösung 4.17 Kapitel 5: Exceptions und Errors 5.1 Ausnahmen auslösen 5.2 Ausnahmen abfangen oder weitergeben Aufgabe 5.1: Unbehandelte RuntimeExceptions Aufgabe 5.2: Behandelte RuntimeExceptions 5.3 Das Verwenden von finally in der Ausnahmebehandlung Aufgabe 5.3: Der finally-Block 5.4 Ausnahmen manuell auslösen 5.5 Exception-Unterklassen erzeugen Aufgabe 5.4: Benutzerdefinierte Ausnahmen manuell auslösen 5.6 Multi-catch-Klausel und verbesserte Typprüfung beim Rethrowing von Exceptions Aufgabe 5.5: Disjunction-Typ für Exceptions Aufgabe 5.6: Typprüfung beim Rethrowing von Exceptions 5.7 Lösungen Lösung 5.1 Lösung 5.2 Lösung 5.3 Lösung 5.4 Lösung 5.5 Lösung 5.6 Kapitel 6: Lambdas und Streams 6.1 Mittels anonymer Klassen Code an Methoden übergeben 6.2 Funktionale Interfaces 6.3 Syntax und Deklaration von Lambda-Ausdrücken Aufgabe 6.1: Lambda-Ausdruck ohne Parameter versus anonymer Klasse Aufgabe 6.2: Lambda-Ausdruck mit Parameter versus anonymer Klasse 6.4 Scoping und Variable Capture Aufgabe 6.3: Die Umgebung von Lambda-Ausdrücken 6.5 Methoden- und Konstruktor-Referenzen Aufgabe 6.4: Methoden-Referenzen in Zuweisungen Aufgabe 6.5: Konstruktor-Referenzen und die neuen funktionalen Interfaces Supplier und Function 6.6 Default- und statische Methoden in Interfaces 6.7 Das neue Interface Stream 6.8 Die forEach-Methoden von Iterator, Iterable und Stream Aufgabe 6.6: Die funktionalen Interfaces BiConsumer, BiPredicate und BiFunction Aufgabe 6.7: Die Methoden des Interface Stream und die Behandlung von Exceptions in Lambda-Ausdrücken 6.9 Das Interface Collector und die Klasse Collectors: Reduktion mittels Methoden von Streams und Kollektoren. Aufgabe 6.8: Weitere Methoden des Interface Stream: limit(), count(), max(), min(), skip(), reduce() und collect() Aufgabe 6.9: Das Interface Collector und die Klasse Collectors 6.10 Parallele Streams Aufgabe 6.10: Parallele Streams 6.11 Die map()- und flatMap()-Methoden von Stream und Optional Aufgabe 6.11: map() versus flatMap() 6.12 Spracherweiterungen mit Java 10, Java 11, Java 12 und Java 13 Aufgabe 6.12: Typinferenz für lokale Variablen in Java 10 und Java 11 Aufgabe 6.13: Switch-Statements und Switch-Expressions 6.13 Lösungen Lösung 6.1 Lösung 6.2 Lösung 6.3 Lösung 6.4 Lösung 6.5 Lösung 6.6 Lösung 6.7 Lösung 6.8 Lösung 6.9 Lösung 6.10 Lösung 6.11 Lösung 6.12 Lösung 6.13 Kapitel 7: Die Modularität von Java 7.1 Das Java-Modulsystem Aufgabe 7.1: Eine einfache Modul-Definition Aufgabe 7.2: Eine Applikation mit mehreren Modulen Aufgabe 7.3: Implizites Lesen von Modulen Aufgabe 7.4: Eine modulbasierte Service-Implementierung 7.2 Lösungen Lösung 7.1 Lösung 7.2 Lösung 7.3 Lösung 7.4 Kapitel 8: Records, Sealed Classes und Pattern Matching 8.1 Das Pattern Matching für den instanceof-Operator 8.2 Der neue Java-Typ Record 8.3 Sealed Classes in Java 8.4 Das Pattern Matching für switch Aufgabe 8.1: Die Definition von record-Klassen und das Pattern Matching für den instanceof-Operator Aufgabe 8.2: sealed-, final- und non-sealed-Klassen Aufgabe 8.3: sealed-Interfaces und das Pattern Matching Aufgabe 8.4: Algebraische Datentypen (ADTs), ein weiterer Schritt in Richtung funktionale Programmierung Aufgabe 8.5: Das Pattern Matching für switch 8.5 Lösungen Lösung 8.1 Lösung 8.2 Lösung 8.3 Kapitel 9: JUnit-Tests 9.1 JUnit 5 im Überblick 9.2 Tests schreiben 9.3 Testen mit dem ConsoleLauncher und der JupiterEngine Aufgabe 9.1: Die Klassen App und AppTest Aufgabe 9.2: Die Klasse PublishingBookmitOrderingTest Aufgabe 9.3: Die Klassen AdditionmitMap und AdditionmitMapTest Aufgabe 9.4: Die Klassen MyClassTest und BuchmitEqualsTest Aufgabe 9.5: Die Klasse TestBeispiele Aufgabe 9.6: Die Klassen RechenOperationenTest und RechenOperationenParametrisierteTests Aufgabe 9.7: Die Klasse AssertThrowsTest 9.4 JUnit-Tests mit Gradle 9.5 Lösungen Lösung 9.1 Lösung 9.3 Lösung 9.4 Lösung 9.5
Similar books
Reisen im Ostindischen Archipel in den Jahren 1865 und 1866
1869 · PDF
Eine Reise um die Welt
1899 · PDF
Europäische Siedler in Niederländisch Ost-Indien
1892 · PDF
Über den Gebirgsbau der Insel Java
1844 · PDF
Der Malayische Archipel : Land und Leute, in Schilderungen gesammelt während eines dreißigjährigen Aufenthaltes in den Kolonien
1878 · PDF
Starting Out with Java: From Control Structures through Data Structures (4th Edition)
2018 · PDF
Spark в действии
2021 · PDF
Starting Out With Java: From Control Structures through Objects
2019 · PDF