電子書籍の厳選無料作品が豊富!

ある本に

ーーーーーーーーーーーーーーーーーーーーー

class Car
{
protected int num;
protected double gas;

public Car()
{
num = 0;
gas = 0.0;
System.out.println("車を作成しました。");
}
}

class Sample8
{
public static void main(String[] args)
{
Car car1 = new Car();
Car car2 = new Car();

Car car3;
car3 = car1;

boolean bl1 = car1.equals(car2);
boolean bl2 = car1.equals(car3);

System.out.println("car1とcar2が同じか調べたところ" + bl1 + "でした。");
System.out.println("car1とcar3が同じか調べたところ" + bl2 + "でした。");
}
}

JavaのクラスはすべてObjectクラスのメンバを継承していますので、equals()メソッドを記述しなくても、このメソッドを呼び出すことが出来るわけです。

-----------------------------------------

JavaのクラスはすべてObjectクラスのメンバを継承していますので、equals()メソッドを記述しなくても、このメソッドを呼び出すことが出来る   

についてですが、
逆から言えば他の言語の場合は本来クラスの宣言の辺りにでもequals()メソッドを記述する必要があるという意味なんでしょうか?

A 回答 (3件)

Javaの場合、


http://docs.oracle.com/javase/jp/6/api/java/lang …
>すべてのクラスは、スーパークラスとして Object を持ちます。

とあり、Objectクラスに定義されたメソッドを利用できるのは#2に回答者さんの回答の通りです。
この場合、
java.lang.Object
└ Car
という関係になっています。

---
Stringクラスを見ます。
java.lang.Object
└ java.lang.String
上記の関係になっています。

http://docjar.com/html/api/java/lang/String.java …
1013行目~がequalsメソッドです。継承されており、オブジェクトではなく文字を比較してStringクラス独自の比較を行うように実装されております。StringクラスにおいてはObjectクラスとは異なる処理が実行されることになります。

よって、

「どのように定義されているか言語ごとに確認する」

「オブジェクト指向言語においては、クラスごとに確認する」

ことが必要です。

この回答への補足

すべてのクラスは、自分で定義しようが元々あるもの(=クラスライブラリ?)を使おうが、import java.langではなく、import java. ioを使おうが、スーパークラスは必然的に object になるという意味ですか? 変な事を言っていたらすいません。

補足日時:2013/08/27 23:46
    • good
    • 0
この回答へのお礼

回答有難うございます。

お礼日時:2013/08/27 23:43

> 逆から言えば他の言語の場合は本来クラスの宣言の辺りにでもequals()メソッドを記述する必要があると


> いう意味なんでしょうか?

そんなのは言語仕様によります。
VB.NETやC#ではequals()メソッドが用意されているし、PHPでは
そんな基底クラスという概念すらないし。

比較についてもequals()を使って比較すべき言語仕様のものと、
単純に比較演算子「==」で比較すればいいもの、はたまたはPHPのように
「===」演算子を利用するものなど様々です。
Javaの仕様が絶対でない以上、その言語仕様に合わせて開発を行うべきで、
equals()および基底クラスがないからといって、言語仕様的に不要で
あるにもかかわらず、わざわざそれらを実装すべきではありません。

開発内でそういった命令が絶対的に必要だったとしても、標準で用意されている
様々なクラスにその命令を付与したラッパークラスなどを作るのは明らかに
現実的ではない為、そういう実装が必要だったとしても、自身で作成した
クラスに限定的に、equals()を含むインターフェースを実装するレベルでしょう。

少なくともJavaでは、基底クラスObjectを継承する動きになるわけですから、
ここにあるようなメソッドは全てのクラスが有します。
http://docs.oracle.com/javase/jp/6/api/java/lang …
    • good
    • 0
この回答へのお礼

回答有難うございます。

お礼日時:2013/08/27 23:42

・JavaのObjectクラスに相当する、「全てのオジェクトの親」クラスが存在しない言語がある。


 この場合「必ず継承されているメソッド」は存在しない。
・JavaのObjectクラスに相当する「全てのオジェクトの親」クラスに、equalsメソッドというものが用意されていない言語もある。
 ただし、同等のメソッド、あるいは演算子が用意されているのが普通。
・Javaでも、Object.equalsを継承したequalsメソッドを使うことが不適切な場合もある
 「使用できる」と「使用した結果が期待通りになる」 は、別の話

ということで、言語の問題ではなく、使い方や機能の問題です。


Object.equalsメソッドは、下記の説明によれば、 == 演算子と等価です。
http://docs.oracle.com/javase/jp/7/api/java/lang …

例にある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 演算子で、これはオーバーライドできません。
    • good
    • 0
この回答へのお礼

丁寧に長文解説有難うございます。

お礼日時:2013/08/27 23:37

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!