- ベストアンサー
javaの参照変数の質問です。
Object o1 = new Object(); Object o2 = new Object(); Object o3 = o1 だと o1==o3 o1.equals(o3) なのは=で代入したから。で分かります。 しかし o1==o2 o1.equals(o2) にならないのは、なぜなのでしょうか。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
equals(Object) は、引数のオブジェクトと「等価」であるか否かを返します。 http://java.sun.com/javase/ja/6/docs/ja/api/java/lang/Object.html#equals%28java.lang.Object%29 Object クラスでは同じインスタンスのみが「等価」であると決めているので、その様になります。 他のクラスでは、独自の「等価」の定義、つまり equals の実装をすることも可能です。 String で考えると分かりやすいかも知れません。 下記の例では str1, str2 は別々のオブジェクトですが、値はどちらも「java」です。 String str1 = new String("java"); String str2 = new String("java"); System.out.println(str1 == str2); // false System.out.println(str1.equals(str2)); // true System.out.println(str1 == "java"); // false System.out.println(str1.equals("java")); // true もし、String で equals がオーバライドされておらず Object と同じ動作をしていたら、上記の例は全て false になります。 str1 が「java」なのに str1.equals("java") が false になる可能性があれば、かなり困りますよね。 下記のページも参考になると思います。 http://www.ibm.com/developerworks/jp/java/library/j-jtp05273/ ちなみに、 new String("java") は別インスタンスを作るためにわざとやっているだけですので、 通常のプログラムでは String を new するのはやめた方が良いです。
その他の回答 (2)
- yamada_g
- ベストアンサー率68% (258/374)
ObjectクラスとDateクラスではequals()の実装が違うからです。 http://java.sun.com/javase/ja/6/docs/ja/api/java/util/Date.html#equals(java.lang.Object) >このオブジェクトとミリ秒まで同じ時点を表す Date オブジェクトであれば、true を返します。 です。
- Tacosan
- ベストアンサー率23% (3656/15482)
o1 と o3 は実体が同じ. o1 と o2 は実体も違う.
お礼
実体というキーワードで検索すると下のような記述あり。 http://msugai.fc2web.com/java/reference.html Date date1 = new Date(); Date date2 = new Date(); date1 == date2; //false date1.equals(date2); //true 同じオブジェクトメソッドからnewされてるから一緒になるのでは?
お礼
参照しているのがインスタンスだからですね。 丁寧にご説明ありがとうございました。