10

Systemクラスでは、inout、およびerrは静的フィールドです。これらのフィールドは、たとえば次のように宣言されています。

 public final static InputStream in = nullInputStream();

nullInputStream()なぜ代わりに宣言するのnullですか?

4

2 に答える 2

10

ソースコードには次のコメントがあります。

/**
 * 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().
 */

つまり、System.instatic final変数であるため、 に設定されているnull場合、コンパイラはそれを定数と見なしSystem.in、他のクラスのすべての参照を に置き換えますnull(これがインライン化の意味です)。明らかにすべてが機能しなくなります。System.inシステムが初期化されたら、ネイティブ コードを使用して、この最終値 (通常は決して変更されない)の値を置き換える必要があります。

再開するには: これは、この非常に特殊なケースで行うべきではないコンパイラの最適化を回避するために使用されます。System.in は変更可能な最終フィールドであり、通常は不可能であるためです。

于 2012-05-27T13:13:02.883 に答える
-1

あなたは間違っている。

Java ソース コードでは、次のように記述されます。

 public final static InputStream in = null;

いいえ

 public final static InputStream in = nullInputStream();

System クラスのソースコードはこちらから参照できます。

于 2012-05-27T13:04:40.667 に答える