コンポジションとデリゲーションの時に継承を意識したクラス設計〜みたいな話があったかと思うけど、抽象クラスはまさにそういうクラスです。というよりも、文法で継承することを強制しています。抽象クラスは、クラスとしての実装が不完全で、インスタンスも立ち上げられないクラスです。この不完全なクラスに実装された機能を使用する為には、このクラスを継承して、不完全なメソッドをオーバライドして、メソッドの中身を実装してあげないといけません。
- 抽象クラスの決まり
実装のないメソッドを宣言する- クラスをabstractと宣言する
- その他は一般的なクラスと同じ
- 抽象メソッド(宣言のみで実装のないメソッド)がひとつでもあれば、抽象クラスとなる(抽象メソッド自体はなくてもいい)
abstract class AbClass { abstract long calc(long a , long b); //抽象メソッド(宣言だけで実装がない) void disp(String a){ System.out.println(a); } } class ConClass extends AbClass{ @Override long calc(long a , long b) { //オーバーライドして、実装内容を記述するとクラスとして使えるようになる。 long l; l = a * b; return l; } } public class AbMainClass { public static void main(String[] args) { ConClass con = new ConClass(); // AbClass abc = new AbClass(); 抽象クラスでインスタンスを作ろうとしてるので、コンパイルエラーとなる con.disp(Long.toString((con.calc(10, 20)))); } }
ここでは、AbClassをConClassが継承して、実装が不完全だったcalcクラスをオーバーライドして実装しています。(@overrideはアノテーション)
こうすることによって、AbClassの実装をConClassを通して使用することができます。使用するには、ConClassのインスタンスを作り、メソッドを呼ぶだけです。抽象クラスの具体的な利用方法は、別途書きたいと思います。