抽象クラス、抽象メソッドは以下のような定義又は特徴を持つ。
抽象クラス:
1)抽象メソッドをもつ
2)abstract修飾子がつく
3)オブジェクトを作成できない
4)子クラスでそのメソッドを定義することを期待、つまり、オーバーライド。
抽象メソッド:
1)処理内容の定義されていないメソッド
2)abstract修飾子がつく
つまり、抽象クラスは拡張を期待したクラスであり、抽象メソッドはオーバーライドを期待したメソッドである。
例えば、abstractクラスは以下のような形になる。
abstract class XXX {
フィールド1;フィールド2;...
メソッド1;メソッド2; ...
abstract 戻り値メソッド名();
……
abstract 戻り値メソッド名();
}
つまり、abstractメソッド以外は通常のクラスと同じ、しかし、一つ以上の動作定義のないabstractメソッドが存在する。
クラス設計では複数の似たクラスを設計する場合が多い。そのとき共通部分を親クラス又はabstractクラスとし、それぞれの残りの部分を子クラスとする考え方がある。abstractメソッドは名前だけが共通部分で残りはそれぞれの子クラスで違っているということである。
abstractクラスにはコンストラクターが存在し得る。しかし、オブジェクトは作成できない。従って、親クラスとして、そのクラスのオブジェクトが必要な場合はそのクラスをabstractにはできない。
図Proo10_1_srcはabstractクラスの説明のための例である。1から8行 abstract class Book
7行 displayは内容が未定義
9から17行 Bookを拡張したProBook
10行 子クラスの追加フィールド
11から13行 ProBookでBookのdisplayを実装している(オーバーライド)
18から26行 Bookを拡張した子クラスTextBook
19行 子クラスの追加フィールド
23から25行 TextBookでBookのdisplayを実装
30行 ProBookのオブジェクトを作成
31行 TextBookのオブジェクトを作成
32行 二つのオブジェクトのdisplayを起動
35から36行 二つオブジェクトの内容が表示されている。
以下にソースを二つ示す。
abstract class Book{ String title; int page; public Book(String title,int page) { this.title = title;this.page=page; } abstract void display(); } class ProBook extends Book{ private int category; public ProBook(String title, int page, int category){ super(title,page);this.category=category; } public void display(){ System.out.println(" [ProBook: "+title+","+page+","+category+"]"); } } class TextBook extends Book{ private int school; public TextBook(String title, int page, int school){ super(title,page);this.school=school; } public void display(){ System.out.println(" [TextBook: "+title+","+page+","+school+"]"); } } class Proo10_1{ public static void main(String args[]){ Book a,b; a=new ProBook("Introduction to C++",300,5); b=new TextBook("Beginner's Java",400,3); a.display();b.display(); } } // [ProBook: Introduction to C++,300,5] // [TextBook: Beginner's Java,400,3]