ある本に
ーーーーーーーーーーーーーーーーーーーーー
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で質問しましょう!
似たような質問が見つかりました
- 数学 数学の質問です。 △ABCにおいて, ∠Aの二等分線が BC と交わる点をRとする。 辺BC, CA 2 2023/07/13 23:58
- Java java 飾子を付けること(public static・・・) ・コンソールへの出力処理はmainメ 2 2022/06/16 19:34
- アイドル・グラビアアイドル 日系CA(キャビンアテンダント)になったらK-POPアイドルと繋がれるか? 1 2022/09/16 17:57
- 数学 0 a b a b 0 A= b 0 c B= b 0 c c a 0 0 c a を使って | a 2 2023/06/08 08:48
- その他(プログラミング・Web制作) Pythonで複数のメソッドをまとめて管理する方法について 1 2023/03/30 00:01
- Java java final 1 2022/06/10 22:49
- 数学 何故ベクトルの和の定義は↑AB+↑BC=↑ACなのですか? 11 2022/05/19 19:03
- その他(ビジネス・キャリア) 俺は 2 2022/05/11 03:26
- 数学 これの変形を教えてください。 det[A B C D] = det [A B C-CA^-1A D- 1 2022/08/28 12:34
- 生物学 鮫や鰐が、女子高生やCAを捕食する際、靴やソックスやストッキングも食べるでしょうか? 1 2022/07/28 05:30
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
「IOException は対応する try ...
-
(vba)他のアプリケーションの右...
-
抽象クラスとインターフェース...
-
VB DLLプロジェクトについて
-
抽象クラスのエラーが出ます
-
デバックログの出し方
-
オブジェクト指向のインターフ...
-
オーバーライドとラッパーの違い
-
JTextFieldの入力制限
-
RPGゲーム オブジェクト指向
-
【C#】クラスのコンストラクタ...
-
equals()メソッドの継承について
-
ASP.NETでの共通コードの書き方...
-
【設計思想の質問】staticメソ...
-
抽象クラスをJUNITでテストする...
-
Daoクラスはまとめるべきですか
-
c++でのヘッダーファイルの循環...
-
VBがオブジェクト指向言語でな...
-
C# 「データが失なわれる可能性...
-
サニタイジングについて
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
interface,extend,implementの...
-
C# 「データが失なわれる可能性...
-
「ラッパークラス」の存在意義...
-
c++でのヘッダーファイルの循環...
-
(vba)他のアプリケーションの右...
-
「継承されたメソッドの可視性...
-
ゲッターを使わないで変数にア...
-
「IOException は対応する try ...
-
JavaでのAPIの覚え方ってみさな...
-
Javaで下線
-
【C#】クラスのコンストラクタ...
-
VB DLLプロジェクトについて
-
Javaのインスタンス化の構文の...
-
委譲って何ですか?
-
ASP.NETでの共通コードの書き方...
-
オーバーライドとラッパーの違い
-
抽象クラスをJUNITでテストする...
-
Commons-Discovery.jarとは?
-
JTextFieldの入力制限
-
setTextについて
おすすめ情報