質問するログイン新規登録

質問編集履歴

2

誤字

2020/10/01 14:25

投稿

moritat-222
moritat-222

スコア19

title CHANGED
@@ -1,1 +1,1 @@
1
- 【Java Silver】(黒本の問題)equalsメソッドをオーバーライドし同一性を比較させるコードについて
1
+ 【Java Silver】(黒本の問題)equalsメソッドをオーバーロードし同一性を比較させるコードについて
body CHANGED
File without changes

1

質問の意図が伝わりやすくなるよう修正

2020/10/01 14:25

投稿

moritat-222
moritat-222

スコア19

title CHANGED
File without changes
body CHANGED
@@ -1,6 +1,8 @@
1
1
  #Java Silver黒本、第三章10問に関する質問です。
2
2
 
3
3
  ```java
4
+ package model;
5
+
4
6
  public class Sample{
5
7
  private int num;
6
8
  public Sample(int num){
@@ -16,34 +18,57 @@
16
18
 
17
19
  ```
18
20
 
21
+ ```java
19
- 上記のコードは、equalsメソッドをオーバーライドして、インスタンスどうしの同一性を比較するものにされていると解説されていました。
22
+ import model.*;
20
- しかし、このコードをみる限り、それぞれのインスタンスにあるnumフィールドの値だけを比較しており、numの値が一致すれば同値ともなすもののように思えます。
21
23
 
24
+ public class MyApp {
25
+ public static void main(String[] args){
26
+ Object a = new Sample(10);
27
+ Object b = new Sample(10);
22
- なぜこれが同一か(同じインスタンスか)を比較するものとなるのでしょうか
28
+ System.out.println(a.equals(b));
29
+ }
30
+ }
23
31
 
24
- #考えたこと
32
+ ```
25
33
 
26
- 原則、「==」が同一性比較するもので、equals()が同値性を比較すものです。
34
+ このプログラムでMyAppのmainメソッド実行するfalseと表示され理由についてお伺いしたいです。
27
35
 
36
+ Sampleクラスに定義されているequals()メソッドでは、「this.num == obj.num」を比較しているため、
37
+ numフィールドが10のインスタンスaとnumフィールドが10のインスタンスbを比較すると「true」が返ると思うのですが、
28
- ただ、黒本の解説に
38
+ 実際は「false」が返ってきます。
29
39
 
30
- > Objectクラスequalsメソッドの定義は次の通りです
40
+ #黒本解説(引用)
31
41
 
42
+ > インスタンスの同値性を確認するには、equalsメソッドを使うことを学びました。equalsメソッドはObjectクラスに定義されている全てのクラスが持っています。しかし、同値性の確認方法は各クラスによって異なるため、equalsメソッドはオーバーライドして使うことを前提としています。Objectクラスのequalsメソッドの定義は次の通りです。
43
+
32
44
  ```java
33
-  public boolean equals(Object obj){
45
+ public boolean equals(Object obj){
34
- return (this == obj);
46
+ return (this == obj);
35
- }
47
+ }
36
-
37
48
  ```
38
49
 
39
- と書かれていたため、equalsメソッドがObject型の引数を持つ時だけ、equalsメソッドは同値性ではなく同一性比較るものに変わる、というとなのでしょうか?
50
+ > 設問のSampleクラスに定義されていequalsメソッドは、引数にObject型ではなくSample型受け取りまれはメソッドオーバーロードす。
40
51
 
41
- しかし、う考えして
52
+ > め、mainメソッドでObject型の引数を渡してequalsメソッドを呼び出した時はObjectクラスに定義されたequalsメソッドが実行されます。
42
53
 
54
+ > Objectクラスに定義されているequalsメソッドは、前述の定義からもわかる通り、**同一性の判定をします** **(※ここが一番理解できません)**
55
+
56
+
57
+ なぜObjectクラスに定義されているequalsメソッドが同一か(同じインスタンスか)を比較するものとなるのでしょうか
58
+
59
+ #考えたこと
60
+
61
+ 原則、「==」が同一性を比較するもので、「equals()」が同値性を比較するものです。
62
+
63
+ 上記の解説の通り、Objectクラスのequalsメソッドは同一性を比較する物であるとしても、
64
+
43
65
  ```java
44
66
  return this.num == obj.num
45
67
  ```
46
68
  というコードはnumフィールドの値のみを比較しているように思えるため、あまりしっくりきません。
47
69
 
70
+ しかし、本当にnumフィールドだけを比較しているならばtrueを返すはずのコードが、実際はfalseを返しているので、黒本の解説が間違っている訳ではないように思います。
48
71
 
72
+
73
+ なぜ、上記のプログラムでMyAppのmainメソッドを実行すると「false」と表示されるのでしょうか。
49
74
  よろしくお願いいたします。