2012-05-27 12 views

Respuesta

8

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.

+0

+1 Esta es la respuesta correcta. –

+0

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

+0

¿cuál es el propósito de setIno (InputStream in) y setOut (PrintStream out) – user1357722

-1

Usted está equivocado.

En código fuente de Java que se escribe como

public final static InputStream in = null; 

no

public final static InputStream in = nullInputStream(); 

que puede tomar de referencia del código fuente de la clase hereSystem.

+0

Por favor, verifíquelo debajo de la clase final pública Sistema { /* Lo primero --- registrar los nativos */ private static native native registerNatives(); estática { registerNatives(); } /** No deje que nadie instanciar esta clase */ sistema privado() {} /** * El flujo de entrada "estándar". Esta secuencia ya está * abierta y lista para suministrar datos de entrada. Normalmente, esta corriente * corresponde a la entrada del teclado u otra fuente de entrada especificada por * el entorno de host o usuario. */ public static final InputStream in = nullInputStream(); – user1357722

+0

¿De dónde tomó la referencia de origen? –

+0

Ha tomado una referencia incorrecta. –

Cuestiones relacionadas