Il codice sorgente ha il seguente commento:
/**
* 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().
*/
In breve, poiché System.in
è una variabile statica finale, se è stato impostato null
, il compilatore considerare come una costante, e dovrebbe sostituire tutti i riferimenti a System.in
in altre classi con null
(è ciò che significa l'inlining). Il che ovviamente renderebbe tutto non funzionale. È necessario utilizzare un codice nativo per sostituire il valore di questo valore finale(che normalmente non dovrebbe mai essere modificato) una volta che il sistema è stato inizializzato.
Per riprendere: è usato per evitare un'ottimizzazione del compilatore che non dovrebbe essere fatta in questo caso particolare, perché System.in è un campo finale che può cambiare, che è normalmente impossibile.
fonte
2012-05-27 13:13:02
+1 Questa è la risposta corretta. –
hai ragione, c'è 'public static void setIn (InputStream in)' e invoca 'statico privato nativo void setIn0 (InputStream in);' – Pshemo
qual è lo scopo di setIno (InputStream in) e setOut (PrintStream out) – user1357722