Ü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.
Eine Kletterhalle verwaltet ihre Routen. Die Klasse Route hat den Konstruktor Route(name, schwierigkeit) und die Methode getSchwierigkeit(). Welche Aussagen über diese Zeile stimmen?
Route[] routen = new Route[5];
new Route[5] ruft keinen Konstruktor der Klasse Route auf — es erzeugt nur die Reihung mit fünf leeren Plätzen für Referenzen. Jede Route muss einzeln mit new Route(...) erzeugt werden. Die Indizes laufen von 0 bis 4. Ein Methodenaufruf an einem leeren Platz führt zur NullPointerException — es gibt dort kein Objekt, das 0 liefern könnte.Ein Getränkemarkt verwaltet Kisten als Reihung von Flaschen. Die Klasse Flasche hat den Konstruktor Flasche(sorte, inhaltMl), getInhalt() und leeren(). Was bewirkt jede Zeile?
new Flasche(...) mit runden Klammern erzeugt eine Flasche; new Flasche[12] mit eckigen Klammern erzeugt die Kiste mit zwölf leeren Plätzen. Typischer Fehler: kiste[1] = kiste[0]; für eine neue Flasche halten. Es wird aber nur die Referenz kopiert — Platz 1 und Platz 0 zeigen auf dieselbe Flasche. Wer danach kiste[0].leeren() aufruft, leert beide Plätze.Die Garten-AG hat acht Plätze für Beete, aber noch nicht alle angelegt: Beet[] beete = new Beet[8]; Die Methode getFlaeche() liefert die Fläche eines Beetes in m². Vervollständige die Summe über alle angelegten Beete — ein Kärtchen bleibt übrig.
int summe = ;
for (int i = 0; i < beete.; i++) {
if (beete[i] ) {
summe = summe + beete[i].();
} }
length() mit Klammern bleibt übrig: Das ist die Methode von Zeichenketten. Bei Reihungen ist length ein Attribut ohne Klammern (Kapitel 2). Die Prüfung beete[i] != null ist Pflicht, weil noch nicht alle Plätze ein Beet enthalten — ohne sie bricht die Schleife am ersten leeren Platz mit einer NullPointerException ab.Eine Foto-App speichert Fotos mit Sternebewertung (Getter und Setter für sterne).
Foto[] album = new Foto[4];
album[0] = new Foto("Strand", 3);
album[2] = new Foto("Watt", 5);
album[3] = album[0];
album[i] != null in die Schleife.Eine Koch-App speichert die Zutaten eines Rezepts in einer Reihung. Die Klasse Zutat hat den Konstruktor Zutat(name, menge) sowie getName() und getMenge(). Verbinde jede Aufgabe mit dem passenden Java-Baustein.
length − 1. Eine Zutat „entfernt“ man, indem man die Referenz auf null setzt. Beim Namensvergleich greifen drei Dinge ineinander: Zugriff auf den Platz, Getter des Objekts und equals für die Zeichenkette — mit == wäre der Vergleich unzuverlässig.Auf dem Schuldach sind Plätze für sechs Solarmodule. Die Klasse Modul hat getLeistung() (in Watt), defektMelden() und istDefekt(). Die Bedingung in der Schleife verknüpft zwei Teilbedingungen wie in Kapitel 1.
Modul[] park = new Modul[6];
park[0] = new Modul(320);
park[1] = new Modul(410);
park[3] = new Modul(380);
park[4] = new Modul(290);
park[4].defektMelden();
int summe = 0;
for (int i = 0; i < park.length; i++) {
if (park[i] != null && !park[i].istDefekt()) {
summe = summe + park[i].getLeistung();
}
}
Welchen Wert hat summe nach der Schleife (in Watt)?
&& wird die rechte Seite nur ausgewertet, wenn die linke wahr ist. Stünde !park[i].istDefekt() vorn, gäbe es an Platz 2 eine NullPointerException. Häufige Fehler: 1400 (Defekt übersehen) oder 290 (das Ausrufezeichen übersehen — dann zählte ausgerechnet nur das defekte Modul).Im Ferienlager werden die Zelte in einer Reihung verwaltet.
public class Zelt {
private String name;
private int plaetze;
private int belegt;
public Zelt(String name, int plaetze) {
this.name = name;
this.plaetze = plaetze;
belegt = 0;
}
public void aufnehmen(int personen) {
belegt = belegt + personen;
}
public int getBelegt() {
return belegt;
}
public int getFrei() {
return plaetze - belegt;
}
}
Zelt[] zelte = new Zelt[5];
zelte[0] = new Zelt("Adler", 4);
zelte[1] = new Zelt("Biber", 9);
zelte[3] = new Zelt("Dachs", 4);
zelte[4] = zelte[1];
zelte[4].aufnehmen(2);
zelte[0].aufnehmen(3);
zelte[1].aufnehmen(1);
Sortiere die Ausdrücke nach ihrem Wert am Ende — der kleinste zuerst.
zelte[0].getFrei()
zelte[4].getBelegt()
zelte[3].getFrei()
zelte.length
zelte[1].getFrei()
zelte.length ist 5, obwohl nur drei Zelte existieren.Eine Imker-AG führt ihre Bienenvölker in einer Reihung. ernten(kg) entnimmt Honig, getHonig() liefert den Vorrat in kg.
public class Bienenvolk {
private String name;
private int honig;
public Bienenvolk(String name, int honig) {
this.name = name;
this.honig = honig;
}
public void ernten(int kg) {
honig = honig - kg;
}
public int getHonig() {
return honig;
}
}
Bienenvolk[] stand = new Bienenvolk[6];
stand[0] = new Bienenvolk("Linde", 12);
stand[1] = new Bienenvolk("Raps", 18);
stand[2] = new Bienenvolk("Klee", 15);
stand[4] = new Bienenvolk("Heide", 15);
stand[5] = stand[1];
stand[2].ernten(4);
int summe = 0;
int maxIndex = 0;
for (int i = 0; i < stand.length; i++) {
if (stand[i] != null) {
summe = summe + stand[i].getHonig();
if (stand[i].getHonig() > stand[maxIndex].getHonig()) {
maxIndex = i;
}
}
}
stand[5].ernten(2);
-
Wie viele
Bienenvolk-Objekte gibt es? Objekte -
Wert von
summenach der Schleife kg -
Wert von
maxIndexnach der Schleife -
Rückgabewert von
stand[1].getHonig()ganz am Ende kg
new Bienenvolk(...); Platz 3 ist leer, Platz 5 verweist auf „Raps“. Die Schleife addiert deshalb Raps zweimal: 12 + 18 + 11 + 15 + 18 = 74 — eine Summe über Plätze ist nicht dasselbe wie eine Summe über Objekte. Das Maximum 18 wird zuerst an Index 1 gefunden; an Index 5 ist 18 > 18 falsch, maxIndex bleibt 1. stand[5].ernten(2) wirkt auf dasselbe Objekt wie stand[1]: 18 − 2 = 16. Typische Fehler: 56 (Raps nur einmal), 5 (maxIndex beim zweiten Treffer) und 18 (Alias übersehen).Ein Bootsverleih hat zehn Liegeplätze, die nach und nach mit Booten belegt werden. anzahlFrei() soll zählen, wie viele Boote gerade frei sind; hinzufuegen soll ein schon erzeugtes Boot an einen Liegeplatz legen. Die Klasse Boot:
- - name: Zeichenkette
- - frei: Wahrheitswert
- c Boot(name: Zeichenkette)
- + istFrei(): Wahrheitswert
- + verleihen()
In der Klasse Bootsverleih stecken drei Fehler.
boote = new Boot[10]; im Konstruktor ist richtig: Sie legt nur die zehn leeren Liegeplätze an — die Boote kommen später über hinzufuegen. Die beiden Fehler in anzahlFrei sind die Klassiker beim Durchlaufen einer Objekt-Reihung: Indexgrenze und fehlende null-Prüfung.Für die Deko der Abifeier wird eine Kette aus vier Luftballons programmiert. Nach diesem Code stehen alle Zeilen unten — jede Zeile startet wieder direkt nach dem Code. Welchen Wert liefert der letzte Ausdruck der Zeile?
public class Luftballon {
private int luft;
public Luftballon() {
luft = 0;
}
public void aufblasen() {
luft = luft + 1;
}
public int getLuft() {
return luft;
}
}
Luftballon[] kette = new Luftballon[4];
Luftballon b = new Luftballon();
for (int i = 0; i < kette.length; i++) {
kette[i] = b;
}
kette[0].aufblasen();
kette[3].aufblasen();
kette[1].getLuft()
Luftballon-Objekte
kette.length
kette[2] = new Luftballon(); kette[2].getLuft()
kette[3] = null; kette[0].aufblasen(); b.getLuft()
new Luftballon() steht vor der Schleife. Die Schleife verteilt also nur viermal dieselbe Referenz — alle vier Plätze zeigen auf einen einzigen Ballon. Deshalb landen beide aufblasen-Aufrufe im selben Objekt, und auch kette[1] liefert 2. Erst kette[2] = new Luftballon() erzeugt einen zweiten Ballon (mit 0). Und kette[3] = null löscht nur einen Verweis, nicht den Ballon: Er bekommt über kette[0] noch einmal Luft, b.getLuft() = 3. Korrekt wäre kette[i] = new Luftballon(); in der Schleife.