アプリ版:「スタンプのみでお礼する」機能のリリースについて

System.out.printlnの意味がよくわかりません。

色々と参考書などを読むと、「Systemのフィールド変数outは、PrintStreamクラスのインスタンスを参照している。」との記述がありました。
ならばと、直接io パッケージからPrintStream 、outを呼び出すため、
“java.io.PrintStream.out. println();”と書きましたが、「outが不可視です」とのエラーが出ます。
このコマンドのどこが間違っているのでしょうか。

また、何故、Systemから、他のパッケージにあるメソッドを呼び出すのでしょうか。
わざわざSystemから、ioパッケージにあるout 、println() を呼び出す必要があるのでしょうか。
他の呼び出し方はないのでしょうか。;

A 回答 (4件)

まずprintln() がStatic な関数であれば呼び出せます。

上記のエラーですと、どうやらそうではないようですね。(ドキュメントを確認ください)

この場合、コンソールに対する出力用としてPrintStream が最初から準備(インスタンス化されていて、出力先は標準出力コンソールに設定されている)という訳です。System.out がまさにそれです。

いわゆるStream 系は出力先やら設定を保持する必要があるので、オブジェクトをインスタンス化して使う事を想定しています。そしてSystem.out はデフォルトで用意(つまりJava サイドで勝手にインスタンス化)されているって事です。

あなたが別の出力先(例えばファイルなど)を指定したいのなら、インスタンス化したオブジェクトのprintln() を呼ぶ事になるでしょう。
    • good
    • 0

あなたは「フィールド」「インスタンス」「パッケージ」「メソッド」などをどのように認識しているのでしょうか? そして, 「オブジェクト指向」についてどの程度わかっているのでしょうか?


なんとなく曖昧になっているような気がします. まあ, 私自身も「オブジェクト指向とは何か」と聞かれると答えに困るわけですが....
    • good
    • 5

その疑問を本気で解決するなら、Sunからソースが公開されているので、それを読めば疑問は解けると思いますが。

    • good
    • 0

まずAPIを読めば書いてありますが、PrintStreamのフィールドのoutはアクセス修飾子がprotectedです。



つまりPrintStreamを継承したクラスからしかアクセスできません。
そのためPrintStream.outと記述してもoutが見ることができないと怒られます。

また、System.outが参照しているのはPrintStreamのインスタンスでSystem.out.println()というのはPrintStreamnクラスのprintln()というメソッドを呼び出しています。

上のような記述だとPrintStreamクラスのフィールドのoutが参照しているインスタンスのprintln()メソッドを呼び出すという意味になります。

しかしながらPrintStreamクラスのフィールドのoutはOutputStreamクラスのインスタンスを参照しています。
このOutputStreamクラスにはprintln()メソッドは定義されていません。
したがってoutが例え可視の状態にあってもprintln()なんてないから呼び出せませんとコンパイラにエラーを出されてしまいます。

二番目の質問に対してですが、恐らくパッケージに対しての認識がちょっと間違っていると思いますので、参考書を読みながらしっかり理解されることをお勧めします。

SystemからPrintStreamのprintlnを呼び出すのは簡単に標準出力を行うためです。
PrintStreamのインスタンスを作ってprintln()を呼び出してという作業を自分でしなくてもSunが準備してくれたものを使えば簡単にできますよということです。
オブジェクト指向には一回作ったものを再利用しようという考え方があります。
よく使う処理を毎回毎回プログラマが作っていたら面倒ですよね?
それを回避するために最初から簡単にできるようなものをSunが作ってくれたってことです。


これらを理解するにはオブジェクト指向やJavaに対する知識がある程度必要なので、とりあえず今はおとなしくSystem.out.println()をつかっておいて、分かるようになってから考えればいいと思います。

頑張ってください。
    • good
    • 6

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!