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の認定試験です)そのほとんどが引っ掛け問題ですので、 きちんと抑えておかないと回答できない、ということによります。
僕も受験しようかと勉強中です... 頑張りましょう
この回答への補足
御礼が遅くなりました。
>LongクラスでもStringクラスでも、equals()やtoString()のメソッドがオーバーライドされているので、java.lang.Objectクラスでの動き(デフォルトと覚えてもいいと思いますが)と別物になっているというわけです。
よくわかりました。
>僕も受験しようかと勉強中です... 頑張りましょう
はい!がんばりましょう!
多分僕のほうが足元にもおよばないでしょうが・・・
お互いがんばって取得いたしましょう!
No.5
- 回答日時:
> Longクラスのequalsとobjectのequalsでは違うという認識でよろしいでしょうか?
実装(equalsメソッドの処理)が違いますから違うという認識で問題ないと思います。
今回の件はクラスの継承やメソッドのオーバーライドについて
理解できていれば難しい問題ではありません。
Javaを勉強する上で基本となるところですのできちんと理解しておきましょう。
この回答への補足
ありがとうございます。
>実装(equalsメソッドの処理)が違いますから違うという認識で問題ないと思います。
一安心です(^_^;)
おそらく、
objectクラスのequalsとLongクラスのequalsの違い
がわかっているかを試す問題だったと思います。
ありがとうございました!
No.4
- 回答日時:
equals()メソッドでどのような評価がされるかは、そのクラスを設計した人が決めるということです。
ABCクラスが自分で作ったクラスで、equals()メソッドをオーバーライドして独自に書いてあれば、その独自の方法で評価されるということになります。もし、独自に書いていないのであれば、java.lang.Objectのequals()メソッドの説明のまま、「==」と同じ評価が行われるということですね。つまり、Longのequals()の場合は、独自の評価方法を持っているということです。
こんな説明でわかりますか...?
toString()メソッドの値が等しいからequals()も等しいとは必ずしも言えませんが、そのようなクラスを作ることは可能です。逆にそうじゃないクラスも作れます。
同じオブジェクトを参照しているかどうか調べる場合は、==を使った方が良いですよ。
この回答への補足
>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を返します。つまり、この場合は実質的に「==」と同じ機能になります。
この辺がこんがらがっているのではないでしょうか?
この回答への補足
ありがとうございます。
はい。
こんがらがっていました(^_^;)
#2の方の補足にも書いたのですが、
この認識で正しいでしょうか?
No.2
- 回答日時:
equals()は二つのオブジェクトが「同一である」場合にtrueになるのではなく、
二つのオブジェクトが「等しい」場合にtrueになります。
java.lang.Longクラスの場合、二つのオブジェクトの値が同じ場合に
「等しく」なります。
ちなみに、(A == L) はfalse、(c == e) はtrueです。
この回答への補足
お世話になっています。
上の例で
cとeは等しくないんでしょうか・・・??
あああああ・・・・
今思い出しました!
もしかしてtoStringの値のことを考えればいいでしょうか?
Longの7はtoStringも7ですが、オブジェクトの場合はABC@216546見たいに成りますよね・・・?
cとeではtoStringの値が異なる、だからequalsはfalse、
AとLではtoStringがおなじ7、だからtrue。
ということであっていますか???
No.1
- 回答日時:
java.lang.Longクラスのequalsメソッドがそのように実装されているからです。
以下、java SDK ドキュメントのLong.equals()の説明です。
「このオブジェクトを指定されたオブジェクトと比較します。
結果が true になるのは、引数が null ではなく、このオブジェクトと同じ Long 値を含む Long オブジェクトである場合だけです。」
この回答への補足
ありがとうございます。
今ふと思って、見たところでした。
Longクラスのequalsとobjectのequalsでは違うという認識でよろしいでしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
c++でのヘッダーファイルの循環...
-
「継承されたメソッドの可視性...
-
マッピングとは?
-
インターフェイスの使い方がわ...
-
インタフェースのstatic変数(Java)
-
vb.net 自作プロパティの削除に...
-
EventListenerの実装について
-
interface,extend,implementの...
-
フレームワークによくあるイン...
-
(vba)他のアプリケーションの右...
-
「タイプ初期化子が例外をスロ...
-
エクセルVBAで、条件に一致する...
-
インスタンス参照でアクセスで...
-
VB.NETでフォーム上にExcelのよ...
-
変数名の付け方
-
配列の重複する値とその個数を...
-
配列のメソッド
-
VB.NET getとsetの概念がわかり...
-
C#でフォームのオブジェクト名...
-
java eclipse 型に解決できません
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
「ラッパークラス」の存在意義...
-
C# 「データが失なわれる可能性...
-
VB DLLプロジェクトについて
-
抽象クラスをJUNITでテストする...
-
「継承されたメソッドの可視性...
-
インターフェースとトレイトっ...
-
c++でのヘッダーファイルの循環...
-
JavaでのAPIの覚え方ってみさな...
-
(vba)他のアプリケーションの右...
-
ASP.NETでの共通コードの書き方...
-
なぜForm型にキャストするので...
-
vb.net 自作プロパティの削除に...
-
【C#】クラスのコンストラクタ...
-
委譲って何ですか?
-
interface,extend,implementの...
-
Javaのインスタンス化の構文の...
-
オーバーライドとラッパーの違い
-
Commons-Discovery.jarとは?
-
JTextFieldの入力制限
-
C#からDLLを呼びたいのですが・...
おすすめ情報