はじめに
親子クラスとオーバーライドの関係で、勘違いしていたことがあったので、メモ。
多様性
javaには多様性という概念があり、継承関係にあるクラスをざっくり捉えることができる。ということを勉強しました。つまり、子クラスを親クラスとして扱うことができるということです。
たとえば、
| 親クラス | 子クラス |
|---|---|
| int a | |
| int b | |
| method1() | method1() |
| method2() |
上のようににクラス内で定義されている親子クラスがあった場合を考えます。
このとき、子クラス型で生み出された子クラスのインスタンスは int a,int b,method1(),method2()の全てを扱うことができます。
しかし、親クラス型で生み出された子クラスのインスタンス( 親クラス型 A = new 子クラス(); )は親クラスとして捉えられているため、int a,int b,method1()のみしか扱えません。
ここまでは理解できたつもりでいたのですが、一つ勘違いをしていました。
それは、
親クラス型で定義された子クラスのインスタンスAのmethod1()を呼び出すと、子クラス側でオーバーライドされたmethod1()が呼び出される
ということです。
親クラスで定義したからと言って、親クラスのコードだけを見ていてはいけないことになります。
感想
私は、子クラスそれぞれに対してequals()メソッドを定義し、親クラスでもequals()メソッドを定義しなければ使えないと勘違いしていて、かなり無駄な努力をしていることに気づきました。
逆に考えると、一つのインスタンスで、親クラス型として扱うときと子クラス型として扱うときでequals()の定義を変えたい場面や、親クラスが同じで子クラスは違う二つの親クラス型の子クラスインスタンスがequals()でtrueとなる状況をつくりたいときに、困ってしまうかもしれません(そんな場面が訪れることはないかもしれませんが、、)