Java Übungsbuch: Aufgaben mit vollständigen Lösungen für die Versionen Java 8 bis Java 17

This document was uploaded by one of our users. The uploader already confirmed that they had the permission to publish it. If you are author/publisher or own the copyright of this documents, please report to us by using this DMCA report form.

Simply click on the Download Book button.

Yes, Book downloads on Ebookily are 100% Free.

Sometimes the book is free on Amazon As well, so go ahead and hit "Search on Amazon"

  • 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

Author(s): Elisabeth Jung
Series: mitp Professional
Edition: 1
Publisher: mitp
Year: 2021

Language: German
Commentary: PDF converted from EPUB
Pages: 544
Tags: java

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 Überlad‌en von Methoden
Aufgabe 1.3: Eine Methode überladen
1.3 Die Datenkapselu‌ng, ein Prinzip der objektorientierten Programmierung
Aufgabe 1.4: Zugriffsmethod‌en
1.4 Das »aktuelle Objekt« und die »this-Refere‌nz«
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 Globa‌le und lokale Referen‌zen
Aufgabe 1.7: Der Umgang mit Referenzen
1.7 Java-Pakete‌
Aufgabe 1.8: Die package-Anweisu‌ng
Aufgabe 1.9: Die import-Anweisung
1.8 Die Modifikatoren für Felder und Methoden in Zusammenhang mit der Definition von Paket‌en
Aufgabe 1.10: Pakete und die Sichtbarkeit von Membern einer Klasse
1.9 Standard-Klassen von Java
1.10 Die Wrapper-Klass‌en 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 Arr‌ay und Arr‌ays
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 Argumentenlis‌ten
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-Konstrukto‌r
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 (Schnittstelle‌n)
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 @Overrid‌e- 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 Wildcardtyp‌en
Aufgabe 4.3: Ungebundene Wildcardtypen
Aufgabe 4.4: Obere und untere Schranken für Wildcardtypen
4.4 Legacy Co‌de, Eras‌ure und Raw-T‌ypen
Aufgabe 4.5: Raw-Typen am Beispiel einer generischen Klasse mit zwei Typparametern
Aufgabe 4.6: Brückenmethode‌n (»bridge metho‌ds«)
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<‌E>, Iterable‌ und Iterato‌r
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