• 締切済み

Javaの問題がわからないです

Javaでわからないことがあります。 この問題なのですが、23行目から6行目に制御がうつるのはわかりました。その後がどう動くのかがわからなくて。

みんなの回答

  • akira1720
  • ベストアンサー率80% (128/159)
回答No.2

23 行目では、21 行目で作った Boo クラスのインスタンスである b オブジェクトの useGoo メソッドを呼び出しています。 b は "Boo" という値を与えて初期化された Boo クラスのインスタンスです。useGoo メソッドには g という引数が与えられていますが、 その g は 22 行目で作られていますね。Goo クラスのインスタンスです。 ここで一旦、Boo や Goo を初期化するときに与えられた "Boo", "Goo" という値がどうなったのか見てみましょう。 Boo のコンストラクタは3行目です。21行目で与えられた "Boo" という文字列が msg という Boo クラスの中の変数に代入されています。 同様に、14 行目の Goo のコンストラクタでも msg に "Boo" という値が代入されています。 では改めて 23 行目を見てみましょう。 b オブジェクトの msg 変数には "Boo" が入っていました。 useGoo の引数は g ですが、それは Goo のインスタンスで、msg には "Goo" が入っています。 それを念頭に置いて useGoo メソッドが定義されている 6 行目を見ます。 useGoo の引数には g という名前が与えられています。さっき useGoo を呼び出したときに与えた引数は g という名前でしたが、このメソッド内でも g という名前で呼ばれることになりました。 7 行目では setMsg メソッドを実行していますが、その引数には g.getMsg() が入っています。ではまず g.getMsg() が何を返すか見ましょう。 g は Goo のインスタンスだったので、Goo クラスの getMsg メソッドの定義を見ます。16 行目ですね。これによると、msg 変数を返しています。ここでいう msg 変数は、Goo のインスタンスである g の中の msg 変数です。この g というのは 22 行目でインスタンス化されたもの(そのものかそれがコピーされたものかはここでは重要ではないので気にしないことにします)なので、msg には "Goo" が入っています。 なので、g.getMsg() の値は "Goo" です。 7 行目に戻りますよ。setMsg("Goo") メソッドがここで実行されますが、ここで setMsg といえば Boo クラスの中で定義された setMsg メソッド (4行目) です。 ここでは、b (Boo のインスタンス) の msg 変数に "Goo" が代入されます。そして 8 行目、useGoo メソッドの戻り値として、g オブジェクトが返されます。この g ってこの useGoo メソッドを呼び出すときに引数として与えられたものと同じもので、このメソッド内では特になにも変化を与えていないので、あまり意味はない結果です。実際呼び出しもとの 23 行目では、返された値を使っていません (b.useGoo(g) の結果を何にも代入していない)。これは useGoo メソッドは何らかの値を返すのが目的ではないのでこれでいいのです。 さて、24 行目では結果をプリントします。 b.getMsg() では b オブジェクト(クラス Boo のインスタンス) の msg 変数を取ってきます。b オブジェクトの msg 変数って今どうなってたかというと、初期化のときにはここには "Boo" という値が入っていたはずですが、さっき "Goo" に書き換えられてしまいました。なので、b.getMsg() の結果は "Goo" です。 g.getMsg() も同様に Goo クラスのインスタンスである g の msg 変数をとってくるのですが、この g のmsg は初期化されてから変更されていないので、"Goo" のままです。 なので、24 行目でプリントされるのは "Goo:Goo" になります。

  • _kappe_
  • ベストアンサー率68% (1600/2328)
回答No.1

3月の質問https://okwave.jp/qa/q9862994.htmlでもobj.methodB()のようなメソッド呼び出しがあって、そのときにはどう動くか分かっていたのですよね。その時点まで戻って復習してください。

関連するQ&A