Я искал в Интернете по аналогичному вопросу, но не смог найти его. Итак, разместите здесь.Java Inheritance - это ключевое слово
В следующей программе, почему значение 'i' напечатано как 100?
AFAIK 'this' относится к текущему объекту; который в этом случае является «TestChild», и имя класса также правильно напечатано. Но почему значение переменной экземпляра не 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
}
}
И, кроме того, выход следующего, как я ожидал. Метод дочернего класса вызывается, когда я вызываю «this.test()» из класса родителя.
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);
}
}
Спасибо за быстрый ответ , Не могли бы вы спросить, что это значит? ** «В полях Java нельзя пометить как виртуальные» ** Как я уже упоминал, в моей второй программе метод экземпляра вызывается правильно. Но переменная экземпляра относится к классу родителя. – Jack
Я обновил свой ответ. – Dai
В Java все методы (если не указано) являются «виртуальными», что означает, что они имеют связанную с ним таблицу vtable, которая позволяет выполнять диспетчеризацию во время выполнения. Поля, однако, существуют как абсолютное (ish) место памяти и не компенсируются какой-либо vtable. Я обвиняю путаницу в документе дизайна Java, который не имеет явных «виртуальных» и «переопределяющих» ключевых слов, в то время как C#. – Dai