2012-05-27 15 views

risposta

8

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.

+0

+1 Questa è la risposta corretta. –

+0

hai ragione, c'è 'public static void setIn (InputStream in)' e invoca 'statico privato nativo void setIn0 (InputStream in);' – Pshemo

+0

qual è lo scopo di setIno (InputStream in) e setOut (PrintStream out) – user1357722

-1

vi sbagliate.

Nel codice sorgente di Java è scritto come

public final static InputStream in = null; 

non

public final static InputStream in = nullInputStream(); 

si può prendere di riferimento del codice sorgente per la classe di Systemhere.

+0

prega di controllare al di sotto del sistema public final class { /* La prima cosa --- registrare i nativi */ registerNatives vuoto native static privati ​​(); statico { registerNatives(); } /** Non consentire a nessuno di istanziare questa classe */ sistema privato() { } /** * Il flusso di input "standard". Questo stream è già * aperto e pronto per fornire dati di input. Tipicamente questo flusso * corrisponde all'ingresso tastiera o un'altra sorgente di ingresso indicato dal * all'ambiente host o utente. */ InputStream static final pubblica = nullInputStream(); – user1357722

+0

Da dove hai preso il riferimento alla fonte? –

+0

Hai preso il riferimento sbagliato. –

Problemi correlati