Lernstoff 2CHIF für PLF-2 am Di,2024-01-09
1. Schwerpunkte
Die in den letzten Beispielen verwendeten Konzepte, z.B.:
-
Maven-Projekt konfigurieren (erster Lauf HelloApplication z. Download, Source und Javadoc herunterladen)
-
Serialisierung (Import Serializable, Schreiben mit ObjectOutputStream, Lesen mit ObjectInputStream)
-
MVC
-
Layout (z.B. BorderLayout, GridPane, HBox, VBox, …)
MenuBar, Menu, MenuItem
TextField, Button, Label, CheckBox, RadioButton, ToggleGroup, etc.
ComboBox, ListView (mit ObservableList)
Alert
Dialog (mit ResultConverter, Filter bei Fehler)
EventFilter
EventHandler
MouseEvent
WindowEvent
ChangeListener (an Properties)
Switch zw. Views
Properties (OPTIONAL, max. f. Bonus-Aufgaben)
2. Serialization
https://www.baeldung.com/java-serialization [Introduction to Java Serialization | Baeldung] … 2024-05-08
https://www.tutorialspoint.com/java/java_serialization.htm [Java - Serialization] … 2024-05-08
3. Events und Listeners
(z.B. EventHandler, ChangeListener, InvalidationListener, …)
https://www.tutorialspoint.com/javafx/javafx_event_handling.htm [JavaFX - Event Handling] … 2024-05-08 https://taylorial.com/gui/fxevents/ [taylorial.com] … 2024-05-08
https://stackoverflow.com/questions/45117076/javafx-invalidationlistener-or-changelistener [java - JavaFX InvalidationListener or ChangeListener - Stack Overflow] … 2024-05-08
Dokument noch in Arbeit (Stand: 2023-12-30 15:40) !! Es werden noch Links auf die entsprechenden Unterlagen-Seiten u.ä. eingefügt, u.U. Vergessenes ergänzt.
Im Prinzip ist der gesamte aktuelle Stoff Thema.
Hier eine provisorische Liste der wichtigsten Themen (hoffentlich nichts vergessen):
4. Schwerpunkte zur PLF-2:
Neben den unten angeführten Themen der letzten PLF liegt der Schwerpunkt diesmal in folgenden Themen:
-
Projekttyp Maven
-
Zuerst Erstellen eines "Empty Project" in IntelliJ: Menü
, im Formular links oben 2. Eintrag: Empty Project.
Feld Name liefert Verzeichnisname des Projekts (für PLF immer eigener Nachname – Anfangsbuchstabe GROSS, Rest klein), Feld Location ist das Basis-Verzeichnis (für PLF immerZ:\
), in dem das Projekt-Verzeichnis<Name>
angelegt wird. -
Dann gerade erzeugtes IntelliJ-Projekt auswählen und danach mit Menü
, im Formular links oben 1. Eintrag: New Module selektieren, Feld Name liefert Modul-Name (sollte aus Kleinbuchstaben, Ziffern und'-'
ab 2. Stelle bestehen). Dieser ist per Default auch die Maven-ArtifactId
), Feld Location sollte den Verzeichnispfad des zuvor ausgewählten IntelliJ-Projekts enthalten (). für PLF immer eigener nachname (ALLES kleinbuchstaben). -
Import bestehender Source-Code in neu erstelltes Maven-Projekt:
-
Komplettes Basis-Package der Quelle (mit alles Sub-Packages und Java-Dateien) in das Ziel-Verzeichnis
src/main/java
kopieren -
mit Refactor-Rename (wenn schwerere Java-Fehler bestehen, funktioniert nicht alles automatisch) das kopierte Package umbenennen
-
-
Setzen Java-Version und Encoding (
maven.compiler.source
,maven.compiler.target
undproject.build.sourceEncoding
) inpom.xml
-
-
JUnit 5 via Maven, einfache Tests implementieren
-
Annotations
@Test
,@BeforeEach
,@AfterEach
,@BeforeAll
,@AfterAll
-
Test hinzufügen (Strg+Einfg), im Formular fehlendes JUnit5 fixen
-
AssertEquals
-
AssertTrue, AssertFalse
-
assertNull, assertNotNull
-
AssertThrows
-
-
List (mit generic Type)
Deklaration:List<ElementType> list = new ArrayList<>();
(Typ möglichst allgemein – oft Interface) -
Set hat keine definierte Ordnung → iterierbar nur mit "enhanced for" oder Iterator
(Sicheres Entfernen mehrerer Elemente nur jeweils für aktuelles Element:theIterator.remove();
!!)
Einzelnes Element kann gefahrlos mittheSet.remove(theElem); break;
entfernt werden! -
Map mit
keySet()
,values()
(oder auch – nicht besprochen – entrySet()).
Iteration mit-
keySet() (z.B.
for (KeyTyp k : map.keySet()) { … }
) oder -
values() (z.B.
for (ValueTyp v : map.values()) { … }
) oder -
entrySet() (z.B.
for (Map.Entry<KeyTyp, ValueTyp> entry : map.entrySet()) { … }
) -
oder Iterator (z.B.
Iterator<KeyTyp> it = map.keySet().iterator(); while (it.hasNext()) { KeyTyp k = it.next(); … }
)
-
-
Interface Comparable ("natürliche" Ordnung einer Klasse) mit
this.compareTo(other)
-
Interface Comparator (zusätzliche Ordnung einer Klasse) mit
comparator.compare(o1, o2)
-
sowohl
this.compareTo(other)
als auchcompare(obj1, obj2)
liefern int-Wert:-
negativ:
this
bzw.obj1
ist kleiner alsother
bzw.obj2
-
0:
this
bzw.obj1
ist gleichother
bzw.obj2
-
positiv:
this
bzw.obj1
ist größer alsother
bzw.obj2
Relation (kleiner, gleich, größer) immer bezogen auf den ersten Wert (
this
oderobj1
!!!). Zahlenwert ist IRRELEVANT ! -
-
Text-Dateien lesen und schreiben (mit
FileReader
,FileWriter
,BufferedReader
,BufferedWriter
,PrintWriter
).-
Try with Resources (
try
mit Klammern, in denen die Reader/Writer-Objekte erzeugt werden, kein zwingendescatch
! ) -
FileWriter-Objekt erzeugen mit Anfügen am Ende statt Neuschreiben: Konstruktor mit 2. Parameter
boolean append
auftrue
. -
Zeilenweises Lesen mit
aBufferedReader.readLine()
mit:
while ((line = br.readLine()) != null) { … }
-
Zeilenweises Schreiben mit
aBufferedWriter.write(String s); aBufferedWriter.newLine()
oder mitaPrintWriter.println(String s)
(mit automatischem Zeilenvorschub)
-
5. Alte Lernstoff-Zusammenstellung für PLF-1 (RX):
-
Vererbung Grundlagen
-
Vererbung mit Schlüsselwort
extends
:
public class Schueler extends Person {…}
-
Methoden (und Attribute) die "weiter oben" in der Vererbungshierarchie implementiert und nicht
private
oder package-sichtbar (ohne Sichtbarkeits-Schlüsselwort private, protected oder private) sind, können von allen erbenden Klassen mitgenutzt, aber auch spezifisch überschrieben (override) werden. -
Polymorphie: Die richtige Methodenversion wird dynamisch zur Laufzeit festgestellt und aufgerufen
-
Konstruktoren: Erstes Statement: Aufruf Superkonstruktor sein:
super(param1, param2, …)
(Falls expliziter Aufruf fehlt und in Superklasse ein Default-Konstruktor existiert, wird dieser implizit aufgerufen) -
V.a. bei Override: ZUgriff auf implementierte Methoden der Superklasse mit
super.methodName()
-
Statische Methoden, Klassenvariabeln, Konstante und Konstruktoren liegen außerhalb der Vererbungslogik!!
-
-
Exceptions
-
Checked und Unchecked Exceptions
-
try-catch (nicht wirklich besprochen: -finally)
-
Werfen von Exceptions
-
Deklaration möglicherweise geworfener Exceptions (v.a. für Checked Exceptions)
-
Erstellen eigener Exceptions
-
Handling von Exceptions mit
catch
-
-
Abstrakte Klassen (Instanzierungsverbot!)
-
Deklaration mit
abstract
-
Abstrakte Methoden
-
Erben von abstrakten Klassen mit abstrakten Methoden
-
Implementieren von abstrakten Methoden
-
-
Interfaces Interface kann enthalten:
-
Deklarationen von Methoden (wie abstrakte Methoden)
-
Deklarationen von Konstanten (wie in Klassen)
-
Implementationen von static Methoden (wie in Klassen)
-
Implementationen von default Methoden (noch nicht unterrichtet)
-
-
Collections
-
Basics zu Generics
-
Generic Interfaces Collection, List, Set (List, Set "extends" Collection!)
-
Wichtige Operationen Collection: add, remove, contains, size, isEmpty, clear etc.
-
Wichtige zusätzliche Methoden von List und Set
-
Maps (Sammlungen von Schlüssel-Wert-Paaren)
-
Methoden
boolean equals(Object other)
undint hashCode()
-
-
(Sortieren von Listen noch nicht unterrichtet!)
6. Zusammenstellung von Koll. Lackinger:
-
CharacterStreams/ByteStreams:
-
Einlesen von Daten von einem File / parsen (+Exception Handling)
-
Speichern von Daten in ein File (+Exception Handling) ➔ kein explizites Character encoding!
-
-
Parsen von Files/Strings mit Hilfe von split – Unterscheidung von Zahl und Wort
-
String Methoden
-
Enums
-
LocalDate, Period,: erzeugen, formatieren/ausgeben, vergleichen, addieren, subtrahieren, Alters und Zeitberechnungen ➔ keine Zeitzonen
-
Verwendung des DateTimeFormatters
-
Exception Handling, checked Exceptions und RuntimeExceptions, auch Vererbung
-
Collections:
-
List, HashMap
-
Methoden mit Hilfe der API Doc anwenden
-
erstellen einer Collection, einfügen, löschen, ändern, sortieren (nur ArrayList), auswerten und finden von Elementen (equals!!!)
-
-
Vererbung
-
abgeleitete Klassen und abstrakte Klassen implementieren
-
eigene Interfaces erzeugen
-
Verwenden des super Keyword im Konstruktor und in Methoden im Gegensatz zu this
-
Verwenden aller Zugriffsmodifizierer (auch protected und/oder default)
-
Verwendung der Interfaces Comparable und Comparator
-
Überschreiben von Methoden (Polymorphie) und überladen von Methoden
-
Überschreiben der equals Methode zur Verwendung der ArrayList Methoden remove(Object o) und contains(Object o).
-
Überschreiben von toString()
-