- ベストアンサー
Javaプログラムの実行結果は?
- Javaのプログラムの実行結果が分からない方へ。インスタンスの操作によって変数がどのように変化するかを解説。
- 「false true」ではなく「false false」となる理由について解説します。
- 変数の参照を理解していないと、意図しない結果になることがあります。詳しくはこちら。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
メソッド内部の引数や変数は、外部の変数とはまったくの別物です。 たとえ同じ名前であっても混同されることはありません。 というわけで、静的メソッド operate の挙動は 「引数を二つ取り、最初の引数の中身を返す」 以外の何者でもありませんので、 以下の二つは同じ意味になります。 ojb2 = operate(ojb1, ojb2); ojb2 = ojb1; なので ojb1 == ojb2 // 両方とも最初に生成されたインスタンスなので true
その他の回答 (2)
- めとろいと(@naktak)
- ベストアンサー率36% (785/2139)
operate内で、 ojb1 = ojb2 ・・・つまり、ojb1の参照はojb2と同一を見るように変更された。 return ojb3 ・・・呼び元のojb2は、ojb3になる。 という流れから、returnされた時点で、ojb1 = ojb3 = ojb2でしょう。 そもそも先述したとおり、ojb1はojb2と同じアドレスを参照していますから、 return値をojb2で受け取った瞬間、ojb1もojb3になります。 ojb3は、元々呼び元でインスタンス化されたojb1です。 例えばこんなロジックで確認してみては。 public class Test { public String hoge = ""; public static void main(String[] args) { Test ojb1 = new Test(); ojb1.hoge = "1"; Test ojb2 = new Test(); ojb2.hoge = "2"; System.out.println((ojb1 == ojb2) +", ojb1.hoge=" + ojb1.hoge + ", ojb2.hoge=" + ojb2.hoge); ojb2 = operate(ojb1, ojb2); System.out.println(" " + (ojb1 == ojb2) + ", ojb1.hoge=" + ojb1.hoge + ", ojb2.hoge=" + ojb2.hoge); } static Test operate(Test ojb1, Test ojb2) { System.out.println("--------in operate--------"); Test ojb3 = ojb1; ojb3.hoge = "3"; System.out.println("<<before>>"); System.out.println("ojb1.hoge=" + ojb1.hoge); System.out.println("ojb2.hoge=" + ojb2.hoge); System.out.println("ojb3.hoge=" + ojb3.hoge); ojb1 = ojb2; System.out.println("<<after>>"); System.out.println("ojb1.hoge=" + ojb1.hoge); System.out.println("ojb2.hoge=" + ojb2.hoge); System.out.println("ojb3.hoge=" + ojb3.hoge); System.out.println("--------out operate--------"); return ojb3; } }
お礼
回答ありがとうございます。 具体的な例まで挙げて頂き、より深く理解できるようになりました。
- teketon
- ベストアンサー率65% (141/215)
>ojb2 = operate(ojb1, ojb2); >最終的に変数obj2とobj3は、最初に生成されたインスタンスTestを指し示し、 ここまであってます。 >System.out.print(" " + (ojb1 == ojb2)); >変数obj1は2番めに生成されたインスタンスTestを指すのだと思うのです。 ここはあっていません。オブジェクトをメソッドの引数にすると、参照渡しになります。 ですから、operateメソッド内で >ojb1 = ojb2; してもmainメソッドには反映されません。
お礼
回答ありがとうございます。 基礎的な概念が理解不足でした。
お礼
回答ありがとうございます。 要点を簡潔に解説して頂き、とても分かりやすかったです。