質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

3回答

3297閲覧

java 参照型変数を”==”で比較しているコードの実行結果について解説して頂けないでしょうか。

BSS_sapporo

総合スコア44

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2017/01/06 06:51

編集2017/01/06 07:14

参照型変数を”==”で比較している以下のコードを実行した際の処理結果についてご教示頂けないでしょうか。

java

1public class Test { 2 public static void main(String[] args) { 3 Test obj1 = new Test(); //①Testオブジェクト(仮にA)を生成し変数obj1が参照している 4 Test obj2 = new Test(); //②Testオブジェクト(仮にB)を生成し変数obj2が参照している 5 System.out.print(obj1 == obj2); //③各変数の参照先が異なるため"false"が返る 6 obj2 = operate(obj1, obj2); /*④operateメソッドの呼び出し 7 ⑨operateメソッドの処理結果としてobj3が返り、 8 obj2はobj3が参照しているオブジェクト(A)を参照する*/ 9 System.out.print(" " + (obj1 == obj2)); //⑩ここで"true"が返る?? 10 } 11 static Test operate(Test obj1, Test obj2){ //⑤ 12 Test obj3 = obj1; //⑥変数obj3はobj1が参照しているオブジェクト(A)を見る 13 obj1 = obj2; //⑦obj1はobj2が参照しているオブジェクト(B)を見る 14 return obj3; //⑧呼び出し元へobj3を返す 15 } 16}

【処理結果】

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が返るのか解説をお願いできますでしょうか。

初歩的な質問で申し訳ありませんが、よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

grovion

2017/01/06 06:59 編集

処理結果は「false, true」の書き間違えではないですか
BSS_sapporo

2017/01/06 07:15

仰る通りです。ご指摘ありがとうございます。該当部分を修正致しました。
guest

回答3

0

同じ名前なのでややこしいかも知れませんが、mainメソッドの中の変数obj1,obj2と、operateメソッドの引数obj1,obj2は完全に独立していることが理解出来ているでしょうか。

投稿2017/01/06 07:19

swordone

総合スコア20651

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

BSS_sapporo

2017/01/06 07:39

ご回答頂きましてありがとうございます。 一言で理解することができました。 returnされているもの以外の処理はoperateメソッド外では無意味ということですね。
swordone

2017/01/06 07:43

代入処理だけならばその通りですが、そのオブジェクトのメソッドを実行するなどでオブジェクト内部の操作をした場合は無意味ではありません。
BSS_sapporo

2017/01/06 07:48

言葉足らずでした。仰る通りですね。 今回に限っては obj1 = obj2; 部分が無意味であると認識しました。 ご指摘ありがとうございます。
guest

0

ベストアンサー

operateの処理を勘違いしているかもしれないので、
operateの処理の理解をすすめるために、順を追って同等な処理で、より短い処理にoperateを変換していきます。

operateの同等な変換 version1

以下のように引数の名前を変更しても全く同じ処理をしていることはわかりますか?

名前は同じでも、スコープが違えば別です。
operateの中でobj1 = obj2して、
operateの中のobj1の変数を変えても、
mainの中のobj1の参照先を変えることはしません。

java

1 static Test operate(Test ooooo1, Test ooooo2){ //⑤ 2 // 混乱を避けるため、ooooo1, ooooo2と引数の名前を変更しました 3 4 Test obj3 = ooooo1; //⑥変数obj3はobj1が参照しているオブジェクト(A)を見る 5 ooooo1 = ooooo2; //⑦obj1はobj2が参照しているオブジェクト(B)を見る 6 return obj3; //⑧呼び出し元へobj3を返す 7 }

operateの同等な変換 version2

またobj3を返すと言うことは、以下の処理でも全く同じ処理と言うことはわかりますか?

java

1 static Test operate(Test ooooo1, Test ooooo2){ //⑤ 2 // 混乱を避けるため、ooooo1, ooooo2と引数の名前を変更しました 3 4 Test obj3 = ooooo1; //⑥変数obj3はobj1が参照しているオブジェクト(A)を見る 5 6 // 無意味 7 // ooooo1 = ooooo2; //⑦obj1はobj2が参照しているオブジェクト(B)を見る 8 9 return obj3; //⑧呼び出し元へobj3を返す 10 } 11

operateの同等な変換 version3

結局operateoooo1を返していうことはわかりますか?
つまり、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になりますね

投稿2017/01/06 07:01

編集2017/01/06 07:19
grovion

総合スコア145

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

BSS_sapporo

2017/01/06 07:36 編集

具体的にご説明頂きありがとうございます。ハッとしました。 恥ずかしながらmainメソッドのローカル変数(obj1,obj2)とoperateメソッドのローカル変数(obj1,obj2)は別物(スコープが違う)ということが頭から抜けていました。 returnしているobj3の参照先(=obj1)のみが呼び出し元に戻るので、obj2 = obj1となり、2度目の (obj1 == obj2) ではtrueが返るということですね。 もっと言えば、operateメソッド内の obj1 = obj2; に関してはreturnされていないため、operateメソッド内のみで有効なものである、と認識しましたが相違ないでしょうか。
grovion

2017/01/06 07:37

>> もっと言えば、operateメソッド内の`obj1 = obj2;`に関してはreturnされていないため、operateメソッド内のみで有効なものである、と認識しましたが相違ないでしょうか。 その通りですよ
BSS_sapporo

2017/01/06 07:44

何度もありがとうございます。 スッキリと理解することができました。
grovion

2017/01/06 07:45

スッキリできて良かったです
guest

0

obj1 = obj2; //⑦obj1はobj2が参照しているオブジェクト(B)を見る
この部分でobj1 が obj2の中のオブジェクトを示す事が決定するので
以降obj2に何が入れられようとその(obj1 = obj2)事実が変わらないからではないでしょうか

投稿2017/01/06 07:01

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fuzzball

2017/01/06 07:30 編集

Test obj2 = new Test(); Test obj1 = obj2; obj2 = new Test(); System.out.println(obj1 == obj2); //=> false となったので-1しました。 勘違いしていたら叱って下さい。
退会済みユーザー

退会済みユーザー

2017/01/06 07:37

間違いだったようです
退会済みユーザー

退会済みユーザー

2017/01/06 08:22

public class TAE { public static void main(String[] args) { TAE obj1 = new TAE(); TAE obj2 = new TAE(); TAE obj3 = obj1; obj1 = obj2; System.out.print(obj3 == obj2); } } 以上の結果もfalseになるので、そもそも TAE obj3 = obj1;した後にobj1 = obj2;するとobj3がobj2を参照するようになるという考え方自体が間違っていたようです
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問