抽象クラス
抽象クラスは、メソッドの実装が不完全なためそのクラスのオブジェクトを作れないし、したがってインスタンスメソッドを呼び出す事もできないクラスです。
抽象クラスは、クラスの宣言の冒頭にabstractという修飾子を付け、そのクラスの内容とは無関係に中傷クラスとして扱われます。このようなクラスのオブジェクトを作ろうとしているnew文などはエラーで引っかかります。
- 抽象クラスにするクラスの特徴
- 一部のメソッドに実装がない。
- メソッドに実装はあるが、無内容な実装である。
要するに中途半端なクラスが作れてしまうわけです。通常抽象クラスは実装のないいくつかの抽象メソッドを持っています。抽象クラスをサブクラスで継承し、そのサブクラス内で抽象クラスで実装されていない抽象メソッドを実装(オーバーライド)しオブジェクトを生成する形をとります。
- 抽象メソッドのフォーマット
abstract 戻り型 メソッド名(引数型 引数名) ;
- 抽象クラスのフォーマット
abstract class クラス名{ クラス本体 }
- 抽象クラスのルール
- 抽象クラスのオブジェクトを生成する事はできない。
- 抽象クラスには抽象メソッドがあってもいいし、抽象メソッドでないメソッドがあってもいい。しかし、抽象メソッドがあるクラスは必ず抽象クラスとして宣言しないといけない。
- 抽象メソッドがない、抽象クラスを宣言する事もできる。かならず継承が行われ、なんらかのメソッドの変更があることを表します。
- 抽象クラスを継承したサブクラスで抽象メソッドを実装(オーバーライド)しない場合、そのサブクラスは抽象クラスとして宣言される。
// sample code // (1).抽象クラスの宣言 abstract class SuperClass{ int price = 100; // 共通機能は抽象クラス内で実装 void show(int taxprice){ System.out.println( taxprice + "円です" ); } // 個々で異なる機能はヘッダーのみ宣言 abstract void calculate(); } // (2).抽象クラスを継承 class SubA extends SuperClass{ // 抽象クラスで宣言されたcalculateメソッド // 実装(オーバーライド) void calculate(){ show((int)(price * 1.05)); } } // (3)抽象クラスを継承 class SubB extends SuperClass{ // 抽象クラスで宣言されたcalculateメソッド // 実装(オーバーライド) void calculate(){ show((int)(price * 1.03)); } } class ExClass1B{ public static void main(String[] args){ SubA objectA = new SubA(); SubB objectB = new SubB(); objectA.calculate(); // (4) objectB.calculate(); // (5) } }
- 抽象クラスSuperClassを宣言。showメソッドを実行する。calculateメソッドは課税率による異なるためヘッダーのみ宣言する。
- 抽象クラスSuperClassを継承したSubAクラスを宣言。SuperClassクラスで実装されなかったcalculateメソッドの実装を行う。
- 抽象クラスSuperClassを継承したSubAクラスを宣言。SuperClassクラスで実装されなかったcalculateメソッドの実装を行う。
- SubAクラスオブジェクトObjectAを通してCalculateメソッドを呼び出し、消費税率5%の計算を行う。
- SubAクラスオブジェクトObjectAを通してCalculateメソッドを呼び出し、消費税率3%の計算を行う。