Rso's Jotter

日々の開発の知見のメモやその他雑記

Objectの持つメソッドに関するメモ

今日ちょっと話題に上がったけど即答できなかったのでメモ

Objectの持つequalsメソッドの挙動

equalsメソッドをオーバーライドしていないクラスから
equalsメソッドを呼ぶとどうなるかという話。
これは単純に比較するオブジェクト(インスタンス)が持つオブジェクトID(正式な名前が分からん)が一致すればtrueを返す。
これは==による比較演算子を用いたときと同じ。


Stringなどのクラスでは==とequalsの挙動が違うのはequalsがStringクラスでオーバーライドされているから。
ちなみにequalsを自分でオーバーライドするときは、equalsでの比較結果がtrueになったもの同士は必ず同じ値を返すhashcode関数をオーバーライドしなければならない。

cloneメソッドの挙動

Objectクラスの持つcloneメソッドを呼ぶとどうなるかという話。
これは実はObjectはclonableを実装していないので、CloneNotSupportedExceptionを呼ぶという落ちになる。
Objectが持つcloneメソッドはprotectedなので直接は呼べない。
cloneメソッドを呼ぶクラスがCloneableインターフェースを実装した状態でsuper.cloneを呼べばいれば全てのフィールドの参照がコピーされる。
Cloneableを実装していなければCloneNotSupportExceptionが投げられる。
自分で定義したクラスにcloneメソッドを実装するとき、
@overrideアノテーションが付けられるのでつい何かもうちょっと
cloneぽいことをしてくれてるのかと思ったらそうでもない。