У меня есть этот демонстрационный код:
class Test2 extends Test {
public int number = 0;
@Override
public void set(){
number = 1;
info();
}
@Override
public void info(){
System.out.println(number);
}
}
public class Test {
public Test(){
set();
}
public void set(){
}
public void info(){
}
public static void main(String[] args){
Test2 object = new Test2();
object.info();
}
}
Код дает этот вывод:
1
0
Почему? Я ожидаю этот вывод:
1
1
На мой взгляд, основная функция вызывает конструктор класса Test2 для создания объекта. Конструктор автоматически вызывает конструктор суперкласса. Этот конструктор вызывает метод set(), который переопределен. Поэтому вызывается метод set() класса Test2. Этот метод устанавливает поле и вызывает метод info(), который записывает число. Затем основная функция снова вызывает метод info() созданного объекта.
Числовое поле установлено правильно, так как вывод первой строки равен «1». Но почему вторая строка содержит 0? Кажется, что поле вообще не было установлено. Можешь объяснить?
Что я должен сделать, чтобы получить ожидаемое поведение? Заранее спасибо!
set
устанавливает его в 1. Вам следует избегать вызова виртуальных методов в конструкторах, поскольку вы вызываете поведение в частично сконструированном объекте. . - person Lee   schedule 24.08.2012