Ich suchte online nach ähnlicher Frage, aber konnte es nicht finden. Also, hier posten.Java-Vererbung - dieses Schlüsselwort
In dem folgenden Programm, warum der Wert von 'i' als 100 gedruckt wird?
AFAIK 'dies' bezieht sich auf das aktuelle Objekt; In diesem Fall ist 'TestChild' und der Klassenname wird ebenfalls korrekt gedruckt. Aber warum ist der Wert der Instanzvariable nicht 200?
public class TestParentChild {
public static void main(String[] args) {
new TestChild().printName();
}
}
class TestChild extends TestParent{
public int i = 200;
}
class TestParent{
public int i = 100;
public void printName(){
System.err.println(this.getClass().getName());
System.err.println(this.i); //Shouldn't this print 200
}
}
Und außerdem ist die Ausgabe der folgenden wie erwartet. Die Kindklassenmethode wird aufgerufen, wenn ich "this.test()" von der Elternklasse anrufe.
public class TestParentChild {
public static void main(String[] args) {
new TestChild().printName();
}
}
class TestChild extends TestParent{
public int i = 200;
public void test(){
System.err.println("Child Class : "+i);
}
}
class TestParent{
public int i = 100;
public void printName(){
System.err.println(this.getClass().getName());
System.err.println(this.i); //Shouldn't this print 200
this.test();
}
public void test(){
System.err.println("Parent Class : "+i);
}
}
Danke für die prompte Antwort außer Kraft setzen nur . Könnten Sie bitte grübeln, was meinst du damit? ** "In Java können Felder nicht als virtuell markiert werden" ** Wie bereits erwähnt, wird die Instanzmethode in meinem zweiten Programm korrekt aufgerufen. Die Instanzvariable bezieht sich jedoch auf die Klasse Parent. – Jack
Ich habe meine Antwort aktualisiert. – Dai
In Java sind alle Methoden (sofern nicht anders angegeben) "virtuell", was bedeutet, dass sie eine verknüpfte vtable haben, die den Runtime-Versand ermöglicht. Felder existieren jedoch als absolute (ish) Speicherstelle und werden nicht durch irgendeine vtable ausgeglichen. Ich mache die Verwirrung auf Javas Design-Dokument verantwortlich, das nicht explizite "virtuelle" und "überschreiben" Schlüsselwörter hat, während C# dies tut. – Dai