SyuchiNikuRingの備忘録

お勉強したことをまとめておく場所。中の人の理解や感覚で書いているから不正確なことも多いかも。

Java入門season8~クラス継承~

やっほー。今回はクラス継承についてまとめます。

これなくしてJavaは語れませんね。

 

クラス継承をすれば、より抽象的なクラスを作り、そのクラスを継承してカスタマイズするというコードの書き方ができるようになります。つまり、重複を少なくできるということです。

継承されるクラスを「スーパークラス」、継承してカスタマイズしたクラスを「サブクラス」といいます。

表記の仕方は、class (サブクラス) extends (スーパークラス)です。

mainメソッド内での呼び出し方はいつもと同じです。

(クラス名) (インスタンス) = new (クラス名);

(インスタンス).set...で具体的な値をセットできます。

 

サブクラスでカスタマイズしたいときは、追加したいメソッドを書き足すだけです。

mainで呼び出すときは、(インスタンス).(メソッド)で呼び出します。

 

と、ここまで基本的なことを書きましたが、一番重要なことは「継承は一方通行」だということです。

スーパークラスからサブクラスへの継承はできても、サブクラスからスーパークラスへの継承はできません。

これを利用してメソッドのオーバーライドを行います。

先ほど、クラス継承をしてカスタマイズ可能であると書きましたが、メソッドのオーバーライドがまさにそのことです。サブクラスでスーパークラスと同名のメソッドを定義するとサブクラス側のメソッドが優先されます。上書きされるということです。そしてスーパークラスのメソッドをサブクラス側で呼び出す場合には、super.メソッド()とします。これでスーパークラス側のメソッドをサブクラス側で呼び出せます。

コンストラクタに関してですが、サブクラスでコンストラクタを定義するときは、まず先頭でスーパークラスのコンストラクタを呼び出さなければならないというルールがあります。super()で呼び出せます。

定義の手順についてですが、スーパークラスでコンストラクタを定義します。次にサブクラス内でコンストラクタを定義します。そしてそのコンストラクタ内でsuper(仮引数)とします。この仮引数がスーパークラスのコンストラクタの仮引数に引き渡されます。

 

クラス継承で問題になるのはフィールドのアクセス制限です。なんでもかんでもset/getを使うのではなく、protectedを使い手もあります。protectedはクラス内とサブクラスからのみアクセスが許されるものです。privateだとそのクラス内のみアクセス可能でありサブクラスからのアクセスができません。だからといって何でもかんでもpublicを使うのも考えものです。カプセル化の意味もなくなってしまうからです。

 

クラス継承では各クラスの最大公約数的なメソッドを新たにスーパークラスとして定義し、各クラスはそのスーパークラスを継承して必要に応じてカスタマイズします。ここまではスーパークラス内にあるメソッドは全て具体的な処理内容を伴っていました。しかし、実際にはメソッドは同じでもその処理内容は異なる場合も考えられます。例えば、movementというメソッドがあっても、人間と魚、蛇ではその中身は異なります。

このとき、中身が異なるからといって全てのクラスにmovementというメソッドを書くのは重複になり保守性の低下につながります。そこで、処理内容は書かずにメソッドだけスーパークラスに定義しておく手段が欲しくなります。ここで登場するのが抽象メソッドabstractです。publicの前に書きます。一つでも抽象メソッドがあるクラスは抽象クラスといい、クラス名の前にabstractを付けます。abstractはオーバーライドを強制します。上書きされなければエラーになります。また、抽象クラスからはインスタンスを生成することはできません。

 

今回はここまで。