Übungsaufgaben zum UML-Klassendiagramm
https://bildung.social/@oerinformatik/
https://oer-informatik.de/uml-klassendiagramm-uebungsaufgaben
UML-Klassendiagramm, Kapselung, Sichtbarkeit, Klassenattribut, Überladung, Abstrakte Klasse, Interface, Aggregation, Komposition, Übungsaufgaben
tl/dr; (Bearbeitungszeit insgesamt 122 min, mehrere Aufgaben): Fünf Übungsaufgaben zum UML-Klassendiagramm: zum Einstieg ein Klassendiagramm lesen, eine Methodendeklaration zerlegen, Klassen ergänzen und gewählte Datentypen nach Speicherbedarf beurteilen; danach eine Klasse aus Anforderungen mit Sichtbarkeiten, Datentypen, Konstruktor, Getter und Setter erstellen, ein Klassendiagramm aus Quellcode und einem englischen Text ableiten und Fehler in einer Vorgabe korrigieren sowie ein Modell mit mehreren Klassen, Vererbung und Beziehungen zeichnen. Alle Lösungen sind ausgeblendet und mit Punkteverteilung versehen [AI-Assisted]. (Zuletzt geändert am 29.10.2026)
Dieser Artikel ist Teil einer Artikelreihe über UML-Klassendiagramme: Einstieg in das Klassendiagramm (Übung Ticketautomat, Übungsaufgaben) / Sichtbarkeitsmodifikatoren / Assoziation, Aggregation, Komposition (Übungsaufgaben) / Vererbung (Übungsaufgaben) / Abstrakte Klassen und Interfaces / Polymorphie (Übungsaufgaben). Dazu: Klassendiagramme mit PlantUML zeichnen und Objektdiagramm.
Diese Übungsaufgaben gehören zu den Artikeln Einstieg in objektorientierte Programmierung mit dem UML-Klassendiagramm und UML-Klassendiagramm: Sichtbarkeitsmodifikatoren. Einzelne Teilaufgaben greifen schon auf Objektbeziehungen, Vererbung sowie abstrakte Klassen und Interfaces vor.
Hinweise zur Bearbeitung: Bis zur Teil-1-Prüfung der IT-Berufe solltest Du die Basiskompetenz beherrschen, also Aufgabe 1.1 und Aufgabe 1.2. Als FIA, FISY, FIDV oder IKS musst Du zur Teil-2-Prüfung Aufgaben auf Kernkompetenz-Ebene lösen können, das sind Aufgabe 2.1, Aufgabe 2.2 und Aufgabe 2.3. Zeichne Deine Diagramme auf Papier oder mit einem Werkzeug Deiner Wahl, bevor Du die Beispiellösung aufklappst. Als Datentypen nutzt die Beispiellösung die UML-Typen Integer, Real, Boolean und String; Typen aus Programmiersprachen (int, double, boolean, float …) sind ebenso richtig, wenn sie passen. Methoden ohne Rückgabewert dürfen auch mit : void notiert werden. Pseudocode muss keiner bestimmten Sprache folgen, aber eindeutig sein.
Notationsübersicht
Diese Notationsübersicht kannst Du bei allen Aufgaben nutzen.
Du möchtest eigene Aufgaben zum Üben von einem KI-Sprachmodell generieren lassen?
Kopiere den Text in ein KI-Sprachmodell Deiner Wahl und passe Kompetenzstufe, Anzahl, Bearbeitungszeit und Szenario bei Bedarf an. Wie die Aufgaben aufgebaut sind, beschreibt der Artikel Wie sind die Aufgaben aufgebaut?. Prüfe die Ergebnisse mit dem Lehrartikel: KI-Sprachmodelle machen Fehler.
Erstelle neue Übungsaufgaben zum Thema „UML-Klassendiagramm“.
Bauplan: Halte Dich an Aufbau, Kompetenzstufen, Operatoren,
Anforderungsbereiche, Punkte und Zeitschätzung, die im Artikel
https://oer-informatik.de/aufgaben-aufbau beschrieben sind.
Fachliche Grundlage:
- https://oer-informatik.de/uml-klassendiagramm
- https://oer-informatik.de/uml-klassendiagramm-sichtbarkeitsmodifikatoren
- https://oer-informatik.de/uml-klassendiagramm-assoziation
- https://oer-informatik.de/uml-klassendiagramm-vererbung
- https://oer-informatik.de/uml-klassendiagramm-interface-abstraktion
- Stilbeispiel: https://oer-informatik.de/uml-klassendiagramm-uebungsaufgaben
Die Aufgaben sollen Inhalte zu diesen Schlagwörtern abdecken:
- UML-Klassendiagramm
- Kapselung
- Sichtbarkeit
- Klassenattribut
- Überladung
- Abstrakte Klasse
- Interface
- Aggregation
- Komposition
Kompetenzstufe: Kernkompetenz (alternativ: Basiskompetenz, Profilkompetenz, Expertise)
Anzahl: 1 Aufgabe mit Teilaufgaben
Bearbeitungszeit in Minuten ca.: <5 bis 30 min>
Szenario: eines der Szenarien aus dem Bauplan
Vorgehen:
1. Lies zuerst die verlinkten Artikel. Kannst Du keine Webseiten
abrufen, sag mir das, statt zu raten.
2. Steht bei einer Angabe noch ein Platzhalter in <…>, frag mich
zuerst danach. Richte Punkte und Zahl der Teilaufgaben nach der
Bearbeitungszeit (ca. 0,9 min je Punkt).
3. Gib je Aufgabe Titel mit Kompetenzstufe, Ausgangssituation und
Teilaufgaben mit Operator und Punktzahl aus, dazu die geschätzte
Bearbeitungszeit.
4. Gib die Beispiellösungen mit Punkteverteilung erst aus, wenn ich
danach frage.
Aufgabe 1.1: Eine Klasse der Freizeit-App lesen (Basiskompetenz)
(ca. 14 min Bearbeitungszeit)
Bei der Let’s Meet GmbH arbeitest Du mit Jonas Weber am Backend der Freizeit-App. Yusuf Demir zeigt Euch die Klasse Aktivitaet, die alle Aktivitäten der App verwaltet.
a) Kreuze die zutreffenden Aussagen zum Klassendiagramm an. (3 Punkte)
| Nr. | Aussage | zutreffend (ja/nein) |
|---|---|---|
| 1 | Die Klasse heißt Aktivitaet. |
|
| 2 | Das Attribut titel kann von anderen Klassen direkt geändert werden. |
|
| 3 | Die Methode anmelden ist öffentlich und gibt einen Wahrheitswert zurück. |
|
| 4 | Aktivitaet(titel: String, maxTeilnehmende: Integer) ist ein Konstruktor; er hat keinen Rückgabetyp. |
|
| 5 | Jedes Objekt der Klasse hat seinen eigenen Wert für anzahl. |
|
| 6 | Wird nichts anderes angegeben, hat eine neue Aktivität das Mindestalter 16. |
Zutreffend sind 1, 3, 4 und 6. Je richtig beurteilter Aussage 0,5 Punkte.
2 trifft nicht zu:
titelist privat (-) und nur innerhalb der Klasse sichtbar; andere Klassen können ihn höchstens über eine Methode lesen (getTitel()).5 trifft nicht zu:
anzahlist unterstrichen, also ein Klassenattribut (statisch). Es gibt den Wert nur einmal für die ganze Klasse, z. B. um die Zahl der angelegten Aktivitäten zu zählen.
b) Ein Klassensymbol ist in drei Bereiche gegliedert. Gib an, welche Angaben in den drei Bereichen stehen. (3 Punkte)
Je 1 Punkt:
oben: der Name der Klasse (
Aktivitaet),Mitte: die Attribute (Eigenschaften) mit Sichtbarkeit, Datentyp und ggf. Startwert,
unten: die Operationen (Methoden) einschließlich Konstruktor mit Parametern und Rückgabetyp.
c) Benenne die fünf Bestandteile der Methodendeklaration +anmelden(person: Benutzer): Boolean. (5 Punkte)
| Nr. | Bestandteil | Bezeichnung |
|---|---|---|
| 1 | + |
|
| 2 | anmelden |
|
| 3 | person |
|
| 4 | Benutzer (hinter person:) |
|
| 5 | Boolean (hinter der Klammer) |
Je 1 Punkt:
| Nr. | Bestandteil | Bezeichnung |
|---|---|---|
| 1 | + |
Sichtbarkeit: öffentlich (public) |
| 2 | anmelden |
Name (Bezeichner) der Methode |
| 3 | person |
Name des Übergabeparameters |
| 4 | Benutzer |
Datentyp des Parameters (hier eine Klasse) |
| 5 | Boolean |
Rückgabetyp (Wahrheitswert) |
d) Jonas hat bisher nur prozedural programmiert. Ordne die Tätigkeiten der prozeduralen (P) oder der objektorientierten (O) Softwareentwicklung zu. (2 Punkte)
| Tätigkeit | P oder O |
|---|---|
| Für gleichartige Dinge (alle Aktivitäten) wird ein Bauplan mit Eigenschaften und Methoden festgelegt. | |
| Das Programm wird in eine Folge von Funktionen zerlegt, die Daten als Parameter erhalten. | |
| Eine neue Klasse übernimmt die Eigenschaften einer vorhandenen Klasse und ergänzt sie (Vererbung). | |
| Daten und die Funktionen, die sie bearbeiten, werden getrennt voneinander verwaltet. |
O, P, O, P (je 0,5 Punkte).
e) Nenne zwei Vorteile der objektorientierten gegenüber der prozeduralen Programmierung. (2 Punkte)
Je 1 Punkt, z. B.:
Wiederverwendbarkeit: Klassen (auch aus Klassenbibliotheken) lassen sich in anderen Programmen nutzen und per Vererbung erweitern.
Kapselung: Daten sind vor unkontrolliertem Zugriff geschützt; Änderungen im Inneren einer Klasse wirken sich nicht auf andere Programmteile aus.
Wartbarkeit und Übersicht: Die Struktur des Programms entspricht den Dingen der Wirklichkeit (Aktivität, Benutzer, Treffpunkt), Fehler lassen sich leichter eingrenzen.
Erweiterbarkeit: Neue Arten (z. B. eine spezielle Wanderung) können als Unterklasse ergänzt werden, ohne vorhandenen Code zu ändern.
Aufgabe 1.2: Den Kostenbeitrag in der Mitfahr-App berechnen (Basiskompetenz)
(ca. 15 min Bearbeitungszeit)
In der Mitfahr-App „RatzFahrt“ des Ratz und Rübe Berufskollegs dürfen Fahrer*innen höchstens 0,10 € je Kilometer und mitfahrender Person verlangen. Oksana Melnyk entwickelt dafür eine Klasse, von der bisher nur die Methode berechneHoechstbeitrag() festgelegt ist.
a) Die Klasse soll Kostenrechner heißen und folgende Attribute besitzen, die nur innerhalb der Klasse sichtbar sein dürfen:
obergrenzeJeKm: höchster Beitrag je Kilometer und Person in Euro (Dezimalzahl),streckeKm: Länge der Fahrt in Kilometern (Dezimalzahl),anzahlMitfahrende: Zahl der mitfahrenden Personen (ganze Zahl),probezeit: gibt an, ob die fahrende Person noch in der Probezeit ist (ja/nein).
Ergänze das Klassendiagramm um den Klassennamen und die Attribute mit Sichtbarkeit und Datentyp. (5 Punkte)
b) Die Klasse soll eine weitere Methode pruefeBeitrag erhalten, die von anderen Klassen aufgerufen werden kann. Sie übernimmt einen Betrag in Euro und gibt zurück, ob dieser Betrag zulässig ist. Trage die Methode in das Klassendiagramm ein. (3 Punkte)
Bewertung a): Klassenname 1 Punkt, je Attribut mit - und passendem Datentyp 1 Punkt. Programmiersprachen-Typen (double, int, boolean) sind ebenso richtig.
Bewertung b): Sichtbarkeit + 1 Punkt, Parameter mit Datentyp 1 Punkt, Rückgabetyp Boolean 1 Punkt.
c) Für eine Auswertung am Schuljahresende legt Oksana die Klasse Fahrerprofil an. Die Profile aller Fahrer*innen werden auf dem Schulserver gespeichert; jedes Profil soll so wenig Speicher wie möglich belegen. Projektleiter Thomas Becker hat Zweifel an einigen der Datentypen, die Oksana gewählt hat. Beurteile jede Wahl: Ist sie passend? Wenn nicht, gib den besseren Typ an und begründe kurz. Die Tabelle der Java-Typen hilft Dir dabei. (5 Punkte)
| Typ | Größe | darstellbare Werte |
|---|---|---|
boolean |
1 Byte | true, false |
byte |
1 Byte | ganze Zahlen von −128 bis 127 |
short |
2 Byte | ganze Zahlen von −32.768 bis 32.767 |
int |
4 Byte | ganze Zahlen bis etwa ±2,1 Milliarden |
long |
8 Byte | ganze Zahlen bis etwa ±9,2 Trillionen |
float |
4 Byte | Gleitkommazahl, etwa 7 gültige Stellen |
double |
8 Byte | Gleitkommazahl, etwa 15 gültige Stellen |
String |
je nach Länge | beliebige Zeichenkette |
| Attribut | Bedeutung | Oksanas Wahl | Urteil und ggf. besserer Typ mit Begründung |
|---|---|---|---|
anzahlFahrten |
Fahrten, die die Person bisher angeboten hat (höchstens einige Tausend) | byte |
|
plzWohnort |
fünfstellige Postleitzahl, z. B. 33602 oder 01067 | int |
|
abfahrtMinute |
übliche Abfahrtszeit als Minute des Tages (0 bis 1439) | int |
|
bewertung |
Durchschnitt der Bewertungen durch Mitfahrende, 1,0 bis 5,0 mit einer Nachkommastelle | double |
|
meterImSchuljahr |
im Schuljahr gefahrene Strecke in Metern (bis etwa 3 Millionen) | int |
Je Zeile 1 Punkt (0,5 Punkte für das Urteil, 0,5 Punkte für Typ bzw. Begründung):
| Attribut | Urteil | Begründung |
|---|---|---|
anzahlFahrten |
ungeeignet, besser short |
byte reicht nur bis 127; einige Tausend passen in short (bis 32.767) |
plzWohnort |
ungeeignet, besser String |
Mit Postleitzahlen wird nicht gerechnet; als Zahl ginge die führende Null von 01067 verloren |
abfahrtMinute |
darstellbar, aber zu groß, besser short |
1439 passt nicht in byte, wohl aber in short (2 statt 4 Byte) |
bewertung |
darstellbar, aber zu groß, besser float |
zwei gültige Stellen reichen; float braucht 4 statt 8 Byte |
meterImSchuljahr |
passend | 3 Millionen sind größer als der Höchstwert von short; int ist der kleinste passende Typ, long wäre unnötig groß |
Hinweis: Wer bei der Postleitzahl int mit der Begründung „geringerer Speicher als ein Text“ beibehält und die führende Null bei der Ausgabe ergänzt, erhält den Punkt ebenfalls.
d) Oksana hat alle Attribute als privat gekennzeichnet. Erläutere am Beispiel des Attributs obergrenzeJeKm, welchen Vorteil das hat. (3 Punkte)
Private Attribute sind nur innerhalb der Klasse sichtbar (Kapselung, 1 Punkt). Andere Klassen können obergrenzeJeKm nicht direkt ändern, sondern nur über Methoden der Klasse (1 Punkt). So kann die Klasse sicherstellen, dass die Obergrenze nie über 0,10 € gesetzt wird und keine ungültigen Werte (z. B. negative Beträge) entstehen; wird die interne Speicherung später geändert, bleiben die anderen Klassen davon unberührt (1 Punkt).
Aufgabe 2.1: Rahmenkonfiguration im Fahrradshop (Kernkompetenz)
(ca. 28 min Bearbeitungszeit)
Du bist Auszubildende*r im Entwicklungsteam der CSB-Rad GmbH in Bielefeld. Kund*innen können im Onlineshop einen Fahrradrahmen nach Maß konfigurieren, der dann beim Fertigungspartner Rahmenwerk OWL GmbH in Gütersloh gebaut wird. Der Konfigurator wird gerade objektorientiert neu entwickelt. Cem Sarıkaya, Geschäftsführer Technik und IT, hat die Anforderungen an die Klasse Rahmenkonfiguration zusammengestellt:
Jede Rahmenkonfiguration hat eine Konfigurationsnummer (ganze Zahl), eine Rahmenform, eine Rahmenhöhe in ganzen Zentimetern, einen RAL-Farbcode als Text (z. B. „RAL 5015“), eine Oberfläche, eine optionale Lasergravur (Text) und einen Grundpreis in Euro (Dezimalzahl).
Für Rahmenform und Oberfläche gibt es bereits die Aufzählungen
Rahmenform(DIAMANT,TRAPEZ,TIEFEINSTEIGER,LASTENRAD_LONG_JOHN) undOberflaeche(GLANZ,MATT,STRUKTURIERT). Wird keine Oberfläche gewählt, ist sie matt.Sämtliche Attribute der Klasse sind privat.
Die Konfigurationsnummer wird beim Erzeugen automatisch fortlaufend vergeben. Dazu merkt sich die Klasse in einem für alle Objekte gemeinsamen Zähler
naechsteNummerdie nächste freie Nummer; die erste Nummer ist 1001. Eine ebenfalls öffentliche MethodeanzahlKonfigurationengibt zurück, wie viele Konfigurationen bisher erzeugt wurden – auch dann, wenn noch kein Objekt existiert.Ein öffentlicher Konstruktor erhält Rahmenform, Rahmenhöhe und Farbcode.
Andere Klassen dürfen die Konfigurationsnummer auslesen. Ist sie einmal vergeben, darf sie niemand mehr ändern.
Die Rahmenhöhe lässt sich nachträglich anpassen, allerdings nur auf Werte von 40 bis 64 cm; die Methode dafür meldet zurück, ob der neue Wert übernommen wurde. Auslesen lässt sich die Höhe ebenfalls.
Eine andere Oberfläche kann jederzeit gesetzt werden, ausgelesen wird sie nicht. Der Text der Gravur ist dagegen von außen les- und schreibbar.
Die öffentliche Methode
berechnePreisgibt den Gesamtpreis (Grundpreis plus Aufpreise für Oberfläche und Gravur) zurück.Die Methode
pruefeRalCodeprüft, ob ein übergebener Text ein gültiger RAL-Code ist. Sie wird nur innerhalb der Klasse benötigt.Die Methode
uebertrageAnPartnererzeugt aus der Konfiguration den Fertigungsauftrag für Rahmenwerk OWL und gibt die Auftragsnummer als Text zurück. Sie darf nur von Klassen aufgerufen werden, die im selben Paketfertigungliegen.
a) Die Anforderungen setzen das Prinzip der Kapselung um. Nenne zwei Ziele, die mit Kapselung in der objektorientierten Programmierung erreicht werden. (4 Punkte)
Je Ziel 2 Punkte (1 Punkt Nennung, 1 Punkt kurze Konkretisierung), z. B.:
Daten und zugehörige Methoden in einer Einheit zusammenfassen: Zustand (Attribute) und Verhalten (Methoden) eines Objekts gehören zusammen und werden gemeinsam gepflegt.
Kontrollierter Zugriff über eine Schnittstelle (Geheimnisprinzip, information hiding): Andere Objekte erreichen die Daten nur über öffentliche Methoden. So kann z. B. der Setter für die Rahmenhöhe ungültige Werte abweisen; der Zustand bleibt immer gültig (konsistent).
Änderbarkeit/Wartbarkeit: Die innere Darstellung (z. B. Datentyp eines Attributs) kann geändert werden, ohne dass aufrufender Code angepasst werden muss.
Weniger Fehler durch Abhängigkeiten: Andere Klassen hängen nur von der öffentlichen Schnittstelle ab, nicht von Implementierungsdetails.
b) Erstelle das UML-Klassendiagramm der Klasse Rahmenkonfiguration. Gib alle Attribute und Methoden mit Sichtbarkeit und Datentypen an, außerdem den Konstruktor. Notiere Getter und Setter nur dort, wo die Anforderungen sie verlangen. Die beiden Aufzählungen musst Du nicht zeichnen. (12 Punkte)
Bewertung:
acht Attribute mit
-und passendem Datentyp: je 0,5 Punkte (4 Punkte)Konstruktor mit Klassennamen, drei typisierten Parametern und ohne Rückgabetyp: 1 Punkt
zehn Methoden mit Sichtbarkeit und vollständiger Signatur (
getKonfigurationsnr,getRahmenhoehe,setRahmenhoehemit RückgabeBoolean,setOberflaeche,getGravur,setGravur,berechnePreis,pruefeRalCodemit-,uebertrageAnPartnermit~,anzahlKonfigurationen): je 0,5 Punkte (5 Punkte)naechsteNummerundanzahlKonfigurationen()als statisch gekennzeichnet (unterstrichen oder{static}): 1 PunktStartwerte
= 1001und= MATT: 1 Punkt
Hinweise:
Kein Setter für die Konfigurationsnummer – nach der Vergabe darf sie niemand mehr ändern. Ein
setKonfigurationsnrgibt Abzug.anzahlKonfigurationen()muss statisch sein, weil sie auch ohne Objekt aufrufbar sein soll.Die Gravur ist optional:
String [0..1]ist am genauesten,Stringallein ist ebenfalls richtig.Als Typ für Rahmenform und Oberfläche werden die vorhandenen Aufzählungen verwendet, nicht
String.
c) Implementiere in Pseudocode
den Konstruktor: Er vergibt die Konfigurationsnummer und erhöht den Zähler. Die Rahmenhöhe wird über den Setter gesetzt; ist sie ungültig, wird 52 cm verwendet. Der Farbcode wird nur übernommen, wenn er gültig ist, sonst wird „RAL 9005“ (Tiefschwarz) eingetragen. Den Grundpreis liefert die vorhandene Klassenmethode
Preisliste.grundpreis(form: Rahmenform): Real.die Methode zum Ändern der Rahmenhöhe.
(8 Punkte)
öffentlich Rahmenkonfiguration(form: Rahmenform, hoehe: Integer, farbcode: String)
this.konfigurationsnr := naechsteNummer
naechsteNummer := naechsteNummer + 1
this.rahmenform := form
wenn nicht setRahmenhoehe(hoehe) dann
this.rahmenhoehe := 52
ende wenn
wenn pruefeRalCode(farbcode) dann
this.ralFarbcode := farbcode
sonst
this.ralFarbcode := "RAL 9005"
ende wenn
this.grundpreis := Preisliste.grundpreis(form)
// oberflaeche ist durch den Startwert bereits MATT
ende Konstruktor
öffentlich setRahmenhoehe(hoehe: Integer): Boolean
wenn hoehe >= 40 und hoehe <= 64 dann
this.rahmenhoehe := hoehe
rückgabe wahr
sonst
rückgabe falsch
ende wenn
ende Methode
Bewertung Konstruktor (5 Punkte): Methodenkopf ohne Rückgabetyp 1 Punkt, Nummer vergeben und Zähler erhöhen 1 Punkt, Höhe über Setter mit Ersatzwert 1 Punkt, Farbcode mit Prüfung 1 Punkt, Grundpreis über Klassenmethode und Form zuweisen 1 Punkt.
Bewertung Setter (3 Punkte): Methodenkopf mit Parameter und Rückgabetyp 1 Punkt, Bereichsprüfung 1 Punkt, Zuweisung und beide Rückgaben 1 Punkt.
Hinweis: Wer im Konstruktor die Höhe direkt zuweist, ohne zu prüfen, umgeht die Kapselung – dann kann ein ungültiger Zustand entstehen.
d) Ein Mit-Azubi fragt, was die vier Sichtbarkeiten im Klassendiagramm bedeuten. Fülle die Tabelle aus: Trage den Namen ein und kreuze an, von wo aus auf ein so gekennzeichnetes Attribut zugegriffen werden kann (Bedeutung nach UML). (4 Punkte)
| Symbol | Name | eigene Klasse | Unterklasse (auch in anderem Paket) | andere Klasse im selben Paket | beliebige andere Klasse |
|---|---|---|---|---|---|
+ |
|||||
- |
|||||
# |
|||||
~ |
| Symbol | Name | eigene Klasse | Unterklasse (auch in anderem Paket) | andere Klasse im selben Paket | beliebige andere Klasse |
|---|---|---|---|---|---|
+ |
public (öffentlich) | x | x | x | x |
- |
private (privat) | x | |||
# |
protected (geschützt) | x | x | (x) | |
~ |
package (paketsichtbar) | x | nur, wenn im selben Paket | x |
Je richtig ausgefüllter Zeile 1 Punkt.
Zu #: Nach UML ist ein geschütztes Element nur für die eigene Klasse und für Unterklassen sichtbar. In Java sehen es zusätzlich alle Klassen im selben Paket – daher die Klammer. Beide Antworten sind richtig, wenn sie begründet sind.
e) Erläutere, warum naechsteNummer als Klassenattribut, rahmenhoehe dagegen als Instanzattribut modelliert wird. (3 Punkte)
Ein Instanzattribut gibt es in jedem Objekt einzeln; jede Konfiguration hat ihre eigene Rahmenhöhe (1 Punkt).
Ein Klassenattribut (statisch) gibt es nur einmal für die ganze Klasse; alle Objekte teilen sich den Wert. Nur so kann der Zähler wissen, welche Nummer als Nächstes frei ist – ein Zähler je Objekt würde bei jedem Objekt wieder mit 1001 beginnen (1 Punkt).
Weil der Zähler unabhängig von einem Objekt existiert, kann auch die statische Methode
anzahlKonfigurationen()ohne Objekt auf ihn zugreifen (z. B.naechsteNummer - 1001); auf Instanzattribute wierahmenhoehehat sie dagegen keinen Zugriff (1 Punkt).
Aufgabe 2.2: Türschilder und Infomonitore beim Barcamp (Kernkompetenz)
(ca. 35 min Bearbeitungszeit)
Du gehörst als Auszubildende*r zum Orga-Team des Barcamps „Lernen.Digital.Leben 2027“ am Ratz und Rübe Berufskolleg in Bielefeld. Vor den acht Barcamp-Räumen hängen E-Ink-Türschilder, die per MQTT den aktuellen Sessionplan bekommen. Emre Aksoy (Azubi FISY, Leitung Technikteam) hat die Klasse Tuerschild bereits in Java programmiert, aber keine Dokumentation erstellt. Gesamtleiter Dimitrios Papadopoulos bittet Dich, das Klassenmodell nachzuziehen. Nutze die Notationsübersicht oben.
package barcamp.anzeige;
public class Tuerschild {
public static final int MAX_ZEICHEN = 22;
private static int anzahlSchilder = 0;
private String raumnummer;
private String mqttTopic;
protected int akkustand;
private String[] belegung = new String[5]; // ein Eintrag je Session-Slot
private boolean online = false;
public Tuerschild(String raumnummer) {
this(raumnummer, "barcamp/raum/" + raumnummer);
}
public Tuerschild(String raumnummer, String mqttTopic) {
this.raumnummer = raumnummer;
this.mqttTopic = mqttTopic;
anzahlSchilder++;
}
public String getRaumnummer() {
return raumnummer;
}
public int getAkkustand() {
return akkustand;
}
void setAkkustand(int prozent) {
if (prozent >= 0 && prozent <= 100) {
akkustand = prozent;
}
}
public boolean isOnline() {
return online;
}
public void aktualisiere(int slot, String titel) {
belegung[slot] = kuerze(titel);
}
public int anzahlFreieSlots() {
int frei = 0;
for (String eintrag : belegung) {
if (eintrag == null) {
frei++;
}
}
return frei;
}
private String kuerze(String text) {
if (text.length() <= MAX_ZEICHEN) {
return text;
}
return text.substring(0, MAX_ZEICHEN - 1) + "…";
}
public static int getAnzahlSchilder() {
return anzahlSchilder;
}
}a) Erstelle aus dem Quelltext das UML-Klassendiagramm der Klasse Tuerschild mit allen Attributen und Methoden. (10 Punkte)
Bewertung:
sieben Attribute mit Sichtbarkeit und Datentyp: je 0,5 Punkte (3,5 Punkte)
zehn Operationen (zwei Konstruktoren und acht Methoden) mit Sichtbarkeit und vollständiger Signatur: je 0,5 Punkte (5 Punkte)
#akkustandund~setAkkustand(…)richtig erkannt (Java:protectedbzw. kein Modifikator = Paketsichtbarkeit): 0,5 PunkteMAX_ZEICHEN,anzahlSchilderundgetAnzahlSchilder()als statisch gekennzeichnet,MAX_ZEICHENzusätzlich als Konstante ({readOnly}, auch{final}wird akzeptiert): 1 Punkt
Hinweise:
Das Array
belegungkann alsString [5],String [0..*]oderString[]notiert werden.Startwerte (
= 22,= 0,= false) sind für die volle Punktzahl nicht nötig, aber richtig.Der Rumpf der Methoden (z. B. die Prüfung in
setAkkustand) erscheint im Klassendiagramm nicht.
b) Mia Schröder hat für die Sessionplanung die Klasse Session skizziert. Die Anforderungen lauten:
Titel und Raum sind privat; der Titel kann über Getter und Setter gelesen und geändert werden.
Der Slot (Nummer des Zeitfensters) ist privat.
Ein öffentlicher Konstruktor erhält Titel und Raum.
Die öffentliche Methode
istVollgibt zurück, ob alle Plätze vergeben sind.Die öffentliche Methode
buchenerhält eine Person und gibt zurück, ob die Buchung geklappt hat.
Session
--------------------------------------------
- titel
- raum : Raum
+ slot : int
--------------------------------------------
+ Session(titel : String) : void
+ getTitel(titel : String) : String
+ setTitel(titel : String) : String
+ istVoll : boolean
private buchen(p : Person) : boolean
Die Skizze enthält acht Fehler. Finde mindestens sieben davon und korrigiere sie, indem Du die fehlerhaften Zeilen richtig notierst. (7 Punkte)
| Nr. | fehlerhaft | korrigiert | Fehler |
|---|---|---|---|
| 1 | - titel |
-titel: String |
Datentyp fehlt |
| 2 | + slot : int |
-slot: Integer |
Slot soll privat sein |
| 3 | + Session(titel : String) : void |
+Session(titel: String, raum: Raum) |
Konstruktor hat keinen Rückgabetyp (auch nicht void) … |
| 4 | (ebenda) | (ebenda) | … und der Parameter raum fehlt |
| 5 | + getTitel(titel : String) : String |
+getTitel(): String |
Getter erhält keinen Parameter |
| 6 | + setTitel(titel : String) : String |
+setTitel(titel: String) |
Setter gibt nichts zurück (oder : void) |
| 7 | + istVoll : boolean |
+istVoll(): Boolean |
ohne Klammern wäre es ein Attribut |
| 8 | private buchen(p : Person) : boolean |
+buchen(p: Person): Boolean |
Methode soll öffentlich sein (im Diagramm steht dafür das Symbol +, nicht ein Wort) |
Je gefundenem und richtig korrigiertem Fehler 1 Punkt, höchstens 7 Punkte. Die Fehler 3 und 4 stecken in derselben Zeile und zählen einzeln.
c) Die Türschilder nutzen für die Verbindung zum MQTT-Broker eine Klassenbibliothek. Ihre Dokumentation liegt nur auf Englisch vor:
Class MqttConnection – An object of this class represents one client session with an MQTT broker. The constructor takes the host name of the broker (text) and the port number (integer); it creates the object but does not connect yet. Host name and port are stored in private fields. Each connection has a client identifier (text) which is private as well and can only be read with
getClientId(). The protected fieldkeepAliveSeconds(integer) defines how often the client signals that it is still alive; its default value is 60.DEFAULT_PORTis a public class constant with the value 1883. All methods are public:connect()opens the session and returnstrueon success,disconnect()closes it and returns nothing.publish()takes a topic, a message (both text) and a flagretained(true/false) and returns nothing.subscribe()takes a topic and returnstrueif the broker accepted the subscription.isConnected()tells whether the session is currently open.
Ergänze das Klassenmodell um die Klasse MqttConnection mit allen beschriebenen Attributen und Methoden. Jedes Türschild baut seine eigene Verbindung auf; die Verbindung „kennt“ das Türschild nicht. Ergänze auch diese Beziehung mit Multiplizitäten. (8 Punkte)
Bewertung:
vier Attribute mit Sichtbarkeit und Typ, Startwert 60 und Konstante
DEFAULT_PORTstatisch mit Wert 1883: 2 PunkteKonstruktor mit zwei typisierten Parametern ohne Rückgabetyp: 1 Punkt
sechs Methoden mit vollständiger Signatur: je 0,5 Punkte (3 Punkte)
gerichtete Assoziation (Pfeil vom Türschild zur Verbindung, weil nur das Türschild die Verbindung kennt): 1 Punkt
Multiplizitäten
1zu1: 1 Punkt
Hinweise: Die englischen Bezeichner werden übernommen, weil sie aus der Bibliothek stammen. Wird die Beziehung als Attribut -verbindung: MqttConnection im Türschild notiert, gibt das für die Beziehung 1 Punkt; die Multiplizitäten fehlen dann aber. Eine Komposition (Türschild als Ganzes, Verbindung als existenzabhängiges Teil) ist fachlich vertretbar und wird ebenfalls akzeptiert.
d) Die Klasse Tuerschild hat zwei Konstruktoren. Erläutere den Begriff Überladung an diesem Beispiel und begründe, warum ein zusätzlicher Konstruktor Tuerschild(String gebaeudeRaum, String ipAdresse) so nicht möglich wäre. (4 Punkte)
Überladene Methoden (oder Konstruktoren) haben denselben Namen, aber unterschiedliche Parameterlisten (Anzahl, Typen oder Reihenfolge der Typen), also unterschiedliche Signaturen. Beim Aufruf wird anhand der Argumente entschieden, welche Variante ausgeführt wird (2 Punkte).
Beispiel:
new Tuerschild("A.104")ruft den Konstruktor mit einem Parameter auf, der das Topic selbst bildet;new Tuerschild("A.104", "barcamp/aula")ruft den Konstruktor mit zwei Parametern auf (1 Punkt).Der zusätzliche Konstruktor hätte dieselbe Parameterliste
(String, String)wie der vorhandene zweite Konstruktor. Parameternamen gehören nicht zur Signatur; der Compiler könnte die beiden nicht unterscheiden (1 Punkt).
e) Nach dem Barcamp-Morgen ändert sich der Sessionplan laufend. Die Klasse Sessionplaner soll alle Anzeigegeräte (Türschilder und Infomonitore) benachrichtigen, ohne deren Klassen zu kennen. Dazu implementieren beide Klassen das vorgegebene Interface Anzeigegeraet. Der Sessionplaner verwaltet beliebig viele angemeldete Anzeigegeräte; die Geräte existieren aber auch ohne den Sessionplaner.
Vervollständige das Klassendiagramm: Ergänze die fehlenden Methoden in Tuerschild und Infomonitor sowie alle Beziehungen mit Multiplizitäten. (5 Punkte)
Bewertung:
zwei Realisierungen (gestrichelte Linie mit hohlem Dreieck am Interface): je 1 Punkt (2 Punkte)
die beiden Interface-Methoden
zeigeSession(s: Session)undleeren()in beiden Klassen: je 0,5 Punkte (2 Punkte)Aggregation zwischen
Sessionplaner(Raute) undAnzeigegeraetmit Multiplizitäten1und0..*: 1 Punkt
Hinweise: Eine Klasse, die ein Interface implementiert, muss alle seine Methoden bereitstellen; deshalb werden sie im Klassendiagramm erneut aufgeführt. Die Beziehung zeigt auf das Interface, nicht auf die konkreten Klassen – genau dadurch bleibt der Sessionplaner von Türschild und Infomonitor unabhängig. Eine einfache (gerichtete) Assoziation statt der Aggregation wird mit 0,5 Punkten bewertet.
f) Der Sessionplaner soll künftig den kompletten Plan eines Türschilds auslesen können. Emre schlägt zwei Varianten für eine neue Methode vor (Arrays stammt aus java.util):
// Variante A
public String[] getBelegung() {
return belegung;
}
// Variante B
public String[] getBelegung() {
return Arrays.copyOf(belegung, belegung.length);
}Beurteile beide Varianten im Hinblick auf die Kapselung: Kann eine andere Klasse über den Rückgabewert die Belegung des Türschilds ändern und dabei die Kürzung durch kuerze() umgehen? Notiere außerdem die neue Methode so, wie sie im Klassendiagramm erscheint. (4 Punkte)
Variante A liefert keinen neuen Plan, sondern einen Verweis auf das private Array des Türschilds. Eine andere Klasse kann damit z. B.
schild.getBelegung()[0] = "Ein sehr langer Sessiontitel ohne Kürzung";ausführen und ändert so die Belegung, ohne dassaktualisiere()undkuerze()beteiligt sind. Das Attribut ist zwarprivate, die Kapselung ist aber durchbrochen (1,5 Punkte).Variante B gibt eine Kopie zurück. Änderungen des Aufrufers betreffen nur die Kopie; das Array im Türschild bleibt unverändert, Änderungen laufen weiter nur über
aktualisiere(). Die Kapselung bleibt gewahrt; dafür kostet jeder Aufruf etwas Speicher und Rechenzeit für die Kopie (1,5 Punkte).Im Klassendiagramm sehen beide Varianten gleich aus:
+getBelegung(): String [0..*](auchString[]ist richtig). Der Unterschied steckt nur in der Implementierung (1 Punkt).
Aufgabe 2.3: Inserate und Buchungen in der Mitfahr-App (Kernkompetenz)
(ca. 30 min Bearbeitungszeit)
Du arbeitest als Auszubildende*r im FIA-Projektteam der Mitfahr-App RatzFahrt am Ratz und Rübe Berufskolleg. Bisher greift die App direkt auf die Datenbank zu. Für die neue Version soll die Fachlogik objektorientiert umgesetzt werden. Oksana Melnyk hat mit Projektleiter Thomas Becker die Anforderungen gesammelt:
Fahrer*innen veröffentlichen Angebote, Mitfahrende veröffentlichen Gesuche. Beides sind Inserate. Ein Inserat ist immer entweder ein Angebot oder ein Gesuch; ein „allgemeines“ Inserat darf nicht erzeugt werden.
Jedes Inserat hat einen Abfahrtszeitpunkt und eine Richtung. Beide sollen auch in Unterklassen direkt zugreifbar sein, aber nicht von außen. Für Zeitpunkte gibt es den Datentyp
Zeitpunkt, für die Richtung die AufzählungRichtung(ZUR_SCHULE,NACH_HAUSE).Jedes Inserat bezieht sich auf genau einen Haltepunkt (Name und Ort, beide Text). An einem Haltepunkt gibt es beliebig viele Inserate; ein Haltepunkt muss seine Inserate nicht kennen. Der Name eines Haltepunkts kann abgefragt werden.
Haltepunkt und Richtung eines Inserats können abgefragt werden.
Jedes Inserat liefert mit
beschreibung()einen Text für die Flurmonitore. Angebote und Gesuche erzeugen diesen Text unterschiedlich.Ein Angebot hat eine Anzahl freier Plätze und einen Kostenbeitrag in Euro. Es kann prüfen, ob es voll ist, und eine Anfrage einer mitfahrenden Person annehmen (Rückgabe, ob das geklappt hat).
Ein Gesuch hat zusätzlich einen spätesten Abfahrtszeitpunkt.
Nimmt ein Angebot eine Anfrage an, entsteht eine Buchung mit dem Anfragezeitpunkt und der Angabe, ob sie bestätigt ist (zu Beginn nicht). Eine Buchung gehört zu genau einem Angebot und kann ohne dieses nicht existieren; wird ein Angebot gelöscht, werden seine Buchungen mitgelöscht. Jede Buchung verweist auf genau eine mitfahrende Person (Klasse
Nutzer, bereits vorhanden). Eine Buchung kann bestätigt werden.Jedes Inserat wird von genau einem
Nutzererstellt; ein Nutzer kann beliebig viele Inserate erstellen.Die Fahrtenbörse verwaltet alle Inserate. Inserate können hinzugefügt werden. Die Methode
offeneAngeboteliefert für einen Haltepunkt und eine Richtung alle Angebote, die noch nicht voll sind. Inserate bestehen auch, wenn die Fahrtenbörse neu gestartet wird.Alle Klassen erhalten passende öffentliche Konstruktoren; alle übrigen Attribute sind privat, alle genannten Methoden öffentlich.
a) Entwickle aus den Anforderungen ein UML-Klassendiagramm und zeichne es. Es soll die Klassen Fahrtenboerse, Inserat, Angebot, Gesuch, Buchung und Haltepunkt mit Attributen, Methoden (vollständige Signatur), Sichtbarkeiten sowie alle Beziehungen mit Multiplizitäten enthalten. Die Klasse Nutzer musst Du nur als Kasten ohne Inhalt zeichnen. (18 Punkte)
Bewertung:
sechs Klassen mit passenden Attributen (Sichtbarkeit
#fürabfahrtundrichtung, sonst-; Startwertfalsebeibestaetigt): je 1 Punkt (6 Punkte)Methoden und Konstruktoren mit vollständiger Signatur und Sichtbarkeit: 5 Punkte (z. B. 1 Punkt je Klasse ohne
Haltepunkt, Abzug bei fehlenden Typen oder Konstruktoren mit Rückgabetyp)Inseratundbeschreibung()als abstrakt gekennzeichnet (kursiv,{abstract}oder<<abstract>>),beschreibung()in beiden Unterklassen erneut aufgeführt: 1 PunktVererbung
Angebot/Gesuch→Inserat: 1 PunktAggregation
Fahrtenboerse◇–Inserat: 1 PunktKomposition
Angebot◆–Buchung: 1 PunktAssoziationen
Inserat→Haltepunkt(gerichtet),Buchung→NutzerundNutzer–Inserat: 2 PunkteMultiplizitäten an allen Beziehungen: 1 Punkt
Hinweise:
Der Konstruktor der abstrakten Klasse ist sinnvoll, weil die Unterklassen ihn aufrufen, um die gemeinsamen Attribute zu setzen. Er darf auch
#(protected) sein.Wer die Teile zusätzlich als Attribut notiert (z. B.
-inserate: Inserat [0..*]in der Fahrtenbörse oder-buchungen: Buchung [0..*]im Angebot), stellt dieselbe Information doppelt dar; das ist richtig, aber nicht nötig.offeneAngebotegibt mehrere Angebote zurück:Angebot [0..*],Angebot[]oderList<Angebot>.Andere sinnvolle Namen (z. B.
getBeschreibung()) sind richtig.
b) Erläutere anhand Deines Diagramms den Unterschied zwischen der Beziehung Fahrtenboerse–Inserat und der Beziehung Angebot–Buchung. Gehe dabei auf die Lebensdauer der Objekte ein. (4 Punkte)
Aggregation (Fahrtenbörse–Inserat, hohle Raute am Ganzen): Die Fahrtenbörse fasst Inserate zusammen, die Inserate können aber auch unabhängig von ihr bestehen. Wird das Fahrtenbörsen-Objekt gelöscht (z. B. bei einem Neustart), bleiben die Inserat-Objekte erhalten und können einer neuen Fahrtenbörse wieder hinzugefügt werden (2 Punkte).
Komposition (Angebot–Buchung, gefüllte Raute am Ganzen): Eine Buchung ist existenzabhängig von genau einem Angebot. Sie wird zusammen mit bzw. durch das Angebot erzeugt und endet spätestens mit ihm: Wird das Angebot gelöscht, werden auch seine Buchungen gelöscht. Eine Buchung kann nicht zu einem anderen Angebot wechseln (2 Punkte).
c) Formuliere die Methode offeneAngebote der Klasse Fahrtenboerse in Pseudocode. Die Fahrtenbörse speichert ihre Inserate in der Liste inserate. Hinweis: Mit x istInstanzVon Angebot kannst Du prüfen, ob ein Objekt ein Angebot ist; mit (Angebot) x behandelst Du es danach als Angebot. (5 Punkte)
öffentlich offeneAngebote(hp: Haltepunkt, r: Richtung): Liste von Angebot
ergebnis := neue leere Liste von Angebot
für jedes inserat in inserate
wenn inserat istInstanzVon Angebot dann
angebot := (Angebot) inserat
wenn angebot.getHaltepunkt() = hp
und angebot.getRichtung() = r
und nicht angebot.istVoll() dann
ergebnis.hinzufuegen(angebot)
ende wenn
ende wenn
ende für
rückgabe ergebnis
ende Methode
Bewertung: Methodenkopf mit Parametern und Rückgabetyp 1 Punkt, Ergebnisliste anlegen und zurückgeben 1 Punkt, Schleife über alle Inserate 1 Punkt, Typprüfung 1 Punkt, Bedingung mit Haltepunkt, Richtung und istVoll() sowie Hinzufügen 1 Punkt.
Hinweis: Zugriff auf angebot.freiePlaetze statt istVoll() wäre nicht erlaubt, weil das Attribut privat ist.
d) Thomas Becker möchte, dass Fahrer*innen auch regelmäßige Fahrten anbieten können, z. B. jeden Montag und Donnerstag bis zum Schuljahresende. Entwirf dazu eine Ergänzung des Klassendiagramms: eine Klasse Pendelangebot mit den Wochentagen (Aufzählung Wochentag, vorhanden), dem letzten Gültigkeitstag und einer Methode, die prüft, ob die Fahrt an einem bestimmten Wochentag stattfindet. Ergänze auch die Beziehung zu den vorhandenen Klassen. (3 Punkte)
Bewertung: Klasse mit Vererbung von Angebot 1 Punkt, Attribute (wochentage mehrwertig, gueltigBis) 1 Punkt, Methode findetStattAm(tag: Wochentag): Boolean und überschriebene beschreibung() 1 Punkt.
Ein Pendelangebot ist ein besonderes Angebot – es hat Plätze, Kostenbeitrag und Buchungen. Deshalb erbt es von Angebot und nicht direkt von Inserat.
e) Erläutere, warum die Klasse Inserat nicht instanziiert werden kann und warum die Methode beschreibung() in Inserat abstrakt ist, in Angebot und Gesuch aber noch einmal aufgeführt wird. (3 Punkte)
Inseratist eine abstrakte Klasse: Laut Anforderung gibt es kein „allgemeines“ Inserat, nur Angebote und Gesuche. Von abstrakten Klassen können keine Objekte erzeugt werden; sie fassen das Gemeinsame der Unterklassen zusammen (1 Punkt).beschreibung()ist abstrakt, weil es keine allgemeingültige Umsetzung gibt; die Methode legt nur die Signatur fest. Eine Klasse mit einer abstrakten Methode muss selbst abstrakt sein (1 Punkt).Die Unterklassen überschreiben die Methode mit ihrer eigenen Umsetzung; deshalb steht sie dort noch einmal (ohne
{abstract}). Ruft der Flurmonitorbeschreibung()für ein beliebiges Inserat auf, wird zur Laufzeit die passende Methode des konkreten Objekts ausgeführt (späte Bindung, Polymorphie) (1 Punkt).
Links und weitere Informationen
Hinweis zur Nachnutzung als Open Educational Resource (OER)
Dieser Artikel und seine Texte, Bilder, Grafiken, Code und sonstiger Inhalt sind - sofern nicht anders angegeben - lizenziert unter CC BY 4.0. Nennung gemäß TULLU-Regel bitte wie folgt: “Übungsaufgaben zum UML-Klassendiagramm” von oer-informatik.de (H. Stein), Lizenz: CC BY 4.0. Der Artikel wurde unter https://oer-informatik.de/uml-klassendiagramm-uebungsaufgaben veröffentlicht, die Quelltexte sind in weiterverarbeitbarer Form verfügbar im Repository unter https://gitlab.com/oer-informatik/uml/uml-diagramme. Erstellt mit KI-Assistenz; von mir umfassend redaktionell überarbeitet, geprüft und freigegeben. Stand: 29.10.2026.
[Kommentare zum Artikel lesen, schreiben] / [Artikel teilen] / [gitlab-Issue zum Artikel schreiben]
