Ü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 Kino speichert jede verkaufte Karte als Objekt der Klasse Kinokarte (Attribute film, reihe, platz). Welche Zeilen sind korrekte Köpfe eines Konstruktors dieser Klasse?
kinokarte mit kleinem k hält javac für eine Methode ohne Rückgabetyp: invalid method declaration; return type required. public int Kinokarte(…) wird zwar übersetzt — ist aber eine gewöhnliche Methode, kein Konstruktor. Und in der Parameterliste braucht jeder Parameter seinen Typ.public und dem Namen noch ein Typ?Die Klasse hat keinen eigenen Konstruktor. Ein Objekt wird mit Smartwatch s = new Smartwatch(); erzeugt.
public class Smartwatch {
private int schritte;
private double puls;
private boolean lautlos;
private String besitzer;
}
int → 0, double → 0.0, boolean → false, String → null. Anders als in Python musst du Attribute also nicht im Konstruktor anlegen — sie existieren schon, sobald das Objekt da ist. Ob 0 oder null aber ein sinnvoller Startwert ist, entscheidet erst dein Konstruktor.Eine Verkehrs-App zählt die Fahrgäste einer Buslinie.
public class Busfahrt {
private String linie;
private int fahrgaeste;
public Busfahrt(String linie) {
this.linie = linie;
int start = 0;
fahrgaeste = start;
}
public void einsteigen(int anzahl) {
fahrgaeste = fahrgaeste + anzahl;
}
}
this.linie meint das Attribut, linie allein den Parameter. In Zeile 8 gibt es keinen gleichnamigen Parameter, deshalb ist fahrgaeste auch ohne this das Attribut.this. zeigt immer auf ein Attribut. Ohne this gewinnt ein gleichnamiger Parameter — falls es einen gibt.Eine Bahn-App speichert Verbindungen. Ergänze den Konstruktor so, dass er zur Klassenkarte passt und die Verspätung ausdrücklich bei 0 startet — zwei Bausteine bleiben übrig.
- - start: Zeichenkette
- - ziel: Zeichenkette
- - verspaetung: Ganzzahl
- c Zugverbindung(start: Zeichenkette, ziel: Zeichenkette)
public ( start, String ziel) {
.start = start;
this.ziel = ;
verspaetung = ;
}
c Zugverbindung(start: Zeichenkette, …) wird public Zugverbindung(String start, …): Name wie die Klasse, kein void, Typ vor den Namen. null passt nicht in ein int-Attribut. verspaetung = 0; ist streng genommen überflüssig (0 ist ohnehin der Standardwert), macht die Absicht aber sichtbar.c Stück für Stück: Name, dann jeder Parameter als „Typ Name“.this. davor.Die Klasse Wasserflasche hat zwei überladene Konstruktoren (Mengen in ml).
public class Wasserflasche {
private int volumen;
private int inhalt;
public Wasserflasche(int volumen) {
this.volumen = volumen;
}
public Wasserflasche(int volumen, boolean voll) {
this.volumen = volumen;
if (voll) {
inhalt = volumen;
}
}
public void trinken(int ml) {
inhalt = inhalt - ml;
}
public void auffuellen() {
inhalt = volumen;
}
}
Wasserflasche a = new Wasserflasche(750); Wasserflasche b = new Wasserflasche(500, true); b.trinken(200); a.auffuellen(); a.trinken(120);
-
Attribut
inhaltvonadirekt nach Zeile 1 ml -
Attribut
inhaltvonbnach Zeile 3 ml -
Attribut
inhaltvonanach Zeile 4 ml -
Attribut
inhaltvonaam Ende ml
(750) passt nur zum ersten, (500, true) nur zum zweiten. Der erste setzt inhalt gar nicht — es bleibt beim Standardwert 0, die Flasche ist leer. Und weil jedes Objekt eigene Attribute hat, ändert b.trinken(200) nichts an a. (Ausgaben mit javac/java geprüft.)a und b je eine kleine Objektkarte mit volumen und inhalt an.new Wasserflasche(750)? Und welchen Wert hat ein int-Attribut, das niemand setzt?Die Klasse Rucksack hat die Attribute farbe (String) und gewicht (double) sowie den Konstruktor public Rucksack(String farbe) { this.farbe = farbe; }. Bring die Vorgänge bei Rucksack r = new Rucksack("blau"); in die richtige Reihenfolge.
farbe ist null, gewicht ist 0.0.
farbe bekommt den Wert "blau".
this.farbe = farbe; setzt das Attribut auf "blau".
r verweist jetzt auf das fertige Objekt.
gewicht setzt er gar nicht; es bleibt 0.0. Erst ganz am Ende landet der Verweis in r.r ist der letzte Schritt der Zeile — rechts vom = wird zuerst alles ausgewertet.Wiederholung aus 1.2.2 Klassendiagramme: Ordne jeder Zeile der Klassenkarte Sportverein die passende Java-Zeile zu.
- wird zu private, das + zu public, der Typ wandert vor den Namen. Konstruktoren (c) bekommen weder void noch einen anderen Rückgabetyp; eine Methode ohne Rückgabe im Diagramm bekommt void. Zwei c-Zeilen bedeuten: Die Klasse hat zwei überladene Konstruktoren.int, Fließkommazahl → double, Wahrheitswert → boolean, Zeichenkette → String.Ein Restaurant nutzt die Klasse Tischreservierung. Geplant: new Tischreservierung("Kaya", 4) soll Name und Personenzahl speichern, new Tischreservierung("Ben") einen Tisch für 2 Personen. Drei Zeilen verhindern das — sie lassen sich nicht übersetzen oder liefern ein falsches Objekt.
void ist das eine gewöhnliche Methode — javac meldet dann bei new Tischreservierung("Kaya", 4), dass es keinen passenden Konstruktor gibt. Zeile 5 lässt sich übersetzen, weist aber den Parameter sich selbst zu; das Attribut bleibt null. Zeile 9: incompatible types: String cannot be converted to int — eine Zahl in Anführungszeichen ist Text. (Meldungen mit javac geprüft.)this. und auf Anführungszeichen um eine Zahl.Für den Sportunterricht soll eine Klasse Stoppuhr entstehen: Beim Erzeugen bekommt jede Uhr den Namen der Läuferin oder des Läufers, die gemessene Zeit (in Sekunden, mit Nachkommastellen) startet bei 0. Triff die Entscheidungen Schritt für Schritt.
public Stoppuhr(String name) { this.name = name; } und — für new Stoppuhr() — ein überladener zweiter Konstruktor ohne Parameter. Die Falle im letzten Schritt: Sobald du selbst einen Konstruktor schreibst, verschwindet der automatische Standardkonstruktor. String name = name; wäre übrigens ein Übersetzungsfehler, weil es schon einen Parameter name gibt.Luca hat diese Klasse geschrieben — und wundert sich über das Verhalten. Beachte jedes Wort.
public class Zelt {
private String farbe;
private int plaetze;
public void Zelt(String farbe, int plaetze) {
this.farbe = farbe;
this.plaetze = plaetze;
}
public int getPlaetze() {
return plaetze;
}
}
Zelt z = new Zelt("grün", 4); →
Zelt z = new Zelt(); →
danach z.getPlaetze() →
danach z.Zelt("rot", 2); und wieder z.getPlaetze() →
void macht aus dem vermeintlichen Konstruktor eine gewöhnliche Methode, die zufällig wie die Klasse heißt. Die Klasse hat damit keinen eigenen Konstruktor — also ergänzt Java den Standardkonstruktor: new Zelt() klappt, new Zelt("grün", 4) scheitert (constructor Zelt in class Zelt cannot be applied to given types). Die Methode Zelt(…) lässt sich wie jede andere an einem Objekt aufrufen und setzt dann die Attribute. (Alles mit javac/java geprüft.)public void Zelt(…) wirklich ein Konstruktor? Was unterscheidet einen Konstruktor von einer Methode?