Java - allgemeine Themen
Für die weiterführende Programmierung nutzen wir Java. Hierfür sprechen folgende Gründe:
- Objektorientierung
- Saubere Programmiersprache ohne "Schnörkel"
- Performant (wegen JIT)
- Weit verbreitet
- Statisch typisiert
- Steile Lernkurve (im Vergleich zu C++)
- Lizenzkostenfrei
- Betriebssystemunabhängig
Bei den Videos werdet ihr feststellen, dass manche eher "old school" rüberkommen. Das liegt daran, dass ich schon sehr
früh mit Lehrvideos angefangen habe und im Laufe der Zeit meine Skills etwas verbessert habe. Dem Inhalt sollte diese
alte Form aber nicht abträglich sein. Ich schreibe aber auf dieser Seite jeweils hin, ob es sich um einen "old school"
Inhalt handelt. Mittelfristig plane ich, diese Videos mal neu aufzunehmen.
Ich habe das Thema rund um Java in folgende Teilbereiche zerlegt (wobei in Zukunft vermutlich noch ein paar neue
hinzukommen werden):
- Einordnung Programmiersprachen
- Java allgemeines
- Numerische Datentypen
- Statische und dynamische Arrays
- Umgang mit Datentypen
- Kontrollstrukturen
- GUI Einführung
- GUI - Grafiken
- Canvas Einführung
- Canvas Trafos
- Multithreading
- Rekursion

Hier geht es erstmal noch nicht um Java, sondern um die allgemeine Einteilung von Programmiersprachen. Folgende Punkte
werden angesprochen:
- Hochsprache
- Compiler
- Maschinensprache
- Assembler
- Zwischensprache (Bytecode, Intermediate Language)
- JIT Compiler
- Interpreter
- Prozedural vs. funktional vs. objektorientiert
- Imperativ vs. deklarativ

Nun kümmern wir uns um die wesentlichen Aspekte von Java die wir benötigen, um überhaupt entwickeln zu können:
- Installation
- Grundarchitektur (JRE, Classloader, JDK)
- Die main-Methode
- Packages
- IDE
- Java Module
- Java Archives (jar)

Bei den Details beginnen wir mit den nummerischen Datentypen. Wir klären, wie wir uns die Datenhaltung vorstellen können
analysieren, wie sich die Variablen unter bestimmten Bedingungen verhalten:
- Binärer Aufbau von Speicherzellen
- Statische vs. dynamische Typisierung
- Deklaration vs. Initialisierung
- Überlaufverhalten von ganzen Zahlendatentypen
- Zweierkomplement
- Aufbau von Gleitkommazahlen
- Rundungsproblem bei Gleitkommazahlen

Arrays sind die wohl wichtigste Form von zusammengesetzten Datentypen. Wir klären den Aufbau von ein- bzw.
mehrdimensionalen Arrays. Anschließend kümmern wir uns um dynamische Arrays in Form von
Arraylisten und Hashtables:
- Erzeugung und Nutzung von Arrays
- Initialbelegungen von Arrays
- Aufbau mehrdimensionaler Arrays
- Dynamische Arrays
- Assoziative Arrays

Nun, da wir die Gundlagen von Datentypen haben, können wir uns um das allgemeine Verhalten bei der Nutzung ansehen.
Hierbei kümmern wir uns um:
- Call by reference vs. call by value
- Primitive vs. zusammengesetzte Datentypen
- Referenzvariablen
- Stringvergleich
- Interoperabilität / Typecasts

Das Video zu den Kontrollstrukturen ist noch von Früher - sprich "old school". Inhaltlich gehe ich auf die
verschiedenen Kontrollstrukturen in Struktogramm
ein und wie sie in Java umgesetzt werden. Dabei mache ich auch einen kurzen Hinweis auf die Program Ablauf Plan
(PAP) Darstellung.
- Sequenz
- Verzweigung
- Mehrfachauswahl
- Kopf- vs. fußgesteuerte Schleife
- Zählschleife

Bei der Umsetzung von GUIs setze ich auf SWING. Der Grund liegt darin, dass es mir nur um die Grundlagen und die
Grundkonzepte geht. Diese lassen sich mit SWING relativ einfach erklären. Diese Elemente können anschließend auf
andere GUI APIs wie bspw. JavaFX oder
WPF übertrage werden.
- Das Problem mit dem UI Thread
- Frame als sichtbarer Rahmen
- Die Grundelemente einer GUI
- Der Layoutmanager
- Eventhandling

Nun geht es darum, Grafiken einzubinden. Hierbei kümmern wir uns um die in SWING notwendigen Container, um den Prozess
des ladens und vorab um die verschiedenen Grafiktypen.
- Raster vs. Vektor
- Transparenz mit png
- Animation mit gif
- Einbinden in SWING
- Cachen von Grafiken

Mittels Canvas können wir pixelgenaue Grafiken dynamisch selbst erzeugen. In Java wird dies primär mit der JPanel Klasse
erledigt, in den meisten anderen Programmiersrpachen heißt die Klasse "Canvas". Im ersten Video zu diesem Thema
klären wir die Grundlagen:
- Das repaint Problem
- Das konzept des "Stiftes"
- Zeichnen von Formen
- Umrandung vs. Füllen

Die weiteführenden Kenntisse zu Canvas beinhalten primär die Nutzung von Transformationen, um die vorher gezeichneten
Formen flexibler darzustellen. Darüberhinaus kümmern wir uns noch um das Zeichnen einzelner Pixel:
- Rotation
- Verschiebung
- Einbindung von Grafiken
- Mausposition bestimmen
- Mausbewegung als Pixel bzw. Polygon aufzeichnen

Mit Multithreading betreten wir die etwas höhere Schule der Programmierung. Wir klären die verschiedenen Begriffe, um
parallele, asynchrone und synchrone Verarbeitung zu unterscheiden, lernen die Problematik des parallelen Zugriffs und den
damit verbundenen Entwicklungsproblemen kennen und wie man die Software threadsafe machen kann.
- Synchron vs. asynchron vs. parallel
- Die Thread Klasse und das Runnable Interface
- Race Conditions
- Synchronisationsmechanismen
- Deadlocks

Rekursionen sind ein nicht zu unterschätzendes Verfahren zur effizienten Erstellung von Algorithmen. Wir kümmern uns
um die Probleme und Möglichkeiten von Rekursionen anhand von mehreren Usecases:
- Rekursion vs. Iteration am Beispiel Fakultät
- Belegung des Stacks durch Rekursionen
- Endrekursion
- Rekursives durchsuchen einer Baumstruktur
- Quicksort
