MINT lernen

Attribute und Konstruktoren

Ein frisches Objekt startet mit 0, false und null — wer sorgt eigentlich dafür, dass daraus ein echter Wert wird?

Dein Fortschritt:
0 / 0 Aufgaben
1

Ü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.

A1
Konstruktor oder nicht? — Die Kinokarte
AFB I

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?

Mehrere Antworten sind richtig. Markiere alle zutreffenden und klicke dann auf „Prüfen“.
Ein Konstruktor heißt exakt wie die Klasse und hat keinen Rückgabetyp. Eine Klasse darf mehrere Konstruktoren haben, wenn sich ihre Parameterlisten unterscheiden (Überladen). 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.
Ansatz: Prüfe bei jeder Zeile zwei Dinge: Stimmt der Name Buchstabe für Buchstabe mit dem Klassennamen überein? Steht zwischen public und dem Namen noch ein Typ?
Weiter: Ein Konstruktor ohne Parameter ist erlaubt. Und wie bei jeder Methode steht vor jedem Parameternamen sein Datentyp.
A2
Stimmt's? — Die neue Smartwatch
AFB I

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;
}
Fünf Aussagen nacheinander. Eine falsche Einschätzung reicht — dann startest du die Serie mit „Neue Runde“ neu.
Aussage 1 von 5

Standardwerte: 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.
Ansatz: Überlege für jeden Typ, welcher Wert „noch nichts eingetragen“ bedeutet — bei Zahlen, bei Wahrheitswerten und bei Objekten wie String.
Weiter: Die Klasse ist der Bauplan, jedes Objekt ein eigenes Exemplar — mit eigenen Werten.
A3
Wer ist wer in der Busfahrt?
AFB I

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;
    }
}
Ziehe jede Karte in den passenden Korb — oder wähle sie mit Enter aus und drücke dann die Ziffer des Korbs (0 legt sie zurück).
1Attribut
2Parameter
3lokale Variable
Attribute stehen in der Klasse außerhalb von Methoden und leben so lange wie das Objekt. Parameter stehen in den runden Klammern im Kopf, lokale Variablen werden im Rumpf deklariert — beide verschwinden, sobald der Konstruktor bzw. die Methode fertig ist. In Zeile 6 heißen Attribut und Parameter gleich: 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.
Ansatz: Suche zu jedem Namen die Stelle, an der er deklariert wird (Typ davor): in der Klasse, im Methodenkopf oder im Rumpf?
Weiter: this. zeigt immer auf ein Attribut. Ohne this gewinnt ein gleichnamiger Parameter — falls es einen gibt.
A4
Vom Diagramm zum Konstruktor: Zugverbindung
AFB II

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.

Zugverbindung
  • - start: Zeichenkette
  • - ziel: Zeichenkette
  • - verspaetung: Ganzzahl
  • c Zugverbindung(start: Zeichenkette, ziel: Zeichenkette)
Wort anklicken, dann Lücke anklicken (oder umgekehrt) — mit Tab und Enter geht es genauso. Ein Klick auf eine gefüllte Lücke legt das Wort zurück.

public ( start, String ziel) {
    .start = start;
    this.ziel = ;
    verspaetung = ;
}

Aus 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.
Ansatz: Übersetze die Zeile mit dem c Stück für Stück: Name, dann jeder Parameter als „Typ Name“.
Weiter: Rechts vom Gleichheitszeichen steht jeweils der Parameter, links das Attribut — bei gleichem Namen mit this. davor.
A5
Zwei Konstruktoren für die Trinkflasche
AFB II

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);
Rechne die Kette Schritt für Schritt: Erst wenn ein Schritt stimmt, wird der nächste freigeschaltet. Enter prüft.
  1. Attribut inhalt von a direkt nach Zeile 1 ml
  2. Attribut inhalt von b nach Zeile 3 ml
  3. Attribut inhalt von a nach Zeile 4 ml
  4. Attribut inhalt von a am Ende ml
Welcher Konstruktor läuft, entscheidet die Argumentliste: (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.)
Ansatz: Lege dir für a und b je eine kleine Objektkarte mit volumen und inhalt an.
Weiter: Welcher Konstruktor gehört zu new Wasserflasche(750)? Und welchen Wert hat ein int-Attribut, das niemand setzt?
A6
Was passiert bei new? — Der Wanderrucksack
AFB II

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.

Ziehe die Karten in die richtige Reihenfolge — mit der Tastatur: ↑/↓ verschiebt, Shift+↑/↓ wechselt nur den Fokus.
1Für ein neues Rucksack-Objekt wird Speicher reserviert.
2Die Attribute erhalten ihre Standardwerte: farbe ist null, gewicht ist 0.0.
3Der Konstruktor startet, sein Parameter farbe bekommt den Wert "blau".
4this.farbe = farbe; setzt das Attribut auf "blau".
5Die Variable r verweist jetzt auf das fertige Objekt.
Der Konstruktor baut das Objekt nicht aus dem Nichts — er bekommt ein Objekt, dessen Attribute schon Standardwerte haben, und überschreibt die, um die er sich kümmert. gewicht setzt er gar nicht; es bleibt 0.0. Erst ganz am Ende landet der Verweis in r.
Ansatz: Bevor der Konstruktor irgendetwas zuweisen kann, muss es das Objekt mit seinen Attributen schon geben.
Weiter: Die Zuweisung an r ist der letzte Schritt der Zeile — rechts vom = wird zuerst alles ausgewertet.
A7
Diagrammzeile trifft Java-Zeile: Sportverein
AFB IIMix

Wiederholung aus 1.2.2 Klassendiagramme: Ordne jeder Zeile der Klassenkarte Sportverein die passende Java-Zeile zu.

Ansatz: Übersetze zuerst die Typnamen: Ganzzahl → int, Fließkommazahl → double, Wahrheitswert → boolean, Zeichenkette → String.
Weiter: Bei den beiden Konstruktoren entscheidet allein die Anzahl der Parameter.
A8
Fehler finden und korrigieren: Tischreservierung
AFB III

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.

Klicke die fehlerhaften Zeilen an und schreibe in das aufklappende Feld die korrigierte Zeile. Leerzeichen und Groß-/Kleinschreibung spielen beim Vergleich keine Rolle; Enter prüft.
Zeile 4: Mit 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.)
Ansatz: Zwei Fehler findet der Compiler, einer ist ein stiller Logikfehler. Prüfe jeden Konstruktorkopf und jede Zuweisung.
Weiter: Achte auf ein Wort, das vor einem Konstruktornamen nichts zu suchen hat, auf ein fehlendes this. und auf Anführungszeichen um eine Zahl.
A9
Eine Klasse planen: Die Stoppuhr
AFB III

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.

Spiele den Ablauf Schritt für Schritt durch: Was passiert als Nächstes? Nur die richtige Karte bringt dich weiter.
    Fertig geplant: zwei private Attribute, ein Konstruktor 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.
    Ansatz: Lies die Anforderung genau: Was wird beim Erzeugen übergeben, was startet einfach bei 0?
    Weiter: Wann gibt es den Standardkonstruktor ohne Parameter — immer oder nur unter einer Bedingung?
    A10
    Trickaufgabe: Das Zelt fürs Zeltlager
    AFB IIITrick

    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;
        }
    }
    Wähle in jedem Menü die passende Antwort und klicke dann auf „Prüfen“.

    Zelt z = new Zelt("grün", 4); →

    Zelt z = new Zelt(); →

    danach z.getPlaetze() →

    danach z.Zelt("rot", 2); und wieder z.getPlaetze() →

    Das kleine 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.)
    Ansatz: Ist public void Zelt(…) wirklich ein Konstruktor? Was unterscheidet einen Konstruktor von einer Methode?
    Weiter: Wenn eine Klasse keinen eigenen Konstruktor hat, welchen bekommt sie dann automatisch — und mit wie vielen Parametern?