Каждый раз, когда вы создаете экземпляр подкласса, сначала вызывается конструктор суперклассов (неявный 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 и т. Д.) Предупреждают вас, если вы пытаетесь это сделать.