Konstruktoren in Java
Schreibe eine Klasse Box in Box.java mit einem int-Feld size und einem Konstruktor Box(int n), der size = n; setzt. In Hall.java baue eine Box mit Box b = new Box(4); und drucke dann b.size. Kompiliere beide Dateien und starte java Hall. Der Bildschirm soll eine Zeile zeigen: 4. Die Zahl, die du an new übergibst, erreicht den Konstruktor, und der Konstruktor speichert sie auf dem Objekt, bevor main weiterläuft. Das Feld zur Bauzeit setzen — im Konstruktor — ist der Lehrstoff dieser Seite.
Eine Methode, die läuft, wenn new baut
Ein Konstruktor trägt denselben Namen wie die Klasse. Er hat keinen Rückgabetyp void und auch keinen anderen Rückgabetyp. Wenn main new Box(4) schreibt, baut Java das Objekt und führt diesen Konstruktor mit 4 als n aus. Nach dem Konstruktor hält die Variable das fertige Objekt. Das ist die ganze Aufgabe dieser Seite: einen Wert an new übergeben, den Konstruktor ins Feld speichern lassen, dann das Feld drucken, damit du siehst, dass die Speicherung geklappt hat.
Erstelle zuerst Box.java. Die public-class-Zeile ist public class Box. Lass keinen älteren Klassennamen Cup oder Chip hier. Innerhalb der geschweiften Klammern deklariere int size;. Schreibe dann den Konstruktor: Box(int n) { size = n; }. Nutze auf dieser Seite einen Parameternamen, der sich von size unterscheidet, damit die Zuweisung ohne das Wort this klar ist. In Box.java gibt es kein main. Speichere vor dem Kompilieren.
Die Feldzeile allein legt 4 nicht ins Objekt. Der Konstruktorkörper macht das, wenn new ihn aufruft. Wenn du den Konstruktor weglässt und nur das Feld deklarierst, passt ein späteres new Box(4) nicht, und javac beschwert sich über den Aufruf. Behalte beide Teile in Box.java: das Feld und den Konstruktor, der hinein schreibt.
public class Box {
int size;
Box(int n) {
size = n;
}
}
Hall übergibt 4 an new Box
Erstelle Hall.java im selben Ordner. Die public-class-Zeile ist public class Hall. Innerhalb von main schreibe Box b = new Box(4); und dann System.out.println(b.size);. Das Argument 4 geht in den Konstruktorparameter n. Du brauchst auf dieser Seite keine eigene Zeile b.size = 4; — der Konstruktor hat den Wert schon gespeichert. Die Druckzeile ist da, damit du dem Konstruktor vertrauen kannst, ohne zu raten.
Behalte Hall als die Klasse, die main hält. Lege main für diese Lektion nicht in Box. Die Zwei-Datei-Form entspricht den früheren Objekt- und Feldseiten: eine Datei definiert den Typ, die andere baut und nutzt ihn. Wenn du die Datei umbenennst, aber eine alte Zeile public class Shelf stehen bleibt, lehnt javac ab, bis die Namen wieder passen.
public class Hall {
public static void main(String[] args) {
Box b = new Box(4);
System.out.println(b.size);
}
}
Aus dem Ordner mit beiden Dateien führe javac Box.java Hall.java aus. Du kannst Box.java zuerst und Hall.java danach kompilieren, wenn beide fertig sind. Wenn Klammern, geschweifte Klammern und Semikolons passen, schreibt javac keine eigene Zeile. Dann starte java Hall — nicht java Hall.java und nicht java Box. Lass die Endung .java beim Startbefehl weg. Starte die Klasse, die main hält. Dieselben Befehle funktionieren unter Windows und macOS.
Das Programm soll eine Zeile drucken und stoppen: 4. Es soll nicht auf Eingabe warten. Wenn das Terminal auf Tastatur wartet, steckt noch ein nextLine-Aufruf aus einer älteren Übung in einer Datei. Lösche ihn und behalte new Box(4) plus den Druck in Hall, mit dem Konstruktor in Box. Ein wartender Cursor ist kein Konstruktorproblem; es ist übrig gebliebener Eingabecode am falschen Ort.
Geh den Lauf einmal durch. Java startet bei Hall.main. Der Ausdruck new Box(4) baut eine Box und ruft Box(int n) mit n gleich 4 auf. Der Körper schreibt size = n, sodass size dieses Objekts 4 wird. Dann druckt main b.size und der Bildschirm zeigt 4. Nichts anderes sollte drucken. Wenn du ok oder 3 oder einen Cup-Rest siehst, läufst du nicht das Hall-Programm dieser Seite.
Wenn du new Box() ohne Argument schreibst, während der einzige Konstruktor ein int braucht, lehnt javac ab. Passe den Aufruf an die Parameterliste des Konstruktors an. Wenn du void vor den Konstruktornamen setzt, wird daraus eine gewöhnliche Methode, kein Konstruktor, und new Box(4) führt diesen Körper nicht so aus, wie diese Seite erwartet. Die Kopfzeile muss wie Box(int n) aussehen, nicht void Box(int n) und nicht static int Box(int n).
Vergleich mit Zuweisung nach new
Auf der Feldseite hast du c.fill = 3; nach new Cup() geschrieben. Das funktioniert weiterhin. Diese Seite verlagert die Speicherung in den Konstruktor, damit der Wert gesetzt wird, während das Objekt gebaut wird. Ein übrig gebliebenes Cup-Demo mit c.fill = 3; ist eine andere Lektion. Für diese Seite behalte Box und Hall und new Box(4). Wenn Hall noch c.fill = 3; hat und dieser Ordner keine Cup-Klasse hat, entferne diese Zeile. Der Compiler erfindet kein Cup für dich.
b allein mit System.out.println(b); zu drucken zeigt kein sauberes 4. Drucke b.size, um die gespeicherte Zahl zu sehen. Die Objektreferenz allein ist nicht der Feldwert. Dieses Muster kennst du von der Feldseite; behalte es hier, wenn du die Arbeit des Konstruktors prüfst.
Du kannst in anderen Programmen weiterhin ein Feld nach new zuweisen. Diese Lektion wählt einfach den Konstruktorweg, damit der erste nützliche Wert zur Bauzeit ankommt. Mische beide Stile nicht im selben Hall-Demo auf dieser Seite. Ein klarer Pfad reicht: Argument an new, Speichern im Konstruktor, Feld drucken.
Zwei Boxen, zwei sizes
Jedes new Box(...) führt den Konstruktor erneut für ein eigenes Objekt aus. Du kannst Box a = new Box(2); und Box b = new Box(9); schreiben und dann beide size-Felder drucken. Der erste Aufruf speichert 2 auf einem Objekt. Der zweite speichert 9 auf einem anderen Objekt. Die beiden Objekte teilen keinen gemeinsamen size-Platz.
public class Hall {
public static void main(String[] args) {
Box a = new Box(2);
Box b = new Box(9);
System.out.println(a.size);
System.out.println(b.size);
}
}
Kompiliere und starte erneut: javac Box.java Hall.java, dann java Hall. Der Bildschirm soll 2 in einer Zeile und 9 in der nächsten zeigen. Jeder Konstruktoraufruf hat sein eigenes Argument auf seinem eigenen Objekt gespeichert. Box b = a; zu schreiben baut kein zweites Objekt — nutze zwei Aufrufe new Box(...), wenn du zwei sizes willst. Eine Referenz zu kopieren ist nicht dasselbe wie den Konstruktor zweimal aufzurufen.
Wenn beide Zeilen dieselbe Zahl zeigen, prüfe, dass jedes new ein anderes Argument übergibt und dass du a.size und b.size in dieser Reihenfolge druckst. Wenn javac beim zweiten new stoppt, suche nach einer fehlenden Klammer oder einem falschen Klassennamen aus einer älteren Datei. Kleine Tippfehler im zweiten Aufruf sind häufig, wenn du die erste Zeile kopierst und das Argument vergisst zu ändern.
Was für this übrig bleibt
Diese Seite nutzt size = n; mit unterschiedlichen Namen. Eine spätere Seite — this — zeigt, wie du vom eigenen Feld des Objekts sprichst, wenn Namen kollidieren. Bleib hier beim klaren Parameternamen n. Erfinde auf dieser Seite kein this.size, es sei denn, du kennst es schon; das Lernziel ist der Konstruktoraufruf von new. Das Wort this ist das nächste Thema, keine Voraussetzung, um heute n in size zu speichern.
Wenn javac beim Kompilieren von Hall.java Box nicht findet, prüfe, dass Box.java im selben Ordner liegt und die Klassenzeile public class Box ist. Wenn der Bildschirm 0 zeigt, fehlt vielleicht die Zuweisung im Konstruktor, oder main nutzt noch eine Form ohne Argument, die size nie setzt — behalte Box(int n) { size = n; } und new Box(4). Eine Null auf dem Bildschirm bedeutet meist, dass das Feld beim Standard blieb, weil die Speicherung nie lief.
Wenn der Ordner noch Cup.java oder Shelf.java von der Feldseite hält, lass sie stehen oder lösche sie nur, wenn sie den Compile-Befehl verwirren. Kompiliere kein altes Shelf, das noch c.fill zuweist, und erwarte den Bildschirm dieser Seite. Starte java Hall, nachdem du das Box-und-Hall-Paar dieser Lektion kompiliert hast.
Vor this
Du kannst int size; deklarieren, Box(int n) { size = n; } schreiben und mit Box b = new Box(4); aus Hall bauen. Kompiliere beide Dateien und starte java Hall. Der Bildschirm zeigt 4. Der Konstruktor läuft, wenn new das Objekt baut. Du hast die Zahl zur Bauzeit übergeben, der Konstruktor hat sie im Feld gespeichert, und der Druck hat die Speicherung bewiesen. Die nächste Seite ist this, wo du eine andere Weise lernst, die eigenen Felder des Objekts in seinen Methoden und Konstruktoren zu benennen.
Behalte die Konstruktorkopfzeile ohne void. Behalte das Argument bei new. Behalte den Druck auf b.size. Diese drei Gewohnheiten sind der Checkpoint dieser Seite, bevor du weitergehst.
🧠 Testen Sie Ihr Wissen
Testen Sie Ihr Wissen
Fordern Sie sich mit diesem interaktiven Quiz heraus und sehen Sie, wie gut Sie das Thema verstehen
📝 Anweisungen
- Lesen Sie jede Frage sorgfältig
- Wählen Sie die beste Antwort für jede Frage
- Sie können das Quiz so oft wiederholen, wie Sie möchten
- Ihr Fortschritt wird oben angezeigt