progateでJavaを習得してみたpart5
継承
オブジェクト指向においては、あるクラスの内容を他のクラスが引き継ぐことができます。
・メリット
①保守性(修正・改善のしやすさ)を上げることができる。
②無駄な記述を減らすことができる。
例えば、CarクラスとBicycleクラスの二つのクラスにおいて同じインスタンスを使用している場合、そのインスタンス定義部分を別の乗り物クラスなどの名称でクラスを用意し記述することが良しとされます。
継承されるクラスのことを「スーパークラス」、引き継いで付け加えたりするクラスのことを「サブクラス」と呼びます。
サブクラスにおいて以下のような記述をすることでスーパークラスからの継承を実現できます。
class サブクラス名 extends スーパークラス名 {
}
・スーパークラスのコンストラクタ呼び出し
サブクラスでコンストラクタを定義する際にはルールがあります。「コンストラクタの定義の先頭でスーパークラスのコンストラクタを呼びだす」必要があります。
以下のように「super();」でコンストラクタを呼び出します。
class Car extends Vehicle {
Car(String name, String color) {
super(name, color);
System.out.println(aaa);
}
}
ここでは、サブクラスのコンストラクタ内で引数をスーパークラスのコンストラクタに引き渡しています。
・protected
privateの代わりにprotectedを用いると、クラス内とサブクラス内からのみにアクセスを制限するフィールドを作ることができます。
抽象メソッド
どのサブクラスにおいても同じ名称のメソッドを使う場合、いちいち各クラスごとに定義するのは面倒なことです。
そのため、スーパークラスにおいて処理が未定のメソッドを定義する方法があります。下記の通りabstractをつけることで抽象メソッドというメソッドを定義することができます。
・メリット
必ずサブクラスにつき一つ使わせたいメソッドを定義するよう矯正できます。抽象メソッドはサブクラスにて必ずオーバーライドしなければエラーになります。
抽象クラス
抽象メソッドを一つでも持つクラスを抽象クラスと呼びます。
未完成のクラスと認識されるため、抽象クラスにおいてはインスタンスは生成できません。
クラス型のフィールド
インスタンスフィールドにてクラス型の変数を定義することでフィールドに他のクラスをインスタンスとして持つことができます。
例)Personクラスがあり、車の所有者としてインスタンスを使用する前提
private String color;
private Person owner;
ここではPerson型のownerフィールドを追加しました。
多態性
サブクラスのインスタンスをスーパークラスのクラス型変数に代入することができます。これを多態性と呼びます。