Да что поведение корректно определено here.
Короче говоря, со ссылкой на эту ссылку из
инициализации класса или интерфейса состоит из выполнения класса или инициализации интерфейса метод <clinit>
...
Класс или интерфейс могут быть инициализированы только в результате:
Выполнение любой из инструкций виртуальной машины Java new, getstatic, putstatic или invokestatic, которая ссылается на класс или интерфейс (§new, §getstatic, §putstatic, §invokestatic). Все эти инструкции ссылаются на класс прямо или косвенно через ссылку на поле или ссылку на метод.
После выполнения новой инструкции ссылочный класс или интерфейс инициализируются, если он еще не был инициализирован.
После выполнения инструкции getstatic, putstatic или invokestatic класс или интерфейс, объявивший разрешенное поле или метод, инициализируется, если он еще не был инициализирован.
Первый вызов экземпляра java.lang.invoke.MethodHandle, который был результатом разрешения дескриптора метода виртуальной машины Java (§5.4.3.5) и имеет вид 2 (REF_getStatic), 4 (REF_putStatic) или 6 (REF_invokeStatic).
Вызов некоторых отражающих методов в библиотеке классов (§2.12), например, в классе Class или в пакете java.lang.reflect.
Инициализация одного из его подклассов.
Его обозначение как начальный класс при запуске виртуальной машины Java (§5.2).
<clinit>
является метод (созданный компилятором), который инициализирует статические переменные и имеет код, который вы положили в static
блоке
В вашем случае, когда static
блок класса B
прогонов (что будет <clinit>
), он будет иметь код операции getStatic
, запросив A.HOST
. Таким образом инициализация A
будет запущена, и A.HOST
будет инициализирован. Таким образом, вы будете читать правильное значение.
Просто запустите простой тест, чтобы узнать, будет ли он инициализирован или нет – nafas
, если вы сделаете ссылку на A в первую очередь, A будет полностью инициализирована, и всякий раз, когда вы вызываете B в первый раз, он будет работать нормально. Если вы сначала вызовете B, он будет каскадироваться до A, когда встретит A.HOST. – njzk2
Прикольная часть была бы, если бы у A было что-то вроде 'HOST = B.FOO'. Не уверен, что он даже скомпилировался. – njzk2