Übungsaufgaben
Zehn Übungen zum Klicken, Ziehen und Knobeln — von AFB I bis AFB III. Jede Übung gibt dir sofort Rückmeldung; wenn du hängst, helfen dir die gestuften Tipps.
Ein Fuhrparkprogramm ist wie abgebildet modelliert. Nennen Sie alle Attribute und Methoden, die ein Objekt der Klasse LKW besitzt — geerbte eingeschlossen.
- - kennzeichen: Zeichenkette
- - kmStand: Ganzzahl
- c Fahrzeug(k: Zeichenkette)
- + fahren(km: Ganzzahl)
- + beschreibung(): Zeichenkette
- + maut(km: Ganzzahl): Ganzzahl
- - sitze: Ganzzahl
- c PKW(k: Zeichenkette, sitze: Ganzzahl)
- - nutzlast: Fließkommazahl
- c LKW(k: Zeichenkette, nutzlast: Fließkommazahl)
- + beladen(t: Fließkommazahl)
- + beschreibung(): Zeichenkette
- + maut(km: Ganzzahl): Ganzzahl
Fahrzeug (kennzeichen, kmStand, fahren, …) und hat zusätzlich nutzlast und beladen. sitze gehört nur zum PKW — Geschwisterklassen erben nichts voneinander. Konstruktoren werden überhaupt nicht vererbt. Dass kennzeichen privat ist, ändert nichts daran, dass jedes LKW-Objekt dieses Attribut besitzt; nur der Quelltext von LKW darf nicht direkt darauf zugreifen.Entnehmen Sie dem Klassendiagramm einer Bank, welche Aussagen zutreffen.
- - inhaber: Zeichenkette
- # kontostand: Fließkommazahl
- c Konto(inhaber: Zeichenkette)
- + einzahlen(b: Fließkommazahl)
- + abheben(b: Fließkommazahl): Wahrheitswert
- - dispo: Fließkommazahl
- + abheben(b: Fließkommazahl): Wahrheitswert
- - zinssatz: Fließkommazahl
- + verzinsen()
- nur die Klasse selbst, # auch Unterklassen, + alle)?-, # oder +.Ordnen Sie jedes Klassenpaar der passenden Beziehung zu. Die erste Klasse ist jeweils die, von der die Beziehung ausgeht.
Implementieren Sie die Klasse LKW aus A1 (ohne beladen und maut). beschreibung() soll die Beschreibung der Oberklasse um die Nutzlast ergänzen. Drei Bausteine bleiben übrig.
public class LKW Fahrzeug {
private double nutzlast;
public LKW(String kennzeichen, double nutzlast) {
(kennzeichen);
.nutzlast = nutzlast;
}
public String beschreibung() {
return + ", Nutzlast " + nutzlast + " t";
}
}
super(kennzeichen) an die Oberklasse weiter — die privaten Attribute von Fahrzeug kann nur deren Konstruktor setzen. beschreibung() ohne super. würde sich selbst aufrufen und endlos laufen (StackOverflowError). Ergebnis nach 80 km: "H-XY 1, 80 km, Nutzlast 12.0 t".super. vor dem Methodennamen — ohne ruft die Methode sich selbst auf.In Fahrzeug gilt maut(km) = km * 2 (Cent). LKW überschreibt: return km * 5 + super.maut(km); — PKW überschreibt nicht. Bestimmen Sie die Werte.
ArrayList<Fahrzeug> fuhrpark = new ArrayList<Fahrzeug>();
fuhrpark.add(new PKW("H-A 1", 5));
fuhrpark.add(new LKW("H-B 2", 7.5));
fuhrpark.add(new LKW("H-C 3", 18));
int summe = 0;
for (int i = 0; i < fuhrpark.size(); i++) {
summe = summe + fuhrpark.get(i).maut(100);
}
-
fuhrpark.get(0).maut(100)Cent -
fuhrpark.get(1).maut(100)Cent -
summenach der Schleife Cent -
dieselbe Summe, wenn vorher
fuhrpark.set(0, fuhrpark.get(1));ausgeführt wird Cent
Fahrzeug, trotzdem läuft für jeden Eintrag die Methode seines Objekts: 200 für den PKW (geerbt), je 500 + 200 = 700 für die LKW — zusammen 1600. Nach set(0, get(1)) zeigt Index 0 auf dasselbe LKW-Objekt wie Index 1 (aus 4.3.1: Liste speichert Referenzen), also 3 · 700 = 2100.maut?super.maut(km) im LKW ruft die Fahrzeug-Version auf: 2 Cent je km kommen zu den 5 Cent dazu.Für die Bank aus A2 gilt: Girokonto(inhaber, dispo) ruft zuerst super(inhaber) auf und setzt dann dispo. Stellen Sie den Ablauf von Girokonto g = new Girokonto("Ada", 500); in der richtigen Reihenfolge dar.
Girokonto wird mit "Ada" und 500 aufgerufen.
super("Ada") ruft den Konstruktor von Konto auf.
Konto setzt inhaber auf "Ada" und kontostand auf 0.
Girokonto: dispo wird 500.
g gespeichert.
super(…) ist die erste Anweisung im Konstruktor der Unterklasse.Tier.laut() liefert "(still)", Hund überschreibt mit "Wuff", Welpe extends Hund überschreibt mit return super.laut() + "chen";, Katze überschreibt mit "Miau". Ermitteln Sie die Rückgabe jedes Aufrufs.
Tier) entscheidet nur, ob der Aufruf erlaubt ist; welcher Rumpf läuft, entscheidet das Objekt (dynamische Bindung). Beim Welpen läuft seine eigene Methode, die mit super.laut() die Hunde-Version holt.new steht.super im Welpen meint die direkte Oberklasse Hund, nicht Tier.Mitarbeiter hat die privaten Attribute name und gehalt sowie getGehalt(). Eine Aushilfe ist ein Mitarbeiter und bekommt das halbe Gehalt. Überprüfen Sie die Klasse — drei Zeilen lassen sich nicht übersetzen.
super(…) muss die erste Anweisung sein, und private Attribute der Oberklasse sind in der Unterklasse nicht sichtbar. Beachte: Zeile 4 ist für sich richtig — falsch ist nur die Position von Zeile 5.super zuerst, - bleibt privat.Ein normales Konto darf nicht ins Minus. Ein Girokonto darf bis zu seinem Dispo überzogen werden (dispo = 500 heißt: bis −500 €). Erweitern Sie Girokonto um die überschreibende Methode — kontostand ist in Konto mit # (protected) deklariert.
@Override
public boolean abheben(double betrag) {
if (kontostand - betrag ) {
kontostand = kontostand betrag;
return ;
}
return false;
}
kontostand - betrag darf nicht unter -dispo fallen, also >= -dispo. Test: 0 € Guthaben, 500 € Dispo — 300 € abheben klappt (−300), weitere 250 € nicht (wäre −550). Weil kontostand protected ist, darf die Unterklasse direkt rechnen; wäre es privat, bräuchte man einen Setter oder super.abheben.dispo ist positiv gespeichert, die Grenze liegt also bei -dispo.Gegeben sind die Klassen aus A1 (beladen gibt es nur in LKW). Entscheiden Sie für jede Zeile, was passiert.
Fahrzeug f = new LKW("H-A 1", 12);
LKW l = new Fahrzeug("H-B 2");
Fahrzeug f = new LKW("H-A 1", 12); f.beladen(3);
Fahrzeug f = new PKW("H-P 1", 5); LKW l = (LKW) f;
Fahrzeug f = new LKW("H-A 1", 12); f.fahren(50);
Fahrzeug hat kein beladen. Zeile 2 scheitert, weil nicht jedes Fahrzeug ein LKW ist. Zeile 4 übersetzt dank der Typumwandlung, bricht aber zur Laufzeit mit einer ClassCastException ab: Ein PKW lässt sich nicht in einen LKW verwandeln.