私はJavaの初心者です。System.out.println()
私はその方法が使われているのだろうかと思っていました。System
Outは、クラス内の静的フィールドです。のタイプはout
ですPrintStream
。しかし、PrintStream
クラスのコンストラクターを見たとき、それは型のパラメーターを取り、OutputStream
私が知る限り、抽象クラスのオブジェクトを作成することはできません。その場合、いくつかのサブクラスのオブジェクトをのコンストラクターに渡す必要がありPrintStream
ます。そのクラスは何ですか?同じですSystem.in
。これも参照ですが、抽象的InputStream
であるため、それが指すオブジェクトのタイプは何ですか?InputStream
4 に答える
PrintStream
wraps BufferedOutputStream
、wraps FileOutputStream
、コンソールへの書き込み、独自のFileDescriptor
。
クラスの構造を表示する簡単な方法は、デバッガーでクラスを調べることです。
ご覧のとおり、@Andremonifyの説明は基本的にあなたが持っているものです。
FileDescriptor
- 0はSystem.inです
- 1はSystem.outです
- 2はSystem.errです
- 3+は他のファイルに使用されます
はいout
はPrintStream
タイプです。そして、のコンストラクターは型をPrintStream
取りますOutputStream
。OutputStream
抽象クラスです。ただし、スーパークラスの参照はキャストせずにサブクラスオブジェクトを参照できるため、PrintStreamのコンストラクターには参照がありますが、この参照は次のようなのサブクラスのOutputStream
1つを参照している必要があります。OutputStream
FileOutputStream
の実装については、さらにいくつか言うことがありSystem.out
ます。
の実際の実装クラス
System.out
は指定されていません。javadocsはそれが何であるかを言いません。 OracleJavaとOpenJDKJavaが特定の方法で「スタック」を実装していることを(さまざまな方法で)観察しています(他の回答を参照)が、これは将来変更される可能性があります。この
System::setOut(PrintStream)
メソッドを使用して、System.out
バインドされているものを変更できます。その場合、実装クラスに関する仮定が正しくない可能性があります。あなたがこれを行うことができることがわかります:
System.setOut(null);
そう
System.out
かもしれませんnull
。ただし、現在の実装では、に設定しない限り、そうでSystem.out
はありません。null
null
仕様によって実際に保証されているのは、の値がSystem.out
と互換性のある割り当てタイプを持つことだけですPrintStream
。