Ü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.
Die Quiz-App der Schule speichert jedes Spielerkonto als Objekt. Sortiere die Methodenköpfe.
getX() — bei Wahrheitswerten istX(). Setter: void, genau ein Parameter, Name setX(…). levelAufsteigen() ändert zwar ein Attribut, ist aber eine fachliche Methode; berechneBonus(…) rechnet etwas aus, statt ein Attribut zu liefern.get, ist oder set?void und einem Parameter.Die Klasse Schliessfach hat die privaten Attribute code (String) und belegt (boolean). Fünf Behauptungen:
private trennt „innerhalb der Klasse“ von „außerhalb“. Wer prüft das — javac oder die laufende JVM?Zu jedem privaten Attribut eines Fahrrad-Leihsystems gehört genau ein Getter-Kopf. Finde die Paare.
char. Aus einem Attribut wird ein Getter, indem man get (bzw. ist) davorsetzt und den ersten Buchstaben großschreibt.public.boolean-Paare. Dort entscheidet der Name hinter ist.Die Musikschule verleiht Gitarren. Eine Gitarre hat entweder 6 oder 12 Saiten — andere Werte soll der Setter abweisen. Ergänze die Klasse; zwei Bausteine bleiben übrig.
public class Gitarre {
int saiten;
public getSaiten() { return saiten; }
public void setSaiten(int saiten) {
if (saiten == 6 saiten == 12) {
.saiten = saiten;
}
}
}
|| richtig: Erlaubt sind zwei einzelne Werte, und eine Zahl kann nicht gleichzeitig 6 und 12 sein — mit && würde der Setter jeden Wert abweisen. Bei einem Bereich („von 1 bis 14“) ist es umgekehrt, dort braucht man &&. Der Getter liefert einen int, also nicht void. (Mit javac geprüft.)Auf eine Mensakarte passen höchstens 50 €; ins Minus darf sie nicht rutschen.
public class Mensakarte {
private double guthaben;
public void setGuthaben(double guthaben) {
if (guthaben >= 0 && guthaben <= 50) {
this.guthaben = guthaben;
}
}
public void aufladen(double betrag) {
setGuthaben(guthaben + betrag);
}
public void bezahlen(double preis) {
setGuthaben(guthaben - preis);
}
public double getGuthaben() {
return guthaben;
}
}
Mensakarte k = new Mensakarte(); k.aufladen(20); k.bezahlen(3.5); k.aufladen(40); k.bezahlen(4.25); k.bezahlen(15); k.aufladen(30);
Welchen Wert liefert danach k.getGuthaben()?
aufladen und bezahlen den Setter benutzen, gilt die Prüfung auch intern. (Ausgabe mit java geprüft: 42.25.)Für die Klasse Artikel gibt es Anforderungen an jedes Attribut. Kreuze an, was die Klasse braucht.
| Anforderung | private | Getter | Setter |
|---|---|---|---|
nummer: beim Anlegen vergeben, danach nur lesbar |
|||
preis: lesbar und änderbar, nie negativ |
|||
bestand: lesbar, ändert sich nur durch verkaufen() |
|||
rabatt: darf gesetzt werden (0 bis 50), wird nie ausgelesen |
|||
notiz: nur für die Klasse selbst |
private — Getter und Setter werden dann bewusst ergänzt, je nach Anforderung. bestand braucht keinen Setter: Sonst könnte jemand von außen den Bestand beliebig „herbeizaubern“. Getter und Setter sind keine Pflicht-Paare.private sein?Wiederholung aus 1.1.2 und 1.1.3 (Datentypen, Bedingungen, equals): Für das Schul-Shirt gibt es drei Größen; bestellen dürfen die Jahrgänge 5 bis 10. Was passiert bei den Aufrufen an einer Bestellung b aus einer anderen Klasse?
public void setGroesse(String groesse) {
if (groesse.equals("S") || groesse.equals("M") || groesse.equals("L")) {
this.groesse = groesse;
}
}
public void setJahrgang(int jahrgang) {
if (jahrgang >= 5 && !(jahrgang > 10)) {
this.jahrgang = jahrgang;
}
}
equals unterscheidet Groß- und Kleinschreibung: "m" ist nicht "M". !(jahrgang > 10) bedeutet „höchstens 10“ — 10 ist erlaubt, 11 nicht. Die drei Übersetzungsfehler kommen aus ganz verschiedenen Ecken: 'M' ist ein char, kein String (incompatible types: char cannot be converted to String), "7" ist Text statt Zahl, und b.jahrgang scheitert an private (jahrgang has private access). (Alle Fälle mit javac/java geprüft.)char. Und equals vergleicht Buchstabe für Buchstabe — auch Groß und Klein.Anforderungen an die Klasse WlanKarte: Der Benutzername ist nach dem Anlegen nur lesbar; das Minutenguthaben (0 bis 600) ist lesbar und darf nur gültige Werte annehmen — ungültige werden abgewiesen; gesperrt wird eine Karte nur über sperren(). Drei Zeilen verletzen die Anforderungen.
setMinuten(-5) aufruft, bekommt plötzlich 600 Minuten geschenkt. Zeile 9 ist richtig: gesperrt braucht keinen Setter, weil nur sperren() es ändern soll.Der Akku eines E-Rollers fasst 400 Wh; jeder Kilometer verbraucht 20 Wh.
public class ERoller {
private int ladung; // in Wh, 0 bis 400
private int km;
public ERoller() {
ladung = 400;
}
public void setLadung(int ladung) {
if (ladung >= 0 && ladung <= 400) {
this.ladung = ladung;
}
}
public void fahren(int strecke) {
if (strecke * 20 <= ladung) {
setLadung(ladung - strecke * 20);
km = km + strecke;
}
}
public int getProzent() {
return ladung * 100 / 400;
}
public int getKm() {
return km;
}
}
ERoller r = new ERoller(); r.fahren(7); r.fahren(15); r.fahren(12); int p1 = r.getProzent(); r.setLadung(450); r.setLadung(150); int p2 = r.getProzent();
-
ladungnachfahren(7)Wh -
r.getKm()nach allen drei Fahrten km -
Wert von
p1% -
Wert von
p2%
fahren(15) bräuchte 300 Wh und wird von fahren selbst abgelehnt — auch km bleibt dann unverändert. fahren(12) braucht 240 Wh: Rest 20 Wh, 7 + 12 = 19 km, 20 · 100 / 400 = 5 %. setLadung(450) wird abgewiesen, 150 übernommen. Letzte Falle: 150 · 100 / 400 = 37,5 — aber int-Division schneidet ab, also 37. (Mit java geprüft.)ladung und km. Bei jeder Fahrt: Reicht die Ladung für strecke · 20?getProzent() rechnet nur mit int-Werten. Was macht Java mit dem Rest einer Ganzzahl-Division?Erlaubt sind 5 bis 30 °C. Jede Zeile startet mit einem neuen Thermostat. Welchen Wert liefert danach getGrad()?
public class Thermostat {
private int grad;
public Thermostat(int grad) {
this.grad = grad;
}
public void setGrad(int grad) {
if (grad >= 5 && grad <= 30) {
this.grad = grad;
}
}
public void waermer() {
setGrad(grad + 1);
}
public int getGrad() {
return grad;
}
}
a) new Thermostat(21), dann zweimal waermer() →
b) new Thermostat(35) →
c) new Thermostat(35), dann waermer() →
d) new Thermostat(35), dann setGrad(29) und waermer() →
e) new Thermostat(2), dann waermer() →
setGrad-Aufruf „rettet“ das Objekt (d). Abhilfe: im Konstruktor setGrad(grad); aufrufen. (Alle fünf Fälle mit java geprüft.)waermer() geht durch den Setter. Liegt grad + 1 außerhalb von 5 bis 30, bleibt der alte Wert — auch wenn der schon ungültig war.