2013-10-04 15 views
6

Z ciekawości szukałem kodu źródłowego dla niektórych klas API Java, które można znaleźć pod adresem docjar.com. Widziałem klasę java.lang.System i zobaczył, że PrintStream "out" (czyli System.out) miał następujący kod:Dlaczego PrintStream "out" i InputStream "w" null?

public final static PrintStream out = null; 

iw komentarzach to mówi:

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

Moje zadanie polega na tym, wiem, że zmienne końcowe nie mogą być modyfikowane, więc dlaczego jest ono puste po zadeklarowaniu? Dlaczego Java nie generuje wyjątku NullPointerException, gdy wywoływana jest metoda "out"? To samo dotyczy również systemu.

Dzięki za wyjaśnienia.

Odpowiedz

1

Istnieje metoda macierzysta java.lang.System # registerNatives(). Jeśli spojrzysz na to w kodzie źródłowym jvm, przypisuje on sysin, sysout i syserr z natywnego kodu. Przed java 7 te deklaracje wyglądały jak public final static InputStream in = nullInputStream();, ale domyślam się, że zmieniły je, by były po prostu zerowe z niektórymi hackami w javacu, aby nie wstawiać ich po prostu.

0
  • Spójrz na prywatnej void initializeSystemClass() - metoda ta nazywa zacząć rzeczy, wywołuje setOut0(), która jest metoda naturalnej. To wiąże Strumień tam, gdzie powinno.

    Mimo że pole może wyglądać na publiczne, statyczne zakończenie, to faktycznie nie jest to , kod natywny go zmienia.

    JVM wywołuje metodę private static void initializeSystemClass(), która ją inicjalizuje.

Powiązane problemy