Programmierung und Modellierung
Der Bereich Programmierung und Modellierung verbindet den Entwurf von Softwaresystemen mit ihrer Umsetzung. Geprüft werden UML-Klassendiagramme, objektorientierte Konzepte wie Kapselung, Vererbung und Polymorphie, die Modellierung von Zuständen sowie die Fähigkeit, ein Modell in Programmcode zu übertragen und Code zu analysieren. Erwartet wird, dass du nicht nur Syntax beherrschst, sondern Beziehungen, Sichtbarkeiten und Laufzeitverhalten begründest.
UML und objektorientierte Grundlagen
Eine Klasse beschreibt Attribute und Methoden; ein Objekt ist eine Instanz mit konkreten Attributwerten. Sichtbarkeiten: - privat, + öffentlich, # geschützt, ~ paketweit. Kapselung bedeutet, Attribute privat zu halten und Zugriff über Methoden zu regeln. Vererbung modelliert eine Ist-ein-Beziehung; Assoziationen modellieren Kenntnisbeziehungen und tragen Multiplizitäten an beiden Enden. Eine abstrakte Klasse kann nicht instanziiert werden und darf abstrakte Methoden enthalten; ein Interface beschreibt einen Vertrag ohne Implementierung (in Java können seit Java 8 Default-Methoden hinzukommen). Überschreiben ersetzt eine geerbte Methode mit gleicher Signatur; Überladen verwendet denselben Namen mit unterschiedlichen Parametern.
Polymorphie und dynamische Bindung
Polymorphie erlaubt, Objekte verschiedener Unterklassen über eine gemeinsame Oberklassenreferenz zu behandeln. Der statische Typ bestimmt, welche Methoden der Compiler kennt; der dynamische Typ bestimmt zur Laufzeit, welche überschriebene Methode tatsächlich ausgeführt wird (dynamische Bindung). Das ist die Grundlage für erweiterbare Modelle, etwa wenn eine Liste von Figur-Objekten Kreis und Rechteck enthält und jedes Objekt seine eigene flaeche()-Berechnung liefert.
Worked Example: Dynamische Bindung
Gegeben seien die Klassen Tier mit der Methode laut() sowie Hund und Katze, die laut() überschreiben. Der Code Tier[] tiere = {new Hund(), new Katze()}; for (Tier t : tiere) t.laut(); ruft beim ersten Durchlauf Hund.laut(), beim zweiten Katze.laut() auf. Der statische Typ von t ist Tier, daher ist nur laut() der Oberklasse bekannt. Der dynamische Typ ist Hund bzw. Katze, daher wählt die JVM die überschriebene Methode. Würde Hund laut() nicht überschreiben, liefe die geerbte Methode.
Typische Fallen
- Klassen- und Objektdiagramm werden verwechselt: Objekte tragen unterstrichene Namen und konkrete Werte.
- Multiplizitäten werden nur an einem Assoziationsende gelesen.
- Überladen und Überschreiben werden gleichgesetzt.
- Bei Vererbung wird die Richtung „Unterklasse ist eine Oberklasse“ verdreht.
- Rekursion wird ohne sauberen Basisfall oder ohne Verkleinerung des Problems formuliert.