現在、JavaSilverの勉強をしています。equalsメソッドについて、2点わからない点が出てきたため、お教えいただきたく思います。
#疑問点①
java
1Object a = new Object(); 2Object b = null; 3System.out.println(a.equals(b));
というコードを実行した時、NullPointerExceptionが発生するのではなく、falseが返るのはなぜでしょうか。
#考えたこと
Java equalsでnullまたは空文字を比較するサンプルというサイトに、
a.equals(b)のとき、aがnullの場合は、NullPointerExceptionが発生します。
a.equals(b)のとき、aがnullではなくbがnullの場合は、falseを返します。
Java7で追加されたObjects.equals(a,b)は、a,bがnullでもNullPointerExceptionは発生しません。
と書かれていました。
公式ドキュメントのequalsメソッドの項目の解説は以下の通りでした。
ここからは、nullを参照した時の挙動については触れられていないように思います。
Java equalsでnullまたは空文字を比較するサンプルというサイトで書かれていたことは、実際その通りだと思うのですが、これを確認できる公式ドキュメントなどがあればお教えいただきたく思います。
#疑問点②
Java Silver黒本の解説では
equalsメソッドはObjectクラスに定義されているメソッドで、全てのクラスが持っています。しかし、同値性の確認方法は各クラスで異なるため、equalsメソッドはオーバーライドして使うことを前提としています(3章10問)
と書かれていました。
しかし、別の問題の解説では
java.lang.Objectクラスに定義されているメソッドをインターフェースでデフォルトメソッドとしてオーバーライドすると、コンパイルエラーとなります(7章5問)
と書かれていました。
「equalsメソッドはオーバーライドして使うことを前提としています」というのは「java.lang.Objectクラスに定義されているメソッドをインターフェースでデフォルトメソッドとしてオーバーライドすると、コンパイルエラーとなります」と矛盾するように思うのですが、どう理解すれば良いでしょうか。
java.lang.Objectクラスに定義されているメソッドでも、インターフェースではなくクラスでオーバーライドする分には問題ないということでしょうか。
よろしくお願い致します。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/10/03 14:57