El código fuente tiene el siguiente comentario:
/**
* The following two methods exist because in, out, and err must be
* initialized to null. The compiler, however, cannot be permitted to
* inline access to them, since they are later set to more sensible values
* by initializeSystemClass().
*/
En resumen, desde System.in
es una variable static final, si se ha establecido a null
, el compilador lo consideraría como una constante, y reemplazaría todo las referencias a System.in
en otras clases con null
(eso es lo que significa enmarcar). Lo que obviamente haría que todo no fuera funcional. Se debe usar algún código nativo para reemplazar el valor final de este System.in
(que normalmente nunca debería cambiar) una vez que el sistema se inicializa.
Para reanudar: se usa para evitar una optimización del compilador que no debería hacerse en este caso particular, porque System.in es un campo final que puede cambiar, lo que normalmente es imposible.
+1 Esta es la respuesta correcta. –
tiene razón, hay 'vacío público estático setIn (InputStream in)' e invoca 'vacío estático nativo privado setIn0 (InputStream in);' – Pshemo
¿cuál es el propósito de setIno (InputStream in) y setOut (PrintStream out) – user1357722