Javaに関する様々な情報をご紹介します。

Javaに関する様々な情報をご紹介します。
評価

0

Java クラスの参照に関する問題

以下コードの実行結果は、
false true
となります(Eclipseで確認済み)が、なぜ2回目のSystem.out.print(...)の実行結果がtrueとなるのかが
分かりません。
どなたかご教示いただけないでしょうか、よろしくお願いします。
(私の解釈を、コードの下に記載します。間違いを指摘してもらえると幸いです。)

public class testclass {
    public static void main(String[] args){
        testclass obj1 = new testclass();
        testclass obj2 = new testclass();
        System.out.print(obj1 == obj2);
        obj2 = operate(obj1, obj2);
        System.out.print(" " + (obj1 == obj2));
    }
    static testclass operate(testclass obj1, testclass obj2){
        testclass obj3 = obj1;
        obj1 = obj2;
        return obj3;
    }
}

私の解釈
コードの3、4行目でobj1, obj2オブジェクトが作成される。
obj1とobj2は別々のオブジェクトを指しているため、
5行目のSystem.out.printメソッドではfalseが返る。

6行目で、obj1とobj2をoperateメソッドに引数として渡し、
処理はoperateメソッド(9行目)に移る。
10行目で、
 obj1変数の参照先をobj3変数に代入
11行目で、
 obj2変数の参照先をobj1変数に代入
12行目で、
 obj3変数の参照先を返す
 つまり、6行目のobj2変数にobj1変数の参照先を代入

7行目
 obj1の参照先は11行目でobj2になっている
 obj2の参照先は12行目でobj1になっている
 したがって、(obj1 == obj2)は false が返されると考えているのですが、
 そうはなりませんでした。。。 trueが返ってきます。

なぜでしょうか?

2

回答

198

閲覧

2件の回答

評価

0

変数のスコープについて勉強してみよう。

評価

0

回答ありがとうございます。

>変数のスコープについて勉強してみよう。
 なるほど。
 operateメソッドの中のobj1と外のobj1は別物ってことですね。

 クラス型の変数なので参照渡しだから...と誤解していたようです。
 どうしても腑に落ちなかったのですが、なんとか理解できたのかなと思います。
 ありがとうございました。

回答する

ログインしていません。

ログインしなくても回答はできますが、ログインすると、質問・回答の管理、更新があった場合のメールでの通知を受けることができます。 アカウントをお持ちでない方は会員登録を行ってください。

ユーザ名匿名