Почему 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-переменных.