#Java Silver黒本、第三章10問に関する質問です。
java
1package model; 2 3public class Sample{ 4 private int num; 5 public Sample(int num){ 6 this.num = num; 7 } 8 public boolean equals(Sample obj){ 9 if(obj==null){ 10 return false; 11 } 12 return this.num == obj.num 13 } 14} 15
java
1import model.*; 2 3public class MyApp { 4 public static void main(String[] args){ 5 Object a = new Sample(10); 6 Object b = new Sample(10); 7 System.out.println(a.equals(b)); 8 } 9} 10
このプログラムでMyAppのmainメソッドを実行すると「false」と表示される理由についてお伺いしたいです。
Sampleクラスに定義されているequals()メソッドでは、「this.num == obj.num」を比較しているため、
numフィールドが10のインスタンスaとnumフィールドが10のインスタンスbを比較すると「true」が返ると思うのですが、
実際は「false」が返ってきます。
#黒本の解説(引用)
インスタンスの同値性を確認するには、equalsメソッドを使うことを学びました。equalsメソッドはObjectクラスに定義されている全てのクラスが持っています。しかし、同値性の確認方法は各クラスによって異なるため、equalsメソッドはオーバーライドして使うことを前提としています。Objectクラスのequalsメソッドの定義は次の通りです。
java
1public boolean equals(Object obj){ 2 return (this == obj); 3}
設問のSampleクラスに定義されているequalsメソッドは、引数にObject型ではなくSample型を受け取ります。これはメソッドのオーバーロードです。
そのため、mainメソッドでObject型の引数を渡してequalsメソッドを呼び出した時は、Objectクラスに定義されたequalsメソッドが実行されます。
Objectクラスに定義されているequalsメソッドは、前述の定義からもわかる通り、同一性の判定をします (※ここが一番理解できません)
なぜObjectクラスに定義されているequalsメソッドが同一か(同じインスタンスか)を比較するものとなるのでしょうか
#考えたこと
原則、「==」が同一性を比較するもので、「equals()」が同値性を比較するものです。
上記の解説の通り、Objectクラスのequalsメソッドは同一性を比較する物であるとしても、
java
1 return this.num == obj.num
というコードはnumフィールドの値のみを比較しているように思えるため、あまりしっくりきません。
しかし、本当にnumフィールドだけを比較しているならばtrueを返すはずのコードが、実際はfalseを返しているので、黒本の解説が間違っている訳ではないように思います。
なぜ、上記のプログラムでMyAppのmainメソッドを実行すると「false」と表示されるのでしょうか。
よろしくお願いいたします。

回答2件
あなたの回答
tips
プレビュー