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

public class Test {
public static void main(String[] args) {
Test ojb1 = new Test();
Test ojb2 = new Test();
System.out.print(ojb1 == ojb2);
ojb2 = operate(ojb1, ojb2);
System.out.print(" " + (ojb1 == ojb2));
}

static Test operate(Test ojb1, Test ojb2) {
Test ojb3 = ojb1;
ojb1 = ojb2;
return ojb3;
}
}

実行すると「false true」となります。
しかし私は「false false」だと思うのですが、どこが間違っているかが分かりません。

最終的に変数obj2とobj3は、最初に生成されたインスタンスTestを指し示し、
変数obj1は2番めに生成されたインスタンスTestを指すのだと思うのです。

よろしくお願い致します。

A 回答 (3件)

メソッド内部の引数や変数は、外部の変数とはまったくの別物です。


たとえ同じ名前であっても混同されることはありません。

というわけで、静的メソッド operate の挙動は
「引数を二つ取り、最初の引数の中身を返す」
以外の何者でもありませんので、
以下の二つは同じ意味になります。

ojb2 = operate(ojb1, ojb2);
ojb2 = ojb1;

なので

ojb1 == ojb2 // 両方とも最初に生成されたインスタンスなので true
    • good
    • 1
この回答へのお礼

回答ありがとうございます。
要点を簡潔に解説して頂き、とても分かりやすかったです。

お礼日時:2014/09/13 13:57

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

}
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
具体的な例まで挙げて頂き、より深く理解できるようになりました。

お礼日時:2014/09/13 13:56

>ojb2 = operate(ojb1, ojb2);


>最終的に変数obj2とobj3は、最初に生成されたインスタンスTestを指し示し、
ここまであってます。

>System.out.print(" " + (ojb1 == ojb2));
>変数obj1は2番めに生成されたインスタンスTestを指すのだと思うのです。
ここはあっていません。オブジェクトをメソッドの引数にすると、参照渡しになります。
ですから、operateメソッド内で
>ojb1 = ojb2;
してもmainメソッドには反映されません。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
基礎的な概念が理解不足でした。

お礼日時:2014/09/13 13:55

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