• ベストアンサー

SJC-Pの問題で分からない部分があります・・・

非常に基本的な質問になってしまうのですがご容赦下さい。 現在、SJC-Pの問題集でコンストラクタに関する問題に引っかかっています。 ---- 1 public class Test { 2 private String msg; 3 public Test() { this ("Good Morning"); } 4 public Test(String msg) { msg = msg; } 5 public String toString(){ return ("msg : " + msg); } 6 7 public static void main(String args[]){ 8 System.out.println(new Test()); 9 } 10 } ---- の実行結果を答えよ、という問題で、行数を実行順に追った場合、 8→3→4→8 なのかな、と思い、実行結果は「Good Morning」として答え合わせをした所、結果は、「msg : null」でした。 解説文と前後関係を読むと、どうも 8→3→4→5→8 と途中で4行目の「msg = msg」をしている(インスタンス変数にメソッド引数を入れている)時に5行目のtoStringが動いているようなのですが、明示的には4行目にtoStringを呼ぶとは書かれていません。 これはこういったルールなのでしょうか。 どうしてこのようなルールが適用されるのでしょうか?  このルールの名称は何でしょうか?  初歩的な質問で大変恐縮ですが、どなたかご存知の方がいらっしゃいましたら教えて下さい。 宜しくお願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.3

実行順序はおっしゃる通りで問題ありません。 4 public Test(String msg) { msg = msg; } のmsgは両方のオペランドがとも仮引数msgによってシャドウ化されたローカル変数msgです。 なので、ローカル変数msgにローカル変数msgを代入という、全く無意味な事をしています。 そしてSystem.out.println()メソッドは暗黙的にtoString()メソッドを呼び出しますので、 5 public String toString(){ return ("msg : " + msg); } の内容が出力されますが、上述の通りフィールドmsgは一切変更が行われていないため、デフォルト初期値nullで出力されるわけです。 尚、 4 public Test(String msg) { msg = msg; } を 4 public Test(String msg) { this.msg = msg; } とする事で、当初お考えになっていた通りの実行結果になります。

javawater
質問者

お礼

詳しい結果を頂きありがとうございました。

その他の回答 (2)

  • mine0714
  • ベストアンサー率0% (0/1)
回答No.2

valueOf→toString の理解は全回答者様がご提示くださった通りということで。 public class Dog { public static void main(String[] args) { System.out.println(new Dog()); } @Override public String toString() { return "ばうばう"; } } これを見ると「ふーん」となれるかも。

javawater
質問者

お礼

回答ありがとうございます。 #1さんへの御礼で、オーバーロードと書いてしまいましたが、 オーバーライドの間違いでしたか^^;

  • Yanch
  • ベストアンサー率50% (114/225)
回答No.1

API リファレンスによると、 ●System.out.println(Object x); > public void println(Object x) > > Object を出力して、行を終了します。このメソッドは、最初に > String.valueOf(x) を呼び出して、出力されたオブジェクトの文字列値 > を取得します。次に、print(String) を呼び出してから println() を > 呼び出すのと同じように動作します。 > > パラメータ: > x - 出力される Object 値 さらに、 ●String.valueOf(Object obj); >public static String valueOf(Object obj) > > Object 引数の文字列表現を返します。 > > パラメータ: > obj - Object > 戻り値: > 引数が null の場合は、"null" に等しい文字列。そうでない場合は、 > obj.toString() の値 > 関連項目: > Object.toString() との事です。

javawater
質問者

お礼

回答ありがとうございました。 System.out.printlnのオーバーロードだったのですね。

関連するQ&A