Для начала, этот код не компилируется из-за отсутствия метода someLookup
.
В любом случае, кроме того, я считаю, что ваша проблема в том, что ваши ожидания неверны из-за конструкторов путизапускаются иерархически.
Конструктор суперкласса 'всегда запускается перед подклассом', и это включает в себя инициализаторы для переменных подкласса '(которые на самом деле выполняются как часть конструктора).Итак, когда вы создаете свой экземпляр Derived
, происходит следующее:
- Сначала вызывается конструктор
Base
. Вызывается lookup()
, который использует реализациюв Derived
. num
возвращается , которое является значением по умолчанию на данный момент, поскольку конструктор и инициализаторы Derived не были запущены . val
имеет значение 0. - Инициализаторы и конструктор
Derived
запускаются - вызывая lookup
из эта точка вернет 10.
В общемПо этой причине плохая идея вызывать неконечный метод из конструктора, и многие инструменты статического анализа предупреждают вас об этом.Это похоже на утечку ссылок на объекты во время конструирования, в результате вы можете получить экземпляр, который делает недействительными инварианты уровня класса (в вашем случае значение num
в Derived равно «всегда» 10, но в некоторых точках его можно увидеть равным 0).
Изменить: Обратите внимание, что для этого конкретного случая, без какого-либо дополнительного кода, вы могли бы решить проблему, установив num
константу:
class Derived extends Base
{
private static final int num = 10;
...
Это будетна самом деле делать то, что вы хотите, потому что статический инициализатор запускается при загрузке класса (что должно произойти до вызова конструкторов).Это, однако, предполагает, что это нормально для:
a) всех экземпляров класса совместно использовать одну и ту же переменную num
;b) num
никогда не нужно менять (если это правда, то (a) выполняется автоматически).
В указанном вами коде это явно так, но я ожидаю, что вы можете пропуститьдополнительная функциональность для краткости.
Я включил это здесь для сравнения и интереса, а не потому, что это обходной путь к этой "проблеме" в общем смысле (потому что это не так).