• 締切済み

System.out.print

System.out.print()の outは Systemクラスのoutフィールドだそうです。 しかし、out.print(~)の形は意味がわかりません。 つまり、「フィールド.メソッド()」の意味がわからないのです。 普通は A a = new A(); とやって 「a.メソッド」つまり 「参照型変数.メソッド()」とやるはずです。 「フィールド.メソッド」の意味がよくわかりません。 よろしくお願いいたします。

みんなの回答

  • kztk
  • ベストアンサー率53% (59/110)
回答No.12

APIドキュメントを読めば、どのようなコンストラクタがあるのかはすぐ分かります。Java5.0の場合: http://java.sun.com/j2se/1.5.0/ja/docs/ja/api/java/io/PrintStream.html#constructor_summary です。APIドキュメントは、困ったときはまず最初に参照するよう習慣付けてください。 「コンストラクタの概要」にある7つのコンストラクタのうち、あなたが欲しいPrintStreamオブジェクトを作るのにふさわしい、と思われるコンストラクタを使えばよいのです。 たぶん質問者さんが一番とっつき易いのではないかと思われる、6つ目の public PrintStream(String fileName) を使った簡単なコードを例示しましょう。APIドキュメントにはこう書いてあります: //////////////// パラメータ: fileName - この出力ストリームの宛先として使用するファイルの名前。ファイルが存在する場合、サイズ 0 に切り捨てられる。ファイルがなければ新しいファイルが作成される。出力はファイルに書き込まれ、バッファに格納される //////////////// ので、"D:\test.txt"というファイル名を渡してみましょう。 (念のため、最低限のことしか書いていないのでこんなコーディングはしないように) ---- import java.io.PrintStream; public class PrintTest{ public static void main(String[] args) throws Exception{ PrintStream ps = new PrintStream("D:/test.txt"); ps.print("PrintStream test"); } } ---- うまく実行できればD:\test.txt"というファイルが出来て、そこにPrintStream test"と出力されるはずです。 ここまでは理解できましたか? でもSystem.outはあくまでSystem.outです。くどいようですが、「new PrintStream()とすべきだ」のように変な方向に進まないようにお願いします。

全文を見る
すると、全ての回答が全文表示されます。
  • kztk
  • ベストアンサー率53% (59/110)
回答No.11

>これはコンパイルエラーになります。 >どうしてなのでしょうか? 1.java.io.PrintStreamをimportしていない。 2.java.io.PrintStreamにデフォルトコンストラクタはない からです。 もしも上記二つの説明が理解できないのならば、これ以上new PrintStream()にこだわるのはやめましょう。今の状態では深みにはまるだけです。 当分の間、入門書を片手にサンプルプログラムを打ち込むことで言語の基礎を身につけることです。その間、"System.out.print()"はただの呪文だと思って疑問を持たないように。言語の基礎がもう少し身についてから考えれば別に難しいことではありません。 逆に、言語の基礎を身につけるためのサンプルプログラムを動かしてみるには"System.out.print()"が必須なので、最初にこれに疑問をもたれてしまうと一歩も前へ進めません。

ppp1984
質問者

お礼

ありがとうございます。見えてきました。 1はわかります。 2も少しわかります。ようは PrintStream a = new PrintStream(●●●); a.println("helloworld"); ●●●の部分に引数を入れればいいんですよね? そうすれば動くはずです。 その引数は何を入れたらよいのでしょうか? あと少しで山を越えれそうです。 よろしくお願いいたします。

全文を見る
すると、全ての回答が全文表示されます。
  • kztk
  • ベストアンサー率53% (59/110)
回答No.10

>普通は >A a = new A(); >とやって >「a.メソッド」つまり >「参照型変数.メソッド()」とやるはずです。 >どう考えても >PrintStream a = new PrintStream(); >a.print(~~) >の形になるはずなのですが。。。 誰に教わったかしりませんが、その思い込みを今すぐやめましょう。 どこかにそうしなければならないとでも書いてあったんですか? Systemクラスのoutフィールドをなぜあなたがnewしなくてよいのかは、 >「参照型変数.メソッド()」とやるはずです。 >「フィールド.メソッド」の意味がよくわかりません。 という疑問とはちょっと違う問題ですので、一度忘れましょうか。 以下のコードを読んでみてください。 grandpa.child.child.getName() という書き方が理解できれば一歩前進です。 --------- public class test{ public static void main(String[] args){ Human grandpa = new Human("おじいちゃん"); Human dad = new Human("パパ"); Human me = new Human("僕"); grandpa.child = dad; dad.child = me; //この表現は理解できますか? System.out.println(grandpa.child.child.getName()); } } class Human{ private String name; public Human child; public Human(String name){ this.name = name; } public String getName(){ return this.name; } } --------- >クラスフィールドは鵜飼のゲットした魚数です。 >インスタンスフィールドは個々の鵜がゲットした魚数です。 全然違うと思います。

ppp1984
質問者

お礼

ありがとうございます。しかし理解ができません。 class A { public static void main(String args[]) { PrintStream a = new PrintStream(); a.println("helloworld"); } } これはコンパイルエラーになります。 どうしてなのでしょうか? このレベルがわかってないのでせっかく書いていただいた例文も 歯が立ちません。

全文を見る
すると、全ての回答が全文表示されます。
  • kztk
  • ベストアンサー率53% (59/110)
回答No.9

>PrintStream out = new PrintStream(); >という文章が必要だと思うのですが。。。 >それはどこにあるのでしょうか? java.lang.Systemクラスの初期化処理の中です。 残念ながらoutへ代入されているところはnativeメソッドのようで中身が分かりませんでしたが、少なくとも、 new PrintStream(... という箇所はありましたよ。 あと、 >フィールドとはそのクラス内におけるグローバル変数のようなものです。 こちらからも、やはりクラスフィールドとインスタンスフィールドの違いが理解できているのかに疑問が沸きます。 private int a private static int a の違いは?

ppp1984
質問者

お礼

>やはりクラスフィールドとインスタンスフィールドの違いが理解できているのか 例えるなら クラスフィールドは鵜飼のゲットした魚数です。 インスタンスフィールドは個々の鵜がゲットした魚数です。 ざっくり言うとそういうことです。

ppp1984
質問者

補足

PrintStreamクラスにprintメソッドがあるのであれば、 どう考えても PrintStream a = new PrintStream(); a.print(~~) の形になるはずなのですが。。。 Systemクラスは関係ないはずです。

全文を見る
すると、全ての回答が全文表示されます。
  • luckymako
  • ベストアンサー率55% (29/52)
回答No.8

2番目の問は クラスメソッドとインスタンスメソッドの違いと クラスフィールドとインスタンスフィールドの違いは? という意味だったのですがどうですか?

全文を見る
すると、全ての回答が全文表示されます。
  • kztk
  • ベストアンサー率53% (59/110)
回答No.7

java.lang.Systemのドキュメントを見てください http://java.sun.com/j2se/1.5.0/ja/docs/ja/api/java/lang/System.html Systemクラスにはクラスフィールドoutがあります。 http://java.sun.com/j2se/1.5.0/ja/docs/ja/api/java/lang/System.html#out ここに、『public static final PrintStream out』 とあることから分かるように、outはPrintStreamクラスのインスタンスです。 >PrintStream a = System.out; >という形は始めて見たのですが、 >まず右辺と左辺のクラス名が違うことと 違いません。 aも、System.outもPrinsStreamです。 >右辺にカッコ()がないことです。 >あとnewはいらないんでしょうか? 必要ありません。System.outはPrintStreamのインスタンスです。 >System a = new System(); >a.println(~~); >とやることも可能なのでしょうか? できませんし、する必要もありません。 インスタンス化することができないことは上のページにもこう書いてあります: 『System クラスには有用なクラスフィールドおよびメソッドがあります。インスタンス化することはできません。 』 し、もっと具体的に言えば、Systemクラスのコンストラクタはprivateですので、貴方のプログラムからインスタンス化することはできないようになっています。 クラスフィールド、クラスメソッド、static等をキーワードにもう少し調べてみてはいかがでしょうか。

ppp1984
質問者

お礼

>outはPrintStreamクラスのインスタンスです。 ということは PrintStream out = new PrintStream(); という文章が必要だと思うのですが。。。 それはどこにあるのでしょうか?

全文を見る
すると、全ての回答が全文表示されます。
  • luckymako
  • ベストアンサー率55% (29/52)
回答No.6

オブジェクト指向の概念を再度確認してみてはいかがでしょうか。 ・クラスとは何かインスタンスとは何か ・それぞれのフィールド、メソッド特徴 ・Javaにおけるそれらの記述方法 これらを調べてみると System.out.print の意味を解っていただけるかも知れません。 「;」は実装をしていないことを明示するために書きました。 「0」は数字の零で整数であればなんでもかまいませんでした。

ppp1984
質問者

お礼

>・クラスとは何かインスタンスとは何か クラスとはたい焼きの鉄のやつです。 インスタンスとは食べれるたい焼きそのものです。 newするとメモリ上に実体が生成されます。 >それぞれのフィールド、メソッド特徴 フィールドとはそのクラス内におけるグローバル変数のようなものです。 メソッド内で変数を宣言するとそれはローカル変数です。 一番範囲の広いグローバル変数はpublic staticをつけます。 このぐらいの理解度からSystem.out.printを理解するには何が欠けているのでしょうか?

全文を見る
すると、全ての回答が全文表示されます。
  • thamansa
  • ベストアンサー率40% (95/232)
回答No.5

> System a = new System(); > a.println(~~); > とやることも可能なのでしょうか? 惜しいですね。 > Systemのフィールド変数outは、PrintStreamクラスのインスタンス ですので、 System.out.println("hello"); は PrintStream a = System.out; a.println("hello"); と書き換えることができます。

ppp1984
質問者

お礼

ありがとうございます。 PrintStream a = System.out; という形は始めて見たのですが、 まず右辺と左辺のクラス名が違うことと 右辺にカッコ()がないことです。 あとnewはいらないんでしょうか? PrintStreamクラスとSystemクラスが相互にからみあってる印象があるのですが、理解のコツのようなものはありますでしょうか?

全文を見る
すると、全ての回答が全文表示されます。
  • auty
  • ベストアンサー率58% (284/486)
回答No.4

[追記] .は、メンバアクセス演算子ともいい、結合規則として左からというのが決まっているのです。したがって System.out.print(1) は (System.out).println(1) ということになります。 実際に試してみてください。

全文を見る
すると、全ての回答が全文表示されます。
  • auty
  • ベストアンサー率58% (284/486)
回答No.3

>>> System a = new System();a.println(~~);とやることも可能なのでしょうか? ダメです。 println(~~) は、System.outオブジェクトのメソッドです。 System.outでひとかたまりと考えてください。 outだけでもなく、Systemだけのメソッドでもありません。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

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

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

    • ベストアンサー
    • Java
  • System.out.printlnの仕組み

    javaのSystem.out.println();について質問です。 System.out.println()の仕組みのサンプルコードを、以前書籍かサイトで見かけました。 それを見る限り この out は、Systemクラスのフィールド、定数out(静的)でPrintStream型のようでした。 そして、このPrintStream型の定数にPrintStreamのインスタンスを代入していました。 定数outはstaticだったのでSystem.out とSystemクラスはnewせずに直接呼べて、 定数自体にはPrintStreamインスタンスの参照が格納されているので printlnメソッドは、PrintStreamクラスのものかなと思いました。 疑問なのは、Systemクラスの定数に わざわざPrintStreamインスタンスを代入して PrintStreamクラスのメソッドを呼んでいるのかということです。 なぜPrintStreamクラスのprintlnメソッドを使うために PrintStreamクラスとSystemクラスの両方を使用するかが見えてきません。 詳しい方おられましたら教えてもらえないでしょうか?

  • System.out.printがコンパイルできません。

    以前は普通にコンパイル→実行と出来ていたのに、なぜか出来なくなってしまいました。 class HelloWorld {   public static void main(String[] args) {     System.out.print("HelloWorld!!");   } } の様な簡単なプログラムもコンパイルできません。 [エラーメッセージ] HelloWorld.java:3: シンボルを見つけられません。 シンボル: 変数 out 場所 : System の クラス System.out.print("HelloWorld!!"); [出来ていた→出来なくなったの間にしたこと。]  .NET Framework 2.0のインストール  QT TabBar(http://members.at.infoseek.co.jp/Quizo/freeware/)  のインストール→アンインストール  ・skypeのインストール [自分なりに試したこと]  使っていたSDK5.0を再インストール(環境変数も打ち直しました。)  int x = 5;などSystem.out.printを含まない命令は実行できました。 もし原因等分かるようでしたら御回答宜しくお願いします。

    • ベストアンサー
    • Java
  • クラス変数/メソッドとインスタンス変数/メソッドの見え方について

    Javaの言語仕様(?)についてお教え下さい。 参照変数の型がインスタンスのスーパークラスの型の時、クラス変数/メソッドとインスタンス変数/メソッドの見え方が納得いかずに困っています。 以下のような条件の時です。   ・クラスが2つあり、1つはもう1つのクラスを継承しています。     それぞれを「スーパー」「サブ」と以下で呼びます。   ・インスタンスは"サブ"の型です。   ・上記インスタンスへの参照変数は"スーパー"のクラスの型です。   ・"スーパー"、"サブ"ともに【同名】の「クラス」変数/メソッド、「インスタンス」変数/メソッドがあります。 この場合に、"サブ"のインスタンスを参照している"スーパー"の型の変数を介し、それらにアクセスしたらどれが見えるか?という疑問です。 実験結果では以下のようになりました。           [フィールド]  [メソッド]   [1.static ]  スーパーの   スーパーの   [2.非static]  スーパーの   サブの 納得いかないのは「2.非static」で「フィールド」が、「スーパーの」になるところです。 これも「サブの」になると思っていました。 なぜサブクラスのが見えないのでしょうか? 同名の変数なのでスーパークラスのはサブクラスので隠れされ、サブクラスのが見えると思っていたのですが。 参考書には以下のように書いてありました。   フィールドの場合、参照変数の型のものが見える。   メソッドの場合、インスタンスの型のものが見える。 私には不自然に感じられるのですが、「こういう仕様だから。」と納得するしか無いのでしょうか? 「なぜこうなるか」について説明がある文献、サイトなどありましたらお教えください。 参考までに以下が実験したサンプルコードと結果です。長くて申し訳ありません。 「サンプルコード」 public class Super { static int staticField = 10; int instanceField = 100; static void staticMethod() { System.out.println( "staticField = " + staticField ); } void instanceMethod() { System.out.println( "instanceField = " + instanceField ); } } public class Sub extends Super { static int staticField = 90; int instanceField = 900; static void staticMethod() { System.out.println( "staticField = " + staticField ); } void instanceMethod() { System.out.println( "instanceField = " + instanceField ); } } public class TestStatic { public static void main(String[] args) { // インスタンスはSub、参照変数もSub、という状態。 Sub sub = new Sub(); System.out.println( "実験1" ); System.out.println( "1.クラス変数      " + sub.staticField ); System.out.print( "2.クラスメソッド    " ); sub.staticMethod(); System.out.println( "3.インスタンス変数   " + sub.instanceField ); System.out.print( "4.インスタンスメソッド " ); sub.instanceMethod(); // インスタンスはSub、参照変数はSuper、という状態。 Super sup = new Sub(); System.out.println( "実験2" ); System.out.println( "5.クラス変数      " + sup.staticField ); System.out.print( "6.クラスメソッド    " ); sup.staticMethod(); System.out.println( "7.インスタンス変数   " + sup.instanceField ); System.out.print( "8.インスタンスメソッド " ); sup.instanceMethod(); } } 「結果」 実験1 1.クラス変数      90 2.クラスメソッド    staticField = 90 3.インスタンス変数   900 4.インスタンスメソッド instanceField = 900 実験2 5.クラス変数      10 6.クラスメソッド    staticField = 10 7.インスタンス変数   100 8.インスタンスメソッド instanceField = 900 納得が行かないのは7のところです。 以上よろしくお願いいたします。

    • ベストアンサー
    • Java
  • 呼び出し元のクラスのPrint

    クラス内のどこかにデバッグ用のメソッドを埋め込んで それがどのクラスで呼ばれたかPrintしたいのですが 最終的な呼び出し元(クラス、メソッド)を表示するにはどうしたらよいでしょうか? 現在以下のようなものを使っていますが、うまくクラスをたどった表示ができません。 es[2]としても同じです。 private static StackTraceElement[] es = new Exception().getStackTrace(); public static void MyDebugPrint(Object string) { System.out.println("[" + es[1].getClassName() + "] " + string); }

    • ベストアンサー
    • Java
  • ”メンバ指定”で表示させる順がわかりません

    一番したにかいたプログラムなんですが、 System.out.println("**********基本的なメンバ操作***********"); の次の表示させるコードは System.out.println("+++++++++++クラスメンバをインスタンス名で操作+++++++++++"); となっているのに、実行結果が **********基本的なメンバ操作*********** インスタンスメソッド: インスタンス変数=100クラス変数=300 インスタンスメソッド: インスタンス変数=200クラス変数=300 クラスメソッド;クラス変数=300 +++++++++++クラスメンバをインスタンス名で操作+++++++++++ d1のクラス変数=400 d2のクラス変数=400 MyClsのクラス変数=400 でした。 どういう順で処理されているのでしょうか。 超初心者です。変なことをたぶん聞いていると思いますが教えてください。 class MyCls { int ins_hensu = 0; static int cls_hensu = 0; public void ins_method() { System.out.println("インスタンスメソッド: インスタンス変数=" + ins_hensu + "クラス変数=" + cls_hensu); } public static void cls_method(){ System.out.println("クラスメソッド;クラス変数=" + cls_hensu); } } public class JaCls08{ public static void main(String args[]) { MyCls d1 = new MyCls(),d2 = new MyCls(); System.out.println("**********基本的なメンバ操作***********"); d1.ins_hensu = 100; d2.ins_hensu = 200; MyCls.cls_hensu = 300; d1.ins_method(); d2.ins_method(); MyCls.cls_method(); System.out.println("+++++++++++クラスメンバをインスタンス名で操作+++++++++++"); d1.cls_hensu =400; System.out.println("d1のクラス変数=" + d1.cls_hensu); System.out.println("d2のクラス変数=" + d2.cls_hensu); System.out.println("MyClsのクラス変数=" + MyCls.cls_hensu); } }

    • ベストアンサー
    • Java
  • 参照型変数で受け取らないnew

    ふつうは A a; a=new A(); というふうにnew A();を参照型変数aで受け取りますよね? しかしこの前見たのは メインメソッドにいきなり new A(); とだけ書いてあるのです。 参照型変数で受け取ってないんです。 こんなことゆるされるんでしょうか? これですと、Aというオブジェクトはnewされて生成されたわけですが、 どこからも参照されていないのでガーベッジコレクションの対象に なってしまうのではないのでしょうか? よろしくお願いいたします。

    • ベストアンサー
    • Java
  • 親クラスと子クラスのフィールドとメソッドについて

    親クラスと子クラスのフィールドとメソッドについて 以下のサンプルソースを実行した時の動作の原理について 教えてください。 oya型変数にkoクラスのインスタンスを作成した場合、 メソッドはkoクラスのものなのに、 フィールドはoyaクラスのものになるということが イマイチすっきり理解できません。 どういうことなんでしょうか。 ------------------------------------------------------- [ソース] public class exec { public static void main( String args[]){ oya obj = new ko(); System.out.println(obj.str_field); obj.disp_field(); } } public class oya{ String str_field="親実行"; public void disp_field(){ System.out.println(str_field); } } public class ko extends oya { String str_field = "子実行"; public void disp_field(){ System.out.println(str_field); } } ------------------------------------------------------- [実行結果] > 親実行 > 子実行 -------------------------------------------------------

    • ベストアンサー
    • Java
  • newしないインスタンス?実体化しなくてもいいの?

    JAVAについて教えて下さい。 ServletContext application = getServletContext(); の成り立ちの意味なのですが、newがなぜないのか教えて下さい。 ~自身の考え~ (1)サーブレットコンテキストというクラスをインスタンス化して (サーブレットコンテキスト 変数A = new サーブレットコンテキスト();)     ↑                         ↑   クラス                       クラス (2)変数Aドットメソッド()によって、代入変数Bを作り上げる (サーブレットコンテキスト 代入変数B = 変数A . メソッド();) (3)のはずが、上記の式にはnewがありません。 なんで?? ~~ ~疑問点~ もしかしたらHttpServletでimportしているからそこでnewインスタンス化宣言している? だとするならどのような式になっているのでしょうか。 もしくはメソッドのF3キーとして上位をたどったときに出てきた public abstract class GenericServlet implements Servlet, ServletConfig, Serializable { public ServletContext getServletContext() { return getServletConfig().getServletContext(); } } として抽象クラスが出てきましたが、どこにもnew実体化していません。 よろしくお願いいたします。

    • ベストアンサー
    • Java
  • スーパークラスからサブクラスのメソッドを使おうとする、以下のプログラム

    スーパークラスからサブクラスのメソッドを使おうとする、以下のプログラムでつまずいています。 Aを継承したB、Cクラスのインスタンスを作成し、スーパークラスであるA型の配列asにまとめます。 それからループでas[i]にはいっている各インスタンスのメソッドを使いたいのですが、 スーパークラスAにmethod()がないためコンパイルできません、Aにmethod()を作るとA.method()が実行されます。 BとCを同じ配列に保存し、かつそれぞれのmethod()を実行したい場合どのようにしたら良いのでしょうか。 ご教授ください、どうぞよろしくお願いします。 class Main{ private B b; private C c; private A[] as = new A[2]; void mainMethod(){ as[0] = b = new B(); as[1] = c = new C(); for(int i=0; i<3; i++){ as[i].method(); } } } class A{} class B extends A{ void method(){ System.out.print("It is B"); } } class C extends A{ void method(){ System.out.print("It is C"); } }