• ベストアンサー

equals()について

public class Test1 { public static void main(String[] args) { Long A = new Long(7); Long L = new Long(7); if(A.equals(L))System.out.println("Equal"); else System.out.println("Not Equal"); } } のようなプログラムではAとLは別で宣言されるため "別オブジェクト”に成ると思い込んでいました。 しかし結果はequalでした・・・ たとえばABCというクラスがあったとして、 ABC c = new ABC(); ABC d = new ABC(); ABC e = c; とすれば、 c、dはnot equal で c,eはequal に成りますよね。 これはすごくわかるんです。 で、なぜ上のプログラムでAとLがequalになってしまうのかわかりません・・・・ 誰か教えてください・・・

質問者が選んだベストアンサー

  • ベストアンサー
回答No.6

もはや蛇足の感もありますが... >objectクラスのequalsとLongクラスのequalsで、別々なんだよ、と考えてしまったほうが、とりあえずわかりやすいようなきがします。 それで良いと思いますよ。 LongクラスでもStringクラスでも、equals()やtoString()のメソッドがオーバーライドされているので、java.lang.Objectクラスでの動き(デフォルトと覚えてもいいと思いますが)と別物になっているというわけです。 そもそも、equals()メソッドが、すべてのクラスで==の評価と同じ処理を行うのであれば、必要ないですよね? 「「意味的に同じ」というのはどういうことか、クラスを作るプログラマが必要に応じて定義してね。とりあえず、デフォルトでは==と同じ動作にしておきますよ。」ってことです。で、Longクラスを作った人や、Stringクラスを作った人は、デフォルトとは別にしたってことだと覚えれば良いと思います。 >今回の件は、問題集の問題であり(Sunの認定試験です)そのほとんどが引っ掛け問題ですので、 きちんと抑えておかないと回答できない、ということによります。 僕も受験しようかと勉強中です... 頑張りましょう

azicyan
質問者

補足

御礼が遅くなりました。 >LongクラスでもStringクラスでも、equals()やtoString()のメソッドがオーバーライドされているので、java.lang.Objectクラスでの動き(デフォルトと覚えてもいいと思いますが)と別物になっているというわけです。 よくわかりました。 >僕も受験しようかと勉強中です... 頑張りましょう はい!がんばりましょう! 多分僕のほうが足元にもおよばないでしょうが・・・ お互いがんばって取得いたしましょう!

その他の回答 (5)

  • symgt
  • ベストアンサー率56% (68/120)
回答No.5

> Longクラスのequalsとobjectのequalsでは違うという認識でよろしいでしょうか? 実装(equalsメソッドの処理)が違いますから違うという認識で問題ないと思います。 今回の件はクラスの継承やメソッドのオーバーライドについて 理解できていれば難しい問題ではありません。 Javaを勉強する上で基本となるところですのできちんと理解しておきましょう。

azicyan
質問者

補足

ありがとうございます。 >実装(equalsメソッドの処理)が違いますから違うという認識で問題ないと思います。 一安心です(^_^;) おそらく、 objectクラスのequalsとLongクラスのequalsの違い がわかっているかを試す問題だったと思います。 ありがとうございました!

回答No.4

equals()メソッドでどのような評価がされるかは、そのクラスを設計した人が決めるということです。ABCクラスが自分で作ったクラスで、equals()メソッドをオーバーライドして独自に書いてあれば、その独自の方法で評価されるということになります。もし、独自に書いていないのであれば、java.lang.Objectのequals()メソッドの説明のまま、「==」と同じ評価が行われるということですね。 つまり、Longのequals()の場合は、独自の評価方法を持っているということです。 こんな説明でわかりますか...? toString()メソッドの値が等しいからequals()も等しいとは必ずしも言えませんが、そのようなクラスを作ることは可能です。逆にそうじゃないクラスも作れます。 同じオブジェクトを参照しているかどうか調べる場合は、==を使った方が良いですよ。

azicyan
質問者

補足

>equals()メソッドでどのような評価がされるかは、そのクラスを設計した人が決めるということです。 問題上はデフォルトで、ということになるかと思います。 >equals()メソッドの説明のまま、「==」と同じ評価が行われるということですね。 でも、LとAはequalでも==では無いんですよね・・・ 高橋麻奈さんのやさしいJAVAによると オブジェクト(インスタンスかな?)の場合には 別定義であれば別物(つまりfalse) 代入であれば同じ物をさしますからtrueとなり、 また別にStringクラスのequalsについてはコラムになっており、この場合には別定義でも、同じ文字列、たとえば「こんにちは」、がはいっていればtrueとなる、 とありました。 この説明を照らし合わせると、 objectクラスのequalsとLongクラスのequalsで、別々なんだよ、と考えてしまったほうが、とりあえずわかりやすいようなきがします。 間違っていますでしょうか・・・ >toString()メソッドの値が等しいからequals()も等しいとは必ずしも言えません うーん、残念です・・・ それで正しければ、かなりわかりやすかったです・・・ >同じオブジェクトを参照しているかどうか調べる場合は、==を使った方が良いですよ。 そうですね。僕もそう思うんですが、 今回の件は、問題集の問題であり(Sunの認定試験です)そのほとんどが引っ掛け問題ですので、 きちんと抑えておかないと回答できない、ということによります。 実践的な質問ではありませんでした。 ご丁寧に何度もありがとうございます。 とても助かります。

回答No.3

同じオブジェクトを参照しているかどうか評価するのは「==」です。 equals()メソッドは、意味的に同じかどうかを評価するために使用します。どう実装されているかは、そのクラスによります。 しかし、Javaの世界の全てのクラスはjava.lang.Objectクラスのequals()メソッドを継承して持っていますが、equals()メソッドをオーバーライドしていない場合は、同じオブジェクトを参照しているとtrueを返します。つまり、この場合は実質的に「==」と同じ機能になります。 この辺がこんがらがっているのではないでしょうか?

azicyan
質問者

補足

ありがとうございます。 はい。 こんがらがっていました(^_^;) #2の方の補足にも書いたのですが、 この認識で正しいでしょうか?

  • ranx
  • ベストアンサー率24% (357/1463)
回答No.2

equals()は二つのオブジェクトが「同一である」場合にtrueになるのではなく、 二つのオブジェクトが「等しい」場合にtrueになります。 java.lang.Longクラスの場合、二つのオブジェクトの値が同じ場合に 「等しく」なります。 ちなみに、(A == L) はfalse、(c == e) はtrueです。

azicyan
質問者

補足

お世話になっています。 上の例で cとeは等しくないんでしょうか・・・?? あああああ・・・・ 今思い出しました! もしかしてtoStringの値のことを考えればいいでしょうか? Longの7はtoStringも7ですが、オブジェクトの場合はABC@216546見たいに成りますよね・・・? cとeではtoStringの値が異なる、だからequalsはfalse、 AとLではtoStringがおなじ7、だからtrue。 ということであっていますか???

  • symgt
  • ベストアンサー率56% (68/120)
回答No.1

java.lang.Longクラスのequalsメソッドがそのように実装されているからです。 以下、java SDK ドキュメントのLong.equals()の説明です。 「このオブジェクトを指定されたオブジェクトと比較します。 結果が true になるのは、引数が null ではなく、このオブジェクトと同じ Long 値を含む Long オブジェクトである場合だけです。」

azicyan
質問者

補足

ありがとうございます。 今ふと思って、見たところでした。 Longクラスのequalsとobjectのequalsでは違うという認識でよろしいでしょうか?

関連するQ&A