私はJavaの初心者です。System.out.println()私はその方法が使われているのだろうかと思っていました。SystemOutは、クラス内の静的フィールドです。のタイプはoutですPrintStream。しかし、PrintStreamクラスのコンストラクターを見たとき、それは型のパラメーターを取り、OutputStream私が知る限り、抽象クラスのオブジェクトを作成することはできません。その場合、いくつかのサブクラスのオブジェクトをのコンストラクターに渡す必要がありPrintStreamます。そのクラスは何ですか?同じですSystem.in。これも参照ですが、抽象的InputStreamであるため、それが指すオブジェクトのタイプは何ですか?InputStream
4 に答える
PrintStreamwraps BufferedOutputStream、wraps FileOutputStream、コンソールへの書き込み、独自のFileDescriptor。
クラスの構造を表示する簡単な方法は、デバッガーでクラスを調べることです。
ご覧のとおり、@Andremonifyの説明は基本的にあなたが持っているものです。
FileDescriptor
- 0はSystem.inです
- 1はSystem.outです
- 2はSystem.errです
- 3+は他のファイルに使用されます

はいoutはPrintStreamタイプです。そして、のコンストラクターは型をPrintStream取りますOutputStream。OutputStream抽象クラスです。ただし、スーパークラスの参照はキャストせずにサブクラスオブジェクトを参照できるため、PrintStreamのコンストラクターには参照がありますが、この参照は次のようなのサブクラスのOutputStream1つを参照している必要があります。OutputStreamFileOutputStream
の実装については、さらにいくつか言うことがありSystem.outます。
の実際の実装クラス
System.outは指定されていません。javadocsはそれが何であるかを言いません。 OracleJavaとOpenJDKJavaが特定の方法で「スタック」を実装していることを(さまざまな方法で)観察しています(他の回答を参照)が、これは将来変更される可能性があります。この
System::setOut(PrintStream)メソッドを使用して、System.outバインドされているものを変更できます。その場合、実装クラスに関する仮定が正しくない可能性があります。あなたがこれを行うことができることがわかります:
System.setOut(null);そう
System.outかもしれませんnull。ただし、現在の実装では、に設定しない限り、そうでSystem.outはありません。nullnull
仕様によって実際に保証されているのは、の値がSystem.outと互換性のある割り当てタイプを持つことだけですPrintStream。