- ベストアンサー
すでに開かれているとは何か?
- 「すでに開かれている」とは、既に存在している状態を指す表現です。具体的には、java.lang.System.outが既に開かれていることを示しています。
- java.lang.System.outをリファレンスで確認すると、標準出力ストリームであり、すでに開かれているという記述があります。これは、java.lang.Systemクラスのoutフィールドが既にインスタンス化されていることを意味しています。
- もしjava.lang.System.outがまだ開かれていない場合、PrintStreamのインスタンス化が必要です。具体的には、java.lang.System.out = new PrintStream();という処理を行う必要があります。これにより、g.println()としてjava.lang.System.outを使用することができます。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
java.lang.System.outに結びつけられている出力ストリームは使用開始準備が整っていて、すぐにそのストリームへ出力ができるということです。当然、その出力ストリームのインスタンスが存在しています。 > java.lang.System.out g = new PrintStream(); こういう書き方はできません。java.lang.System.outはフィールド名であってクラス名や型名ではないので、それを以て変数gを宣言することはできません。 java.lang.System.outに結びつけられている出力ストリームを別のもので取り替えたい場合には、java.lang.System.setOut()メソッドを使います。
その他の回答 (1)
- hoge_piyo
- ベストアンサー率57% (15/26)
eclipse上でSystemクラスの中を見てみると、以下のようになってました。 private static native void setOut0(PrintStream out); private static void initializeSystemClass() { //途中省略 FileOutputStream fdOut = new FileOutputStream(FileDescriptor.out); //途中省略 setOut0(new PrintStream(new BufferedOutputStream(fdOut, 128), true)); //途中省略 } initializeSystemClassというのが、直接どこからも呼ばれてなさそうなので、これ以上詳しくはわかりませんが、(自動で呼ばれるようになってる?)初期化の時点で、インスタンスを設定しているのは間違い有りません。 気になるなら、Systemクラスや、上記のinitializeSystemClassのメソッドで使われているFileDescriptorクラスのコードを読んでみるといいでしょう。 ただ、ソースを追っていっても、nativeなメソッドに突き当たってしまうと思うので、全体の動きを理解するのは難しいと思いますが、なんとなくイメージはつかめると思います。 http://www3.ea.u-tokai.ac.jp/~sakata/jdk5/docs/ja/api/java/io/FileDescriptor.html http://e-words.jp/w/E38395E382A1E382A4E383ABE38387E382A3E382B9E382AFE383AAE38397E382BF.html
お礼
ありがとうございます。 確かにフィールドなので、そのように宣言することはできませんね。 > java.lang.System.out g = new PrintStream(); java.lang.System.out = new PrintStream(); 上記のように宣言しているということでしょうか?