- ベストアンサー
equals()メソッドの継承について
- equals()メソッドを記述しなくても、JavaのクラスはObjectクラスのメンバを継承している
- 他の言語ではクラス宣言の際にequals()メソッドを記述する必要がある
- Carクラスのインスタンス同士をequals()メソッドで比較できる
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
Javaの場合、 http://docs.oracle.com/javase/jp/6/api/java/lang/Object.html >すべてのクラスは、スーパークラスとして Object を持ちます。 とあり、Objectクラスに定義されたメソッドを利用できるのは#2に回答者さんの回答の通りです。 この場合、 java.lang.Object └ Car という関係になっています。 --- Stringクラスを見ます。 java.lang.Object └ java.lang.String 上記の関係になっています。 http://docjar.com/html/api/java/lang/String.java.html 1013行目~がequalsメソッドです。継承されており、オブジェクトではなく文字を比較してStringクラス独自の比較を行うように実装されております。StringクラスにおいてはObjectクラスとは異なる処理が実行されることになります。 よって、 「どのように定義されているか言語ごとに確認する」 「オブジェクト指向言語においては、クラスごとに確認する」 ことが必要です。
その他の回答 (2)
- めとろいと(@naktak)
- ベストアンサー率36% (785/2139)
> 逆から言えば他の言語の場合は本来クラスの宣言の辺りにでもequals()メソッドを記述する必要があると > いう意味なんでしょうか? そんなのは言語仕様によります。 VB.NETやC#ではequals()メソッドが用意されているし、PHPでは そんな基底クラスという概念すらないし。 比較についてもequals()を使って比較すべき言語仕様のものと、 単純に比較演算子「==」で比較すればいいもの、はたまたはPHPのように 「===」演算子を利用するものなど様々です。 Javaの仕様が絶対でない以上、その言語仕様に合わせて開発を行うべきで、 equals()および基底クラスがないからといって、言語仕様的に不要で あるにもかかわらず、わざわざそれらを実装すべきではありません。 開発内でそういった命令が絶対的に必要だったとしても、標準で用意されている 様々なクラスにその命令を付与したラッパークラスなどを作るのは明らかに 現実的ではない為、そういう実装が必要だったとしても、自身で作成した クラスに限定的に、equals()を含むインターフェースを実装するレベルでしょう。 少なくともJavaでは、基底クラスObjectを継承する動きになるわけですから、 ここにあるようなメソッドは全てのクラスが有します。 http://docs.oracle.com/javase/jp/6/api/java/lang/Object.html
お礼
回答有難うございます。
- kmee
- ベストアンサー率55% (1857/3366)
・JavaのObjectクラスに相当する、「全てのオジェクトの親」クラスが存在しない言語がある。 この場合「必ず継承されているメソッド」は存在しない。 ・JavaのObjectクラスに相当する「全てのオジェクトの親」クラスに、equalsメソッドというものが用意されていない言語もある。 ただし、同等のメソッド、あるいは演算子が用意されているのが普通。 ・Javaでも、Object.equalsを継承したequalsメソッドを使うことが不適切な場合もある 「使用できる」と「使用した結果が期待通りになる」 は、別の話 ということで、言語の問題ではなく、使い方や機能の問題です。 Object.equalsメソッドは、下記の説明によれば、 == 演算子と等価です。 http://docs.oracle.com/javase/jp/7/api/java/lang/Object.html#equals%28java.lang.Object%29 例にあるCarクラスですが Car carA = new Car(); Car carB = new Car(); Car carC = new Car(); carA.num=1; carB.num=1; carC.num=2; 等とした場合に、 「numが等しかったら『同じ』である」としたい(この例では、carAとcarBは「同じ」、carCは「違う」)場合、Objectから継承したequalsメソッドでは carA.equals(carB) → carA == carB → false です。(==演算子の判定基準は理解してますね?) ですが、期待しているのは carA.equals(carB) → carA.num == carB.num → true です。こういう場合に、equalsメソッドをオーバーライドして、Carクラス専用の「同じ」を判定させます。 C++には「全ての親クラス」がありません。同じようなことをしたければ、「全ての親クラス」を自分で定義する必要があります。 Pythonのobjectには、equalsメソッドはありません。代わりに、__eq__メソッドとして定義すると、a == b といった==演算子で比較できます。他の比較演算子も同様です。 これらは、そのクラスの「比較方法」に合せてオーバーライドすることが推奨されます。 Javaの==に相当する「同一オブジェクトか?」を比較するのは is 演算子で、これはオーバーライドできません。
お礼
丁寧に長文解説有難うございます。
お礼
回答有難うございます。
補足
すべてのクラスは、自分で定義しようが元々あるもの(=クラスライブラリ?)を使おうが、import java.langではなく、import java. ioを使おうが、スーパークラスは必然的に object になるという意味ですか? 変な事を言っていたらすいません。