Hallo liebe Forumler,
vorab: mir ist bewusst, dass es zu diesem Thema eine Menge Beiträge gibt. Mir hilft es verständnistechnisch oft Dinge slebst nochmal zu formulieren und ich würde gerne wissen, ob die Erklärung, die ich gliech liefern werde so stehengelassen werden kann. Ich wäre dankbar, wenn jemand da für mich drüberschauen könnte.
Es dreht sich um folgendes Beispiel (bin nciht mehr sicher, wo ich es gesehen habe, mag sogar von Oracle kommen):
Die Ausgabe ist:
x = 23
this.x = 1
ShadowTest.this.x = 0
Erklärung in eigenen Worten:
"this" bezieht sich auf das aktuelle Objekt (bzw. das Objekt, aus dem ein Konstruktor oder eine methode aufgerufen wird).
Daher liefert this.x die 1, weil die methode in fl aufgerufen wird, was eine Instanz der nested class FirstLevel ist in der x = 1 war, was wir auch nicht verändert haben.
Mit ShadowTest.this.x arbeiten wir uns zu der "Oberklasse" durch.
Wenn man in ShadowTest.this.x das this streicht, gibt's einen Fehler (cannot make static reference to non static field); das ist sinnig. ShadowTest ist ja erstmal nur der Klassenname. Statisch bezieht sich auf die Klasse an sich, nicht statisch auf veränderbare Felder von Instanzen von Klassen
In meiner Klasse ShadowTest ist x ein nicht statisches Feld, es kann theoretisch nach der Instanzierung verändert werden. Würde ich also einfach nur ShadowTest.x ansprechen, wäre das ein logischer faux-pas, da ich ja meinem Programm ja nicht mitgeteilt habe, aus welcher Instanz er das x hernehmen soll.
Deswegen "this". Die andere Möglichkeit eine Fehlermeldung zu vermeiden wäre x zu einem static zu machen, dann ist es immer gleich und ein ShadowTest.x würde keine Probleme verursachen.
Hier sage ich mit ShadowTest.this.x, wenn ich es richtig verstanden habe: "Ich meine das Shadowtest, welches zum this gehört, sprich die "Mutterklasse" von fl, in dem ich gerade die Methode aufrufe".
Diese ist bereits instanziert und dort ist x = 0, also alles paletti. Ich darf allerdings nicht schreiben st.x, weil innerhalb der Methode ja per se noch kein st erzeugt ist. Das passiert in dem Beispiel erst zur Laufzeit, weswegen hier der Aufruf nur über den Typ ShadowTest geschieht.
Kann man das so stehen lassen?
Wäre dankbar für Bestätigung/Ergänzung/Verbesserung.
Beste Grüße
Wolf
vorab: mir ist bewusst, dass es zu diesem Thema eine Menge Beiträge gibt. Mir hilft es verständnistechnisch oft Dinge slebst nochmal zu formulieren und ich würde gerne wissen, ob die Erklärung, die ich gliech liefern werde so stehengelassen werden kann. Ich wäre dankbar, wenn jemand da für mich drüberschauen könnte.
Es dreht sich um folgendes Beispiel (bin nciht mehr sicher, wo ich es gesehen habe, mag sogar von Oracle kommen):
Java:
public class ShadowTest {
public int x = 0;
class FirstLevel {
public int x = 1;
void methodInFirstLevel(int x) {
System.out.println("x = " + x);
System.out.println("this.x = " + this.x);
System.out.println("ShadowTest.this.x = " + ShadowTest.this.x);
}
}
public static void main(String... args) {
ShadowTest st = new ShadowTest();
ShadowTest.FirstLevel fl = st.new FirstLevel();
fl.methodInFirstLevel(23);
}
}
Die Ausgabe ist:
x = 23
this.x = 1
ShadowTest.this.x = 0
Erklärung in eigenen Worten:
"this" bezieht sich auf das aktuelle Objekt (bzw. das Objekt, aus dem ein Konstruktor oder eine methode aufgerufen wird).
Daher liefert this.x die 1, weil die methode in fl aufgerufen wird, was eine Instanz der nested class FirstLevel ist in der x = 1 war, was wir auch nicht verändert haben.
Mit ShadowTest.this.x arbeiten wir uns zu der "Oberklasse" durch.
Wenn man in ShadowTest.this.x das this streicht, gibt's einen Fehler (cannot make static reference to non static field); das ist sinnig. ShadowTest ist ja erstmal nur der Klassenname. Statisch bezieht sich auf die Klasse an sich, nicht statisch auf veränderbare Felder von Instanzen von Klassen
In meiner Klasse ShadowTest ist x ein nicht statisches Feld, es kann theoretisch nach der Instanzierung verändert werden. Würde ich also einfach nur ShadowTest.x ansprechen, wäre das ein logischer faux-pas, da ich ja meinem Programm ja nicht mitgeteilt habe, aus welcher Instanz er das x hernehmen soll.
Deswegen "this". Die andere Möglichkeit eine Fehlermeldung zu vermeiden wäre x zu einem static zu machen, dann ist es immer gleich und ein ShadowTest.x würde keine Probleme verursachen.
Hier sage ich mit ShadowTest.this.x, wenn ich es richtig verstanden habe: "Ich meine das Shadowtest, welches zum this gehört, sprich die "Mutterklasse" von fl, in dem ich gerade die Methode aufrufe".
Diese ist bereits instanziert und dort ist x = 0, also alles paletti. Ich darf allerdings nicht schreiben st.x, weil innerhalb der Methode ja per se noch kein st erzeugt ist. Das passiert in dem Beispiel erst zur Laufzeit, weswegen hier der Aufruf nur über den Typ ShadowTest geschieht.
Kann man das so stehen lassen?
Wäre dankbar für Bestätigung/Ergänzung/Verbesserung.
Beste Grüße
Wolf