Rozważmy:W jaki sposób zmienna 'this' w Javie faktycznie jest ustawiona na bieżący obiekt?
class TestParent{
public int i = 100;
public void printName(){
System.err.println(this); //{[email protected]} according to the Debugger.
System.err.println(this.i); //this.i is 100.
}
}
class TestChild extends TestParent{
public int i = 200;
}
public class ThisTest {
public static void main(String[] args) {
new TestChild().printName();
}
}
Wiem, że podobne pytania były zadawane, ale nie mogłem dostać solidne zrozumienie „tego” zmiennej w Javie.
Pozwól mi spróbować wyjaśnić, jak rozumiem wynik powyższego obrazu.
Ponieważ jest to obiekt, który jest
new TestChild()
wywołanie metodyprintName()
zmienna w linii 6this
jest ustawiony naTestChild
obiektu - {TestChild @ 428} według debugera.Ponieważ Java nie ma pola wirtualnego - nie jestem do końca pewien, co to oznacza, ale rozumiem koncepcyjnie, że jest to przeciwieństwo metod Java, które obsługują Polimorfizm -
this.i
jest ustawiona na 100TestParent
w czasie kompilacji.Więc nieważne co
this
jestthis.i
w metodzieTestParent
zawsze będzie zmienna w klasieTestParent
i
.
Nie jestem pewien, czy moje zrozumienie jest poprawne, więc proszę mnie poprawić, jeśli się mylę.
A także, moim głównym pytaniem jest,
Jak jest this
zmienny zestaw do bieżącego obiektu, który jest wywołanie metody? W jaki sposób jest on faktycznie wdrażany?
Jeśli nie, spróbuj dodać 'toString()' metoda (http://www.javapractices.com/topic/TopicAction.do?Id=55) do 'TestParent 'i zobacz, co' System.out.println (this); plony.' – c0der
IMO' this' reprezentuje aktualną klasę, więc jeśli cokolwiek wiążemy do 'this', oznacza to, że wiążemy się z bieżącą' class', a do tego potrzebujemy 'variable/instance/member/method ...' aktualnej klasy. – emotionlessbananas
Kevin Park, twoje zrozumienie w punktach od 1. do 3. jest poprawne. @AsteriskNinja, "ten" odwołuje się do obiektu, a nie do klasy (w wielu sytuacjach rozróżnienie jest nieistotne, w innych jest kluczowe). –