Objektorientierung
Die Objektorientierung ist ein extrem erfolgreiches Konzept bei der Programmierung. Um es allerdings
vollumfänglich nutzen zu können, müssen die Grundideen verstanden werden. Es reicht nicht aus, einfach
nur Klassen zu erzeugen - sie müssen bezüglich Vererbung, Kapselung und Polymorphie auch sinnvoll
geschnitten werden. In dieser Videoreihe versuche ich genau diese Grundgedanken näher zu bringen. Ich konzentriere mich
bei den Ausführungen auf Java. Die wesentlichen Gedanken gelten natürlich auch für andere objektorientierte
Sprachen, wobei sich Java aufgrund seiner Stringenz und dem Verzicht auf "Sonderlocken" zugunsten der Codereduktion
meines Erachtens am Besten dafür eignet, die Zusammenhänge zu erkennen.

Wir beginnen mit der Überlegung, warum die rein prozedurale Programmierung oftmals nicht geeignet ist, die Welt
abzubilden. Das Objekt, welches Funktionalität und Informationen kapselt soll hier Abhilfe schaffen. Darüber hinaus
klären wir, was der Unterschied einer Klasse zu einem Objekt ist.

Nun kommen die Zugriffsmodifikatoren ins Spiel. Hierbei muss entsprechend vorher gerklärt werden, was "Vererbung"
oder besser "Erweiterung" bedeutet:
- Eltern vs. Kindklasse
- Vererbung/Erweiterung
- Begriff "Klasse"
- public
- protected
- private

Die Konzepte der Polymorphie finden sich prinzipiell in allen Videos wieder. In diesem Video gehe ich aber nochmal
auf die Grundidee ein und kläre die Begrifflichkeiten:
- Vererbung von Eigenschaften und Methoden
- Überschreiben
- Überladen

Zu diesem Zeitpunkt haben wir die wichtigsten Kenntnisse, um den gesamten Zusammenhang beurteilen zu können. Dafür wird
ein größeres "Programm" vorgestellt, in dem wir die Mechanik hinter der Polymorphie verstehen lernen. Hierbei lege ich
darauf Wert, den Unterschied zwischen einem Instanztyp (also der Klasse der tatsächlichen Instanz) und einem Variablentyp
(also der Klasse, welche die Variable bestimmt) zu unterscheiden:
- Unterschied prozeduraler vs. objektorientierter Ansatz
- Getter/Setter
- Instanztyp vs. Variablentyp
- Überschreiben von Methoden
- Erkennen, welche Methoden genutzt werden (Eltern vs. Kind)

Den Konstruktoren kommt in der Objektorientierung eine besondere Bedeutung zu, da sie garantieren müssen, dass ein
Objekt erzeugt und sinnvoll nutzbar ist. Hierbei gehen wir auf die Beziehung zwischen Eltern- und Kindkonstruktoren ein:
- Aufgabe des Konstruktors
- Standardkonstruktor
- Überladung von Konstruktoren
- Aufruf des Superkonstruktors

Wir klären in diesem Video, warum es meist nicht sinnvoll ist, alle Variablen auf "public" zu setzen um sicht nicht mit
Sichtbarkeiten beschäftigen zu müssen. Dies machen wir anhand von zwei Beispielen fest:
- Modellierung von Abhängigkeiten zwischen einzelnen Variablen
- Paralleler Zugriff auf Instanzvariablen

Das bis jetzt aufgebaute Geometriebeispiel hat noch einen Nachteil - die leeren Methoden der Elternklassen. Dieses
Manko beseitigen wir nun mit Hilfe des Schlüsselwortes "abstract":
- Abstrakte Methoden
- Abstrakte Klassen

Das Interface löst uns das Problem der fehlenden Flexibilität aufgrund der Einschränkung, dass in Java nur eine
Elternklasse existieren darf. Anhand eines Beispiels im Rahmen unserer Geometrieobjekte wird dies aufgezeigt:
- Definition eines Interfaces
- Implementierung eines Interfaces
- Delegation der Implementierung an Kindklassen mittels "abstract"
- Anonyme Klassen

Exceptions sind nicht nur bei der objektorientierten Programmierung wichtig. Da sie in Java aber (zwangsweise) als
Klassen ausgelegt sind, habe ich sie in diese Reihe mit eingefügt. Wir klären, warum wir überhaupt soetwas wie
Exceptions benötigen und wie wir sie nutzen.
- Stack
- Erzeugen von Exceptions
- Werfen von Exceptions
- Auffangen von Exceptions
