![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
ある本に
ーーーーーーーーーーーーーーーーーーーーー
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()メソッドを記述する必要があるという意味なんでしょうか?
No.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:46No.2
- 回答日時:
> 逆から言えば他の言語の場合は本来クラスの宣言の辺りにでもequals()メソッドを記述する必要があると
> いう意味なんでしょうか?
そんなのは言語仕様によります。
VB.NETやC#ではequals()メソッドが用意されているし、PHPでは
そんな基底クラスという概念すらないし。
比較についてもequals()を使って比較すべき言語仕様のものと、
単純に比較演算子「==」で比較すればいいもの、はたまたはPHPのように
「===」演算子を利用するものなど様々です。
Javaの仕様が絶対でない以上、その言語仕様に合わせて開発を行うべきで、
equals()および基底クラスがないからといって、言語仕様的に不要で
あるにもかかわらず、わざわざそれらを実装すべきではありません。
開発内でそういった命令が絶対的に必要だったとしても、標準で用意されている
様々なクラスにその命令を付与したラッパークラスなどを作るのは明らかに
現実的ではない為、そういう実装が必要だったとしても、自身で作成した
クラスに限定的に、equals()を含むインターフェースを実装するレベルでしょう。
少なくともJavaでは、基底クラスObjectを継承する動きになるわけですから、
ここにあるようなメソッドは全てのクラスが有します。
http://docs.oracle.com/javase/jp/6/api/java/lang …
No.1
- 回答日時:
・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 演算子で、これはオーバーライドできません。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
「ラッパークラス」の存在意義...
-
委譲って何ですか?
-
なぜForm型にキャストするので...
-
インターフェースとトレイトっ...
-
C++ヘッダの肥大化
-
Java難しすぎ
-
JTextFieldの入力制限
-
Java StringBuilderクラスについて
-
Javaのインスタンス化の構文の...
-
javaの「型」がよくわかりません。
-
エクセルVBAで、条件に一致する...
-
インスタンス参照でアクセスで...
-
自作のクラスファイルがインポ...
-
String.containsの反対機能はあ...
-
「タイプ初期化子が例外をスロ...
-
VB.NET getとsetの概念がわかり...
-
ビジュアルC++でボタンの有...
-
変数名の付け方
-
java eclipse 型に解決できません
-
Javaの関数名が長い?
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
インターフェースとトレイトっ...
-
(vba)他のアプリケーションの右...
-
interface,extend,implementの...
-
「ラッパークラス」の存在意義...
-
C# 「データが失なわれる可能性...
-
c++でのヘッダーファイルの循環...
-
「IOException は対応する try ...
-
Javaのインスタンス化の構文の...
-
【C#】クラスのコンストラクタ...
-
「継承されたメソッドの可視性...
-
ASP.NETでの共通コードの書き方...
-
オーバーライドとラッパーの違い
-
委譲って何ですか?
-
デバックログの出し方
-
抽象クラスをJUNITでテストする...
-
VB DLLプロジェクトについて
-
JTextFieldの入力制限
-
ファイルパスが取得出来ない(P...
-
compareToにおける「自然順序付...
-
Javaで下線
おすすめ情報