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

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

ただいまの
回答率

90.60%

  • Java

    13495questions

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

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

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 441

BSS_sapporo

score 32

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

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ページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • grovion

    2017/01/06 15:59 編集

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

    キャンセル

  • BSS_sapporo

    2017/01/06 16:15

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

    キャンセル

回答 3

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

結局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 16:35 編集

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

    キャンセル

  • 2017/01/06 16:37

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

    その通りですよ

    キャンセル

  • 2017/01/06 16:44

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

    キャンセル

  • 2017/01/06 16:45

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

    キャンセル

+1

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/01/06 16:39

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

    キャンセル

  • 2017/01/06 16:43

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

    キャンセル

  • 2017/01/06 16:48

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

    キャンセル

-3

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/01/06 16:26 編集

    Test obj2 = new Test();
    Test obj1 = obj2;
    obj2 = new Test();
    System.out.println(obj1 == obj2); //=> false

    となったので-1しました。
    勘違いしていたら叱って下さい。

    キャンセル

  • 2017/01/06 16:37

    間違いだったようです

    キャンセル

  • 2017/01/06 17: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を参照するようになるという考え方自体が間違っていたようです

    キャンセル

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

  • ただいまの回答率 90.60%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 受付中

    ループ化の方法

    public class Gohkaku {     public static void main(String[] args){         int math = ne

  • 解決済

    String型について(短いコードです)

    前提・実現したいこと String(参照型)について理解したい。 質問 以下のコードをコンパイル・実行すると 【UPDATED, ORIGINAL】となるのですが、

  • 解決済

    getMethod、invokeの第2引数について

    こんなクラスがあったとします。 class Test { private Double A; private Integer B; private

  • 受付中

    配列について

    例えば boolean A[] = new boolean[]{false, true, false}; のような配列があったとして 配列Aが全てtrueの場合Bという処理を

  • 解決済

    クラスリストの比較でcontainsが動作してくれない

    containsを用いて2つのクラスリストを比較したいのですが、うまく動作してくれません。 class Order{ public int id; publi

  • 解決済

    javaの==とequalsの違いについて

    package test; public class Sample { private int num; private String name;

  • 解決済

    ループ中の関数で1週目に一度だけ行う処理

    実現したいこと java勉強中の初心者です ループの一週目のみ関数で特定の処理(セットアップ)をさせたいです 関数中の変数のみで実現させたいです どうかよろしくお願いします 実

  • 解決済

    thisの意味が分かりません。

    前提・実現したいこと プログラミング初心者です。 Javaで電卓を作っています。 コードの一番下の三行のthisというのは継承しているJFrameクラスのことを指しているのでしょう

同じタグがついた質問を見る

  • Java

    13495questions

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

  • トップ
  • Javaに関する質問
  • java 参照型変数を”==”で比較しているコードの実行結果について解説して頂けないでしょうか。