抽象クラスと抽象メソッドとは
抽象クラスはインスタンス化できないクラスのこと。何らかのクラスの基底クラスになるのでクラスの雛形の役割を持つ。メソッドにabstract修飾子をつけると抽象メソッドになる。抽象メソッドは具体的な処理を持たないメソッド。
抽象クラスを継承したクラスは抽象メソッドをオーバーライドしなければならない。
具体的な処理は継承先のクラスで実装する。
抽象クラスをインスタンス化することはできない。
abstract class Animal { //抽象クラス
abstract void cry(String voice); //抽象メソッド
}
class Cat extends Animal { //継承
@Override
public void cry(String voice) { //オーバーライド
System.out.println(voice + "と鳴きます");
}
}
メリット
抽象クラスは複数のクラスの基底クラスになる。そのクラス間でクラスの作りを統一できるので、クラスの設計図のようなものではないかと思っている。
[メリット]
・共通の処理を書くことができる
・必ずオーバーライドしないといけないので、各クラスでメソッド名が統一でき、ロジックが共通化できる
・必ずオーバーライドしないといけないので、開発者の実装忘れを防ぐことができる
(例)
動物が鳴くというcryメソッドを共通の処理として抽象クラスに抽象メソッドとして記述。
CatクラスとDogクラスでcryメソッドをオーバーライドするので、似たような処理を同じメソッド名で実装できている。
このようにクラスは違うけど、やることの方向性が似ていれば、抽象クラスを使ってクラスの作りを統一化でき、「お互い似たような処理をしていますよ」と開発者に知らせることができる。
abstract class Animal { //抽象クラス
abstract void cry(String voice); //抽象メソッド
}
class Cat extends Animal { //継承
@Override
public void cry(String voice) { //voiceの中身が「にゃー」
System.out.println(voice + "と鳴きます"); //にゃーと鳴きます
}
}
class Dog extends Animal { //継承
@Override
public void cry(String voice) { //voiceの中身が「わん」
String voice_2 = "ワン" + voice
System.out.println(voice_2 + "と鳴きます"); //ワンわんと鳴きます
}
}
抽象メソッド以外にも、そのクラス独自のメソッドを実装しても良い。
インタフェースとの違い
同じようなものにインタフェースというのがある。インタフェースも抽象メソッドを持ちオーバーライドしなければならない。
抽象クラス | インタフェース |
---|---|
extendsでクラスへ継承する | implementsでクラスに実装する |
コンストラクタ、フィールドを持てる | コンストラクタ、フィールドを持てない |
多重継承ができる | 多重継承ができない(インターフェース同士では可能) |
終わり
抽象クラスを実装することによって、実装ルールを定め書き方を統一できるということですね。
抽象クラスを使えば、担当者ごとに書き方が異なり、同じような処理なのに書き方が全く違うというのを防ぐことができます。
以上です