this in Java
Schreibe eine Klasse Tin in Tin.java mit einem int-Feld size und einem Konstruktor Tin(int size), der this.size = size; setzt. In Lab.java baue eine Dose mit Tin t = new Tin(7); und drucke dann t.size. Kompiliere beide Dateien und starte java Lab. Der Bildschirm soll eine Zeile zeigen: 7. Parameter und Feld teilen den Namen size. Das Wort this nennt das Feld auf dem Objekt, damit die Speicherung am richtigen Ort ankommt. this zu nutzen, wenn Namen kollidieren, ist der Lehrstoff dieser Seite.
Warum derselbe Name this braucht
Auf der Konstruktorenseite war der Parameter n und das Feld size, also war size = n; klar. Hier heißen beide size. Innerhalb des Konstruktors meint ein bloßes size den Parameter. size = size; zu schreiben kopiert den Parameter auf sich selbst und lässt das Feld beim Standard. Das Feld auf dem Objekt braucht weiterhin eine Schreiboperation. Diese Schreiboperation nutzt this.size auf der linken Seite.
Erstelle zuerst Tin.java. Die public-class-Zeile ist public class Tin. Lass keinen älteren Klassennamen Box oder Cup hier. Innerhalb der geschweiften Klammern deklariere int size;. Schreibe dann den Konstruktor: Tin(int size) { this.size = size; }. In Tin.java gibt es kein main. Speichere vor dem Kompilieren.
Lies die Zuweisung noch einmal. Die rechte Seite size ist der Wert, der im Parameter ankam — hier 7. Die linke Seite this.size ist das Feld auf dem Objekt, das gebaut wird. Nach der Zeile hält size dieses Objekts 7. Wenn du this. weglässt und size = size; behältst, zeigt der Bildschirm später 0, weil das Feld nie geändert wurde.
public class Tin {
int size;
Tin(int size) {
this.size = size;
}
}
Lab baut eine Dose
Erstelle Lab.java im selben Ordner. Die public-class-Zeile ist public class Lab. Innerhalb von main schreibe Tin t = new Tin(7); und dann System.out.println(t.size);. Das Argument 7 wird zum Konstruktorparameter size. Der Konstruktor speichert ihn mit this.size = size;. Du brauchst auf dieser Seite keine eigene Zeile t.size = 7;.
Behalte Lab als die Klasse, die main hält. Lege main für diese Lektion nicht in Tin. Wenn eine übrig gebliebene Hall-Datei von der Konstruktorenseite noch im Ordner liegt, starte für diese Lektion nicht java Hall — starte java Lab, nachdem du Tin.java und Lab.java kompiliert hast.
public class Lab {
public static void main(String[] args) {
Tin t = new Tin(7);
System.out.println(t.size);
}
}
Aus dem Ordner mit beiden Dateien führe javac Tin.java Lab.java aus. Du kannst Tin.java zuerst und Lab.java danach kompilieren, wenn beide fertig sind. Wenn Klammern, geschweifte Klammern und Semikolons passen, schreibt javac keine eigene Zeile. Dann starte java Lab — nicht java Lab.java und nicht java Tin. 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: 7. 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 Tin(7) plus den Druck in Lab, mit this.size = size; in Tin.
Geh den Lauf einmal durch. Java startet bei Lab.main. Der Ausdruck new Tin(7) baut eine Tin und ruft Tin(int size) mit dem Parameter gleich 7 auf. Der Körper schreibt this.size = size, sodass das Feld des Objekts 7 wird. Dann druckt main t.size und der Bildschirm zeigt 7.
Wenn du size = size; statt this.size = size; schreibst, bleibt das Feld bei 0 für ein int. Der Bildschirm zeigt dann 0, nicht 7. Das ist das übliche Zeichen, dass this fehlt. Setze this. wieder auf die linke Seite der Zuweisung.
this.size und size nebeneinander
Eine kurze Tabelle hält die beiden Namen klar, während du im Konstruktor bist.
📊 this.size vs size
| Name | Bedeutung in Tin(int size) |
|---|---|
size allein |
der Parameter, der in den Konstruktor kam |
this.size |
das Feld auf dem Objekt, das gebaut wird |
this.size = size; |
den Parameter ins Feld speichern |
size = size; |
aktualisiert das Feld nicht |
Die Tabelle ist nur eine Erinnerung. Die getippte Zeile, die du behältst, ist this.size = size; im Konstruktor, dann Tin t = new Tin(7); und System.out.println(t.size); in Lab. |
Vergleich mit der Konstruktorenseite
Auf der Konstruktorenseite funktionierte Box(int n) { size = n; }, weil n und size unterschiedliche Wörter waren. Diese Form funktioniert weiterhin. Diese Seite nutzt absichtlich dasselbe Wort zweimal, damit du this brauchst. Ein übrig gebliebenes Box- und Hall-Demo mit size = n; ist eine andere Lektion. Für diese Seite behalte Tin und Lab und this.size = size;.
t allein mit System.out.println(t); zu drucken zeigt kein sauberes 7. Drucke t.size, um die gespeicherte Zahl zu sehen. Die Objektreferenz allein ist nicht der Feldwert.
Du kannst an anderen Tagen weiterhin einen anderen Parameternamen wählen. Diese Lektion wählt absichtlich passende Namen. Mische n und this nicht im selben Tin-Demo auf dieser Seite. Ein klarer Pfad reicht: passende Namen, this auf dem Feld, Feld drucken.
Zwei Dosen bleiben getrennt
Jedes new Tin(...) führt den Konstruktor erneut für ein eigenes Objekt aus. Du kannst Tin a = new Tin(2); und Tin b = new Tin(9); schreiben und dann beide size-Felder drucken. Jeder Aufruf nutzt this.size = size; auf seinem eigenen Objekt. Die beiden Objekte teilen keinen gemeinsamen size-Platz. Du brauchst dafür keine zweite Codebox — ändere die Zahlen in Lab, sobald du 7 gesehen hast, oder behalte das Ein-Dosen-Demo als die Datei, die du speicherst.
Wenn beide Zeilen 0 zeigen, fehlt im Konstruktor noch this auf der linken Seite. Wenn javac beim Kompilieren von Lab.java Tin nicht findet, prüfe, dass Tin.java im selben Ordner liegt und die Klassenzeile public class Tin ist.
Was für Instanzmethoden übrig bleibt
Diese Seite nutzt this nur im Konstruktor, um ein Feld zu speichern. Eine spätere Seite — Instanzmethoden — zeigt Methoden, die auf einem Objekt laufen und Felder lesen oder ändern können. Bleib hier bei der Speicherung im Konstruktor. Erfinde für diese Lektion keine Extra-Methoden auf Tin, es sei denn, du kennst sie schon; das Lernziel ist this.size = size, wenn Namen übereinstimmen.
Wenn Lab noch Box b = new Box(4); aus dem Konstruktoren-Demo hat und dieser Ordner keine passende Box-Klasse hat, die du behalten willst, entferne diese Zeile. Behalte Tin t = new Tin(7); und System.out.println(t.size);. Der Compiler erfindet kein Box für dich, während du Tin unterrichtest.
Wenn der Ordner noch Box.java oder Hall.java hält, lass sie liegen oder lösche sie nur, wenn sie deinen Compile-Befehl verwirren. Starte java Lab, nachdem du das Tin- und Lab-Paar dieser Lektion kompiliert hast.
Vor Instanzmethoden
Du kannst int size; deklarieren, Tin(int size) { this.size = size; } schreiben und mit Tin t = new Tin(7); aus Lab bauen. Kompiliere beide Dateien und starte java Lab. Der Bildschirm zeigt 7. Das Wort this nennt das Feld des Objekts, wenn der Parameter denselben Namen nutzt. Du hast die Zahl zur Bauzeit übergeben, der Konstruktor hat sie mit this gespeichert, und der Druck hat die Speicherung bewiesen. Die nächste Seite sind Instanzmethoden, wo Methoden auf dem Objekt Felder nutzen, nachdem das Objekt schon existiert.
Behalte die Konstruktor-Kopfzeile ohne void. Behalte this. auf dem Feld. Behalte den Druck auf t.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