2013-10-04 14 views
6

Per curiosità stavo guardando attraverso il codice sorgente per alcune delle classi API Java trovate a docjar.com. Ho visto la classe java.lang.System e vide che la PrintStream "out" (cioè, System.out) ha avuto il seguente codice:Perché PrintStream "out" e InputStream "in" null?

public final static PrintStream out = null; 

e nei commenti si dice:

The "standard" output stream. This stream is already 
open and ready to accept output data. 

La mia ricerca è, so che le variabili finali non possono essere modificate, quindi perché è nulla quando viene dichiarato? Perché Java non lancia una NullPointerException quando viene chiamato un metodo per "out"? Lo stesso vale per System.in.

Grazie per qualsiasi chiarimento.

risposta

1

C'è un metodo java.lang.System # registerNatives() nativo. Se lo si guarda nel codice sorgente di jvm, assegna sysin, sysout e syserr dal codice nativo. Prima di java 7 queste dichiarazioni assomigliavano a public final static InputStream in = nullInputStream(); ma immagino che lo abbiano cambiato per essere solo nulli con alcuni hack in javac non solo in linea.

0
  • Date un'occhiata ai initializeSystemClass static void privati ​​() - questo metodo viene chiamato per avviare le cose, si chiama setOut0(), che è un metodo nativo . Questo lega il flusso nel punto in cui dovrebbe essere.

    Quindi, anche se il campo potrebbe sembrare pubblico statico finale, in realtà non lo è , il codice nativo lo cambia.

    JVM chiama il metodo private static void initializeSystemClass() che lo inizializza.

Problemi correlati