質問: new Sample();の時を表しているのでしょうか そして、12~15行目のifのブロック{}では何をしているのでしょうか。 よろしくお願いします。
回答: equalsメソッドについてはargiusさんがおっしゃってる通りですので 自分は、Mainクラスの説明を。(長文ごめんなさい。) > > Sample a = new Sample(10, "a"); > > Sample b = new Sample(10, "b"); > > > これによって、Sample型の`a`という名前のハコと`b`という名前のハコが用意され、 ぞれぞれの引数によって、フィールドに値が設定されます。 (newされれば、それぞれSampleクラスのメンバが準備される辺りは大丈夫ですよね?) ``` Sample型`a`のハコの中身 ├ int num ⇒ 10 └ String name ⇒ "a" Sample型`b`のハコの中身 ├ int num ⇒ 10 └ String name ⇒ "b" ``` で、このハコ同士をequalsメソッドで比較しています。 > > a.equals(b); > > > これで`a`のハコにあるequalsメソッドを使って、引数bを評価します。 Sampleクラスのequalsメソッドでは2つのif文条件がありました。 1. 引数`obj`がnullかどうか 2. 引数`obj`がSampleクラスのインスタンスかどうか 1.についてですが、`b`はnewされてインスタンスが用意されていますので、 nullではない、つまり 評価は`false`になります。 続いて2.についてですが、`b`の型はSample型ですので、評価は`true`になり、if文の中に処理が進みます。 13行目の > > Sample s = (Sample) obj; > > > では、引数でObject型とされていたので、改めてオブジェクトをSample型にキャストして、Sample型の変数`s`に格納しています。 キャストについてはコチラを参照してください。 これにより、`s`と`b`は同じものを参照することになります。 そして、 > > s.num == this.num; > > > ハコ`s`のフィールドnum(=ハコ`b`のフィールドnum) の値が、ハコ`a`のフィールドnumと同じかどうか、比較しています。 ↑に書いた図にもあるように、`a`のnumにも`b`のnumにもそれぞれ 10 という数値が格納されていますので、 この比較の結果は `true`となり、メソッド呼び出し元へreturnされます。 あとは、その他の疑問点についてです。 1点目。 > > ・12行目のifはelse ifのことか? > > > ちがいます。 ``` if(条件A){~} if(条件B){~} ``` は、条件Aも条件Bも結果がどうであれ実行されますが、 ``` if(条件A){~} else if(条件B){~} ``` とelseでつなげてしまうと、条件Aの結果がfalseの場合は条件Bが評価されますが、 条件Aの結果がtrueの場合は条件Bは評価されずに処理が先に行ってしまいます。 ま、この場合結果として同じfalseが返るのですが、これを混同させてしまうとあとで痛い目にあいます。 2点目。 > > そして、Sampleクラス9行目の if(obj == num)は引数が何も参照しない、 > > つまり、 Sample b = new Sample(10, "b");が > > Sample b = new Sample();の時を表しているのでしょうか > > > これも違いますね。 何も参照しないのは、nullです。 Sample b = new Sample(10, "b"); でも Sample b = new Sample(); でも、インスタンスは作成され、nullではなくなります。 あと、余談ですが、このSampleクラスには、引数なしコンストラクタは定義されていませんので、 `Sample b = new Sample();` と記載するとコンパイルエラーになります。