System
クラスでは、in
、out
、およびerr
は静的フィールドです。これらのフィールドは、たとえば次のように宣言されています。
public final static InputStream in = nullInputStream();
nullInputStream()
なぜ代わりに宣言するのnull
ですか?
System
クラスでは、in
、out
、およびerr
は静的フィールドです。これらのフィールドは、たとえば次のように宣言されています。
public final static InputStream in = nullInputStream();
nullInputStream()
なぜ代わりに宣言するのnull
ですか?
ソースコードには次のコメントがあります。
/**
* 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.in
はstatic final
変数であるため、 に設定されているnull
場合、コンパイラはそれを定数と見なしSystem.in
、他のクラスのすべての参照を に置き換えますnull
(これがインライン化の意味です)。明らかにすべてが機能しなくなります。System.in
システムが初期化されたら、ネイティブ コードを使用して、この最終値 (通常は決して変更されない)の値を置き換える必要があります。
再開するには: これは、この非常に特殊なケースで行うべきではないコンパイラの最適化を回避するために使用されます。System.in は変更可能な最終フィールドであり、通常は不可能であるためです。
あなたは間違っている。
Java ソース コードでは、次のように記述されます。
public final static InputStream in = null;
いいえ
public final static InputStream in = nullInputStream();
System
クラスのソースコードはこちらから参照できます。