Вы, похоже, путаете компилятор со временем выполнения. То, что делает someMethod()
, определяется во время компиляции и сохраняется в выходном файле .class. Среда выполнения читает эти файлы .class и строит определения классов из них. Таким образом, он обладает полным знанием того, что делает someMethod (), прежде чем вы попытаетесь создать экземпляр SomeClass
. Нет ограничений на то, что конструктор должен завершить работу, прежде чем методы класса будут иметь определение.
Что Java делает, так это запускает все инициализаторы в порядке, в котором они объявлены, затем запускает то, что находится в фактическом конструкторе. Рассмотрим:
private Integer foo = getFoo();
private Integer bar = Integer.valueOf(4);
private Integer getFoo() {return bar;}
foo будет нулевым, когда мы закончим, потому что он был объявлен первым, а bar все еще был нулевым, когда мы его присвоили.
private Integer bar = Integer.valueOf(4);
private Integer foo = getFoo();
private Integer getFoo() {return bar;}
Таким образом, foo будет 4, когда строительство будет завершено! В любом случае, среда выполнения может посмотреть определение метода getFoo () до того, как конструктор будет создан, потому что компилятор поместил определение этого в файл класса.