5

私はJavaの初心者です。System.out.println()私はその方法が使われているのだろうかと思っていました。SystemOutは、クラス内の静的フィールドです。のタイプはoutですPrintStream。しかし、PrintStreamクラスのコンストラクターを見たとき、それは型のパラメーターを取り、OutputStream私が知る限り、抽象クラスのオブジェクトを作成することはできません。その場合、いくつかのサブクラスのオブジェクトをのコンストラクターに渡す必要がありPrintStreamます。そのクラスは何ですか?同じですSystem.in。これも参照ですが、抽象的InputStreamであるため、それが指すオブジェクトのタイプは何ですか?InputStream

4

4 に答える 4

3

PrintStreamwraps BufferedOutputStream、wraps FileOutputStream、コンソールへの書き込み、独自のFileDescriptor

于 2013-01-21T08:51:35.600 に答える
3

クラスの構造を表示する簡単な方法は、デバッガーでクラスを調べることです。

ご覧のとおり、@Andremonifyの説明は基本的にあなたが持っているものです。

FileDescriptor

  • 0はSystem.inです
  • 1はSystem.outです
  • 2はSystem.errです
  • 3+は他のファイルに使用されます

ここに画像の説明を入力してください

于 2013-01-21T09:03:11.817 に答える
1

はいoutPrintStreamタイプです。そして、のコンストラクターは型をPrintStream取りますOutputStreamOutputStream抽象クラスです。ただし、スーパークラスの参照はキャストせずにサブクラスオブジェクトを参照できるため、PrintStreamのコンストラクターには参照がありますが、この参照は次のようなのサブクラスのOutputStream1つを参照している必要があります。OutputStreamFileOutputStream

于 2013-01-21T09:02:33.517 に答える
1

の実装については、さらにいくつか言うことがありSystem.outます。

  1. の実際の実装クラスSystem.outは指定されていません。javadocsはそれが何であるかを言いません。 OracleJavaとOpenJDKJavaが特定の方法で「スタック」を実装していることを(さまざまな方法で)観察しています(他の回答を参照)が、これは将来変更される可能性があります。

  2. このSystem::setOut(PrintStream)メソッドを使用して、System.outバインドされているものを変更できます。その場合、実装クラスに関する仮定が正しくない可能性があります。

  3. あなたがこれを行うことができることがわかります:

      System.setOut(null);
    

    そうSystem.out かもしれませnull。ただし、現在の実装では、に設定しない限り、そうでSystem.outはありません。nullnull

仕様によって実際に保証されているのは、の値がSystem.outと互換性のある割り当てタイプを持つことだけですPrintStream

于 2017-10-26T11:45:45.927 に答える