Почему / когда __declspec (dllimport) не нужен?

System.out инициализируется null при создании экземпляра класса. Это задается методом nullPrintStream() в System.java, который просто возвращает null.

Когда JVM инициализируется, он вызывает метод initializeSystemClass(). Этот метод вызывает метод native setOut0(), который устанавливает переменную out в соответствующее значение.

Это может показаться странным, но это необходимая операция по следующим причинам:

  • out не может быть установлен статически на значение, потому что System должен быть одним из первых загруженных классов (до PrintStream).
  • out должен быть final, так что его значение не может быть напрямую переопределено пользователем.
  • Поскольку out нельзя установить статически и является окончательным, мы должны переопределить семантика языка с использованием метода native, setOut0().

Надеюсь, это поможет вам понять.

35
задан xtofl 20 December 2010 в 14:22
поделиться