Ü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 Fahrradverleih-Programm hat eine Klasse Fahrrad und erzeugt daraus mehrere Objekte. Welche Aussagen stimmen?
ausleihen() ändert nur das Objekt, an dem sie aufgerufen wird.Eine Musik-App wird objektorientiert programmiert. Ordne jede Karte zu: Ist das eine Klasse, ein Objekt, ein Attribut oder eine Methode?
Die Anweisung Spind s1 = new Spind(117, "Mia"); in der Schulverwaltung — setze die Fachbegriffe ein. Ein Wort bleibt übrig.
Das Schlüsselwort erzeugt ein neues . Dabei läuft der und füllt die mit den Startwerten 117 und „Mia“. Die Variable s1 danach auf das neue Spind-Exemplar.
Spind gibt es schon — sie wird durch new nicht neu erzeugt, sondern als Bauplan benutzt. Wichtig ist auch das Wort „verweist“: s1 ist nicht das Objekt, sondern zeigt darauf wie ein Pfeil.Die Klasse Spind hat den Konstruktor Spind(int nummer, String name) und die Methoden abschliessen(), oeffnen() und istAbgeschlossen(). Verbinde jede Zeile mit ihrer Wirkung.
new erzeugt Objekte. Spind b = a; kopiert den Verweis, nicht den Spind — danach gibt es weiterhin nur einen Spind 12, aber zwei Pfeile darauf. Spind c; ist ein leerer Pfeil. Und ein Objekt ohne Variable ist zwar da, aber man kommt nie wieder an es heran.new vorkommt — nur dort entsteht ein Objekt.new eine Variable? Wenn nicht, wohin zeigt dann der Pfeil?Lea und Tim haben je ein Handy. Beim Spielen sinkt der Akku um die Hälfte der Minuten, Laden bringt 30 Prozentpunkte (höchstens 100).
public class Handy {
private String besitzer;
private int akku;
public Handy(String besitzer, int akku) {
this.besitzer = besitzer;
this.akku = akku;
}
public void laden() {
akku = akku + 30;
if (akku > 100) {
akku = 100;
}
}
public void spielen(int minuten) {
akku = akku - minuten / 2;
}
public int getAkku() {
return akku;
}
}
Handy lea = new Handy("Lea", 40);
Handy tim = new Handy("Tim", 90);
lea.spielen(30);
tim.laden();
lea.laden();
tim.spielen(50);
lea.spielen(9);
-
Leas Akku direkt nach
lea.spielen(30)% -
Tims Akku direkt nach
tim.laden()% - Leas Akku ganz am Ende %
- Transfer: Wie viele Minuten muss Tim danach mindestens spielen, damit sein Akku 0 zeigt? min
minuten / 2 ist eine Division mit zwei ints. Was ergibt 9 / 2?Die Klasse Spind ist wie in A4. Drei Zeilen in main lassen sich nicht übersetzen.
u zeigt danach auf denselben Spind wie s.Spind(int nummer, String name).Mit der Klasse Handy aus A5 wird ausgeführt:
Handy lea = new Handy("Lea", 40);
Handy tim = new Handy("Tim", 90);
Handy x = tim;
Welches Objekt ändert seinen Akkustand durch die jeweilige Zeile?
| Zeile | Leas Handy | Tims Handy | keins davon |
|---|---|---|---|
lea.laden(); |
|||
tim.spielen(20); |
|||
x.spielen(10); |
|||
Handy neu = new Handy("Lea", 40); |
|||
int a = lea.getAkku(); |
x ist kein drittes Handy, sondern ein zweiter Name für Tims Handy — x.spielen(10) leert also Tims Akku. Ein neues Objekt mit denselben Werten wie Leas Handy ist trotzdem ein anderes Objekt; Leas Handy bleibt unverändert. Ein Getter liest nur und ändert nichts.new baut ein weiteres Objekt. Und welche Methode ändert den Akku gar nicht?Objekte treffen auf Schleifen (1.1.3) und Methoden mit Parametern (1.1.4).
public class Flasche {
private int inhalt;
public Flasche(int inhalt) {
this.inhalt = inhalt;
}
public void trinken(int ml) {
if (ml <= inhalt) {
inhalt = inhalt - ml;
}
}
public void auffuellen() {
inhalt = 750;
}
public int getInhalt() {
return inhalt;
}
}
Flasche f = new Flasche(750);
for (int i = 0; i < 4; i++) {
f.trinken(200);
}
System.out.println(f.getInhalt());
f.auffuellen();
f.trinken(300);
f.trinken(300);
f.trinken(300);
System.out.println(f.getInhalt());
Erste Ausgabe: ml
So oft wurde in der Schleife wirklich getrunken:
Zweite Ausgabe: ml
trinken(200) viermal auf: 750 → 550 → 350 → 150; beim vierten Mal ist 200 <= 150 falsch, es passiert nichts. Wer 4 · 200 abzieht, landet bei −50 — genau das verhindert die Prüfung im Objekt. Nach dem Auffüllen: 750 → 450 → 150, der dritte Schluck scheitert wieder. Zweimal 150 — aus ganz verschiedenen Gründen.Auftrag (Klasse Spind wie in A4): „Erzeuge zuerst einen Spind für Ole (Nr. 4), dann einen für Pia (Nr. 5). Schließe nur Pias Spind ab. Gib dann aus, ob Oles Spind abgeschlossen ist.“ Baue das Programm — drei Bausteine bleiben übrig.
false aus: Abgeschlossen wurde nur Pias Spind, Oles Objekt ist davon unberührt. Die Ablenker sind die drei klassischen Fehler: Methode an der Klasse aufrufen, das falsche Objekt ändern, new vergessen.Mit der Klasse Handy aus A5 (Laden: +30, höchstens 100):
Handy a = new Handy("Ana", 20);
Handy b = a;
b.laden();
Handy c = new Handy("Ana", 20);
c.laden();
a.laden();
System.out.println(a.getAkku());
Welche Zahl wird ausgegeben?
b = a erzeugt kein zweites Handy — a und b zeigen auf dasselbe Objekt. b.laden() lädt also Anas Handy: 20 → 50, danach a.laden(): 80. c ist dagegen ein eigenes Objekt mit zufällig denselben Startwerten; sein Laden wirkt nur auf c (50). Wer b für eine Kopie hält, kommt auf 50; wer c für dasselbe Handy hält, auf 100.new: Wie viele Handy-Objekte gibt es wirklich?