Почему System.out объявлен как final, но не инициализирован?

Я изучаю Java, и у меня возник вопрос по методу System.out.println(), а конкретнее, что именно означает слово out в нём.

Поковырявшись, я нашел это:

public final class System {

    public static final InputStream in;

    public static final PrintStream out; 

Там это работает. Но когда я пытаюсь создать свой класс с полем

public static final PrintStream out;

например

public final class MoyKlass{
    public static final PrintStream out;

выдаёт ошибку: значение out должно быть инициализировано

Почему в классе System такое можно, а в моём классе нет?


Ответы (1 шт):

Автор решения: Кирилл Малышев

В классе System такое можно, потому что инициализация этих членов происходит с помощью native-методов. Здесь можно увидеть их объявление:

private static native void setIn0(InputStream in);
private static native void setOut0(PrintStream out);
private static native void setErr0(PrintStream err);

С точки зрения языка Java значения final-переменных, действительно, нельзя изменить обычными средставми, поэтому у вас возникает ошибка. Но native-методы позволяют это сделать. В спецификации языка есть даже отдельный пункт об изменении final-переменных.

→ Ссылка