|
抽象クラス、Javaにおいてオブジェクト指向プログラミングを行うために必要な概念の一つです。基本的には前回のインターフェースと同じです。インターフェースと違う点は、抽象クラスはコンストラクタやabstractでないメソッド、staticでないフィールドを持つことができます。つまり通常のクラスで抽象メソッドの宣言ができるということです。その結果、ロジックを実装していないメソッド(抽象メソッド)が存在する可能性があるのでnewすることができません。以下にクラス、アブストラクトクラス、インターフェースの違いを示します。
|
例:クラス形態の比較表
|
| |
クラス
|
抽象クラス
|
インターフェース
|
| インスタンスの生成(new) |
○
|
×
|
×
|
|
コンストラクタの所有
|
○
|
○
|
×
|
| 抽象メソッドの所有 |
×
|
○
|
○
|
| 型として扱えるか |
○
|
○
|
○
|
|
| *注意して欲しいのは抽象クラスはnewすることができなからといって、コンストラクタを所有できないわけではありません。 |
ではいったい抽象クラスというのはどのような側面で利用するのでしょうか?例えば車の生産を考えてみましょう。自動車メーカーのトヨタは新らしい車を発売しようとしています。この車は20パターンの外部塗装から好きな色が選べます。もちろんエンジンや内装などは全車種同じです。このときトヨタは20パターンそれぞれの車種について一から設計を行うでしょうか?普通は行いません。まず外部塗装以外は完成された未完成の車を1つの設計図に基づいて準備し、お客の要望によって外部塗装を変えます。つまり塗装が施されたところでようやく車は完成します。この時「外部塗装のみできていない車」を抽象クラスといい、「外部塗装のみできていない車」を継承して作られた「塗装の完了した車」を通常のクラスということができます。
抽象クラスは具体的にはどのように作るかというと、クラスの宣言文に対して以下のようにabstract句を付加してやるだけです。これでこのクラスは継承しない限り単独でnewすることはできなくなります。また抽象メソッドを記述したいときにはインターフェースのときと同様にabstract句を利用してメソッドを宣言してやるだけです。もちろん抽象メソッドを宣言した場合はサブクラスで必ず実装(*)しなければコンパイルすることはできません。これらの違い以外は通常のクラスと同一なのでメソッドや、コンストラクタを記述することが可能です。
|
例:抽象クラスの宣言文
|
| |
|
|
| |
public abstract class abstractToyotaCar{
public void abstract testOut( );//抽象メソッド
・・・・・・
}
|
|
| |
|
|
|
*必ず実装しなければいけないと記述しましたが、正確には間違っています。例えばサブクラスが抽象クラスであった場合には実装の強制はさらに下位クラスへとゆだねられます。また同様に抽象クラスがインターフェースをインプリメントしていたとき、その抽象クラスはインターフェースのメソッドを完全に実装する必要はありません。なぜなら抽象クラスはもともと抽象メソッドを含む可能性があるため未実装でも許可され、やはりその実装は下位クラスへとゆだねられます。
サンプル用のソースファイル(JavaDoc)
|