質問編集履歴

2

誤字

2020/10/01 14:25

投稿

moritat-222
moritat-222

スコア19

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

1

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

2020/10/01 14:25

投稿

moritat-222
moritat-222

スコア19

test CHANGED
File without changes
test CHANGED
@@ -3,6 +3,10 @@
3
3
 
4
4
 
5
5
  ```java
6
+
7
+ package model;
8
+
9
+
6
10
 
7
11
  public class Sample{
8
12
 
@@ -34,13 +38,79 @@
34
38
 
35
39
 
36
40
 
37
- 上記のコードは、equalsメソッドをオーバーライドして、インスタンスどうしの同一性を比較するものにされていると解説されていました。
41
+ ```java
38
42
 
39
- しかし、このコードをみる限り、それぞれのインスタンスにあるnumフィールドの値だけを比較しており、numの値が一致すれば同値ともなすもののように思えます。
43
+ import model.*;
40
44
 
41
45
 
42
46
 
47
+ public class MyApp {
48
+
49
+ public static void main(String[] args){
50
+
51
+ Object a = new Sample(10);
52
+
53
+ Object b = new Sample(10);
54
+
55
+ System.out.println(a.equals(b));
56
+
57
+ }
58
+
59
+ }
60
+
61
+
62
+
63
+ ```
64
+
65
+
66
+
67
+ このプログラムでMyAppのmainメソッドを実行すると「false」と表示される理由についてお伺いしたいです。
68
+
69
+
70
+
71
+ Sampleクラスに定義されているequals()メソッドでは、「this.num == obj.num」を比較しているため、
72
+
73
+ numフィールドが10のインスタンスaとnumフィールドが10のインスタンスbを比較すると「true」が返ると思うのですが、
74
+
75
+ 実際は「false」が返ってきます。
76
+
77
+
78
+
79
+ #黒本の解説(引用)
80
+
81
+
82
+
83
+ > インスタンスの同値性を確認するには、equalsメソッドを使うことを学びました。equalsメソッドはObjectクラスに定義されている全てのクラスが持っています。しかし、同値性の確認方法は各クラスによって異なるため、equalsメソッドはオーバーライドして使うことを前提としています。Objectクラスのequalsメソッドの定義は次の通りです。
84
+
85
+
86
+
87
+ ```java
88
+
89
+ public boolean equals(Object obj){
90
+
91
+ return (this == obj);
92
+
93
+ }
94
+
95
+ ```
96
+
97
+
98
+
99
+ > 設問のSampleクラスに定義されているequalsメソッドは、引数にObject型ではなくSample型を受け取ります。これはメソッドのオーバーロードです。
100
+
101
+
102
+
103
+ > そのため、mainメソッドでObject型の引数を渡してequalsメソッドを呼び出した時は、Objectクラスに定義されたequalsメソッドが実行されます。
104
+
105
+
106
+
107
+ > Objectクラスに定義されているequalsメソッドは、前述の定義からもわかる通り、**同一性の判定をします** **(※ここが一番理解できません)**
108
+
109
+
110
+
111
+
112
+
43
- なぜれが同一か(同じインスタンスか)を比較するものとなるのでしょうか
113
+ なぜObjectクラスに定義さているequalsメソッドが同一か(同じインスタンスか)を比較するものとなるのでしょうか
44
114
 
45
115
 
46
116
 
@@ -52,33 +122,7 @@
52
122
 
53
123
 
54
124
 
55
- ただ、黒本の解説に
56
-
57
-
58
-
59
- > Objectクラスのequalsメソッドの定義次の通り
125
+ 上記の解説の通り、Objectクラスのequalsメソッドは同一性を比較する物あるとしても、
60
-
61
-
62
-
63
- ```java
64
-
65
-  public boolean equals(Object obj){
66
-
67
- return (this == obj);
68
-
69
- }
70
-
71
-
72
-
73
- ```
74
-
75
-
76
-
77
- と書かれていたため、equalsメソッドがObject型の引数を持つ時だけ、equalsメソッドは同値性ではなく同一性を比較するものに変わる、ということなのでしょうか?
78
-
79
-
80
-
81
- しかし、そう考えたとしても、
82
126
 
83
127
 
84
128
 
@@ -92,6 +136,12 @@
92
136
 
93
137
 
94
138
 
139
+ しかし、本当にnumフィールドだけを比較しているならばtrueを返すはずのコードが、実際はfalseを返しているので、黒本の解説が間違っている訳ではないように思います。
95
140
 
96
141
 
142
+
143
+
144
+
145
+ なぜ、上記のプログラムでMyAppのmainメソッドを実行すると「false」と表示されるのでしょうか。
146
+
97
147
  よろしくお願いいたします。