System.out инициализируется null
при создании экземпляра класса. Это задается методом nullPrintStream()
в System.java
, который просто возвращает null
.
Когда JVM инициализируется, он вызывает метод initializeSystemClass()
. Этот метод вызывает метод native
setOut0()
, который устанавливает переменную out
в соответствующее значение.
Это может показаться странным, но это необходимая операция по следующим причинам:
out
не может быть установлен статически на значение, потому что System
должен быть одним из первых загруженных классов (до PrintStream
). out
должен быть final
, так что его значение не может быть напрямую переопределено пользователем. out
нельзя установить статически и является окончательным, мы должны переопределить семантика языка с использованием метода native
, setOut0()
. Надеюсь, это поможет вам понять.