java 参照型変数を”==”で比較しているコードの実行結果について解説して頂けないでしょうか。
- 評価
- クリップ 0
- VIEW 1,191
参照型変数を”==”で比較している以下のコードを実行した際の処理結果についてご教示頂けないでしょうか。
public class Test {
public static void main(String[] args) {
Test obj1 = new Test(); //①Testオブジェクト(仮にA)を生成し変数obj1が参照している
Test obj2 = new Test(); //②Testオブジェクト(仮にB)を生成し変数obj2が参照している
System.out.print(obj1 == obj2); //③各変数の参照先が異なるため"false"が返る
obj2 = operate(obj1, obj2); /*④operateメソッドの呼び出し
⑨operateメソッドの処理結果としてobj3が返り、
obj2はobj3が参照しているオブジェクト(A)を参照する*/
System.out.print(" " + (obj1 == obj2)); //⑩ここで"true"が返る??
}
static Test operate(Test obj1, Test obj2){ //⑤
Test obj3 = obj1; //⑥変数obj3はobj1が参照しているオブジェクト(A)を見る
obj1 = obj2; //⑦obj1はobj2が参照しているオブジェクト(B)を見る
return obj3; //⑧呼び出し元へobj3を返す
}
}
【処理結果】
false true
上記コードの⑩部分によってtrueが出力されることが理解できていません。
私自身の理解としては、
・obj3…Test obj3 = obj1;
(⑥)によってTest obj1 = new Test();
で生成されたオブジェクトAを参照
・obj1…obj1 = obj2;
(⑦)によってTest obj2 = new Test();
で生成されたオブジェクトBを参照
・obj2…obj2 = operate(obj1, obj2);
およびreturn obj3;
(⑧)によってobj3と同じオブジェクトAを参照(obj2 = obj3 と同義)
となるため、⑩の(obj1 == obj2)
では、上記のとおり変数obj1の参照先(オブジェクトB)と
変数obj2の参照先(オブジェクトA)が異なるため、falseが返る。と考えたのですが異なるようなので、
なぜ⑩の(obj1 == obj2)
ではtrueが返るのか解説をお願いできますでしょうか。
初歩的な質問で申し訳ありませんが、よろしくお願いします。
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
checkベストアンサー
+1
operate
の処理を勘違いしているかもしれないので、
operate
の処理の理解をすすめるために、順を追って同等な処理で、より短い処理にoperate
を変換していきます。
operateの同等な変換 version1
以下のように引数の名前を変更しても全く同じ処理をしていることはわかりますか?
名前は同じでも、スコープが違えば別です。
operateの中でobj1 = obj2
して、
operateの中のobj1の変数を変えても、
mainの中のobj1の参照先を変えることはしません。
static Test operate(Test ooooo1, Test ooooo2){ //⑤
// 混乱を避けるため、ooooo1, ooooo2と引数の名前を変更しました
Test obj3 = ooooo1; //⑥変数obj3はobj1が参照しているオブジェクト(A)を見る
ooooo1 = ooooo2; //⑦obj1はobj2が参照しているオブジェクト(B)を見る
return obj3; //⑧呼び出し元へobj3を返す
}
operateの同等な変換 version2
またobj3を返すと言うことは、以下の処理でも全く同じ処理と言うことはわかりますか?
static Test operate(Test ooooo1, Test ooooo2){ //⑤
// 混乱を避けるため、ooooo1, ooooo2と引数の名前を変更しました
Test obj3 = ooooo1; //⑥変数obj3はobj1が参照しているオブジェクト(A)を見る
// 無意味
// ooooo1 = ooooo2; //⑦obj1はobj2が参照しているオブジェクト(B)を見る
return obj3; //⑧呼び出し元へobj3を返す
}
operateの同等な変換 version3
結局operate
はoooo1
を返していうことはわかりますか?
つまり、operate
はこれをしていることと同じということがわかりますか?
static Test operate(Test ooooo1, Test ooooo2){ //⑤
// 混乱を避けるため、ooooo1, ooooo2と引数の名前を変更しました
return ooooo1;
}
operateの同等な変換の通り、operateは第一引数をそのまま返す関数になります。
つまり
operate(obj1, obj2) == obj1
となります
つまり
obj2 = operate(obj1, obj2)
としたあとに
println(obj1 == obj2)
すれば、trueになりますね
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
+1
同じ名前なのでややこしいかも知れませんが、mainメソッドの中の変数obj1,obj2と、operateメソッドの引数obj1,obj2は完全に独立していることが理解出来ているでしょうか。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
-3
obj1 = obj2; //⑦obj1はobj2が参照しているオブジェクト(B)を見る
この部分でobj1 が obj2の中のオブジェクトを示す事が決定するので
以降obj2に何が入れられようとその(obj1 = obj2)事実が変わらないからではないでしょうか
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.10%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
質問への追記・修正、ベストアンサー選択の依頼
grovion
2017/01/06 15:59 編集
処理結果は「false, true」の書き間違えではないですか
BSS_sapporo
2017/01/06 16:15
仰る通りです。ご指摘ありがとうございます。該当部分を修正致しました。