Всякий раз, когда вы создаете экземпляр подкласса, сначала запускается конструктор суперклассов (неявный super()
). Таким образом, он печатает
a: constructor
f()
, который вызывается следующим, а так как подкласс переопределяет метод суперкласса, вызывается подкласс f()
. Итак, вы увидите
B: f()
. Теперь подкласс еще не инициализирован (все еще выполняется super ()), поэтому x
по умолчанию имеет значение 0
, поскольку это значение по умолчанию для типа int
. Поскольку вы увеличили его (this.x++;
), он становится 1
B: x = 1
Теперь конструктор суперкласса завершен и возобновляется в конструкторе подклассов и, следовательно,
B: constructor
переменные экземпляра теперь установлены на значения, которые вы указали (против значений по умолчанию, соответствующих типу (0
для численных значений, false
для boolean
и null
для ссылок))
ПРИМЕЧАНИЕ. Если теперь вы напечатаете значение x
на вновь созданном объекте, это будет 10
. Поскольку это плохая практика, инструменты статического анализа кода (PMD, FIndBugs и т. Д.) Предупреждают если вы попытаетесь это сделать.