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

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

A 回答 (12件中1~10件)

APIドキュメントを読めば、どのようなコンストラクタがあるのかはすぐ分かります。

Java5.0の場合:
http://java.sun.com/j2se/1.5.0/ja/docs/ja/api/ja …
です。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()とすべきだ」のように変な方向に進まないようにお願いします。
    • good
    • 0

>これはコンパイルエラーになります。


>どうしてなのでしょうか?

1.java.io.PrintStreamをimportしていない。
2.java.io.PrintStreamにデフォルトコンストラクタはない

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

ありがとうございます。見えてきました。
1はわかります。
2も少しわかります。ようは
PrintStream a = new PrintStream(●●●);
a.println("helloworld");

●●●の部分に引数を入れればいいんですよね?
そうすれば動くはずです。
その引数は何を入れたらよいのでしょうか?
あと少しで山を越えれそうです。
よろしくお願いいたします。

お礼日時:2008/04/01 18:30

>普通は


>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;
}
}
---------

>クラスフィールドは鵜飼のゲットした魚数です。
>インスタンスフィールドは個々の鵜がゲットした魚数です。

全然違うと思います。
    • good
    • 0
この回答へのお礼

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

お礼日時:2008/03/30 16:13

>PrintStream out = new PrintStream();


>という文章が必要だと思うのですが。。。
>それはどこにあるのでしょうか?

java.lang.Systemクラスの初期化処理の中です。
残念ながらoutへ代入されているところはnativeメソッドのようで中身が分かりませんでしたが、少なくとも、
new PrintStream(...
という箇所はありましたよ。


あと、

>フィールドとはそのクラス内におけるグローバル変数のようなものです。

こちらからも、やはりクラスフィールドとインスタンスフィールドの違いが理解できているのかに疑問が沸きます。

private int a
private static int a

の違いは?

この回答への補足

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

補足日時:2008/03/28 22:02
    • good
    • 0
この回答へのお礼

>やはりクラスフィールドとインスタンスフィールドの違いが理解できているのか

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

お礼日時:2008/03/28 21:58

2番目の問は



クラスメソッドとインスタンスメソッドの違いと
クラスフィールドとインスタンスフィールドの違いは?

という意味だったのですがどうですか?
    • good
    • 0

java.lang.Systemのドキュメントを見てください


http://java.sun.com/j2se/1.5.0/ja/docs/ja/api/ja …

Systemクラスにはクラスフィールドoutがあります。
http://java.sun.com/j2se/1.5.0/ja/docs/ja/api/ja …

ここに、『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等をキーワードにもう少し調べてみてはいかがでしょうか。
    • good
    • 0
この回答へのお礼

>outはPrintStreamクラスのインスタンスです。

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

お礼日時:2008/03/25 07:42

オブジェクト指向の概念を再度確認してみてはいかがでしょうか。



・クラスとは何かインスタンスとは何か
・それぞれのフィールド、メソッド特徴
・Javaにおけるそれらの記述方法

これらを調べてみると System.out.print の意味を解っていただけるかも知れません。

「;」は実装をしていないことを明示するために書きました。
「0」は数字の零で整数であればなんでもかまいませんでした。
    • good
    • 0
この回答へのお礼

>・クラスとは何かインスタンスとは何か

クラスとはたい焼きの鉄のやつです。
インスタンスとは食べれるたい焼きそのものです。
newするとメモリ上に実体が生成されます。

>それぞれのフィールド、メソッド特徴

フィールドとはそのクラス内におけるグローバル変数のようなものです。
メソッド内で変数を宣言するとそれはローカル変数です。
一番範囲の広いグローバル変数はpublic staticをつけます。

このぐらいの理解度からSystem.out.printを理解するには何が欠けているのでしょうか?

お礼日時:2008/03/25 07:35

> System a = new System();


> a.println(~~);
> とやることも可能なのでしょうか?

惜しいですね。
> Systemのフィールド変数outは、PrintStreamクラスのインスタンス
ですので、
System.out.println("hello");

PrintStream a = System.out;
a.println("hello");
と書き換えることができます。
    • good
    • 1
この回答へのお礼

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

お礼日時:2008/03/24 20:28

[追記]



.は、メンバアクセス演算子ともいい、結合規則として左からというのが決まっているのです。したがって
System.out.print(1)

(System.out).println(1)
ということになります。

実際に試してみてください。
    • good
    • 1

>>> System a = new System();a.println(~~);とやることも可能なのでしょうか?



ダメです。
println(~~)
は、System.outオブジェクトのメソッドです。
System.outでひとかたまりと考えてください。
outだけでもなく、Systemだけのメソッドでもありません。
    • good
    • 0

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