◆抽象クラス
以前、“クラスは設計図”という説明があったのを覚えていますか?
設計図に従い、そのクラスの属性に具体的な値を入れるとインスタンス化することができました。
このようにインスタンス化できるクラスを「具象クラス」と言います。
クラスにはこのような使い方があったのですが、実はインスタンス化できないクラスがあります。
それが今回扱う「抽象クラス」です。
ではインスタンス化できないのにどうやってこの抽象クラスを使うのかといいますと、
この「抽象クラス」は継承して使用します。
いわばクラス専用の設計図です。
抽象クラスの構文は以下の通りとなります。
【修飾子】 abstract class クラス名 {
【修飾子】 abstract 戻り値の型 メソッド名 (引数の型1 引数名1, 引数の型2 引数名2, ・・・);
【修飾子】 戻り値の型 メソッド名 (引数の型1 引数名1, 引数の型2, 引数名2, ・・・) {}
}
では行ごとに確認していきましょう。
・1行目
クラス宣言の行にabstractキーワードが付加されています。
このabstractキーワードで抽象クラスということを宣言します。
・2行目
クラスだけではなく、メソッドにもabstractキーワードがついています。
さらにこのメソッドには処理内容が記述されていません。
これは「抽象メソッド」と呼ばれるメソッドで、サブクラスでオーバーライドしなければならいないメソッドです。
オーバーライドしないとコンパイルエラーとなります。
・3行目
通常と同じメソッドの宣言です。
◆サンプルプログラム
では実際にサンプルプログラムをみてみましょう
abstract class Car { // 抽象クラス Car(){ System.out.println("自動車を作成します"); } abstract public String setLight(); // 抽象メソッド } class CarA extends Car { // サブクラス public CarA() { System.out.println("A社のパーツを使います。"); } public String setLight() { // 抽象メソッドのオーバーライド return "丸ライト"; } } class CarB extends Car { // サブクラス CarB () { System.out.println("B社のパーツを使います"); } public String setLight() { // 抽象メソッドのオーバーライド return "四角ライト"; } } public class Sample14_1 { public static void main(String[] args) { Car a1 = new CarA(); System.out.println("ライトは" + a1.setLight() + "取り付けました"); System.out.println(); // 改行 Car b1 = new CarB(); System.out.println("ライトは" + b1.setLight() + "取り付けました"); } }
実行結果
自動車を作成します
A社のパーツを使います。
ライトは丸ライト取り付けました
自動車を作成します
B社のパーツを使います
ライトは四角ライト取り付けました
◆解説
1行目
クラス宣言時にabstractキーワードが使用されています。
このCarクラスが抽象クラスとなります。
5行目
メソッド宣言時にabstractキーワードが使用され、処理内容の記述がありません。
このsetLight()メソッドが抽象メソッドとなります。
8,17行目
ここでは抽象クラスを基に、CarAクラスとCarBクラスというサブクラスが作成されています。
12~14,21~23行目
Carクラスの抽象メソッドがオーバーライドされています。
この記述がないとコンパイルエラーとなります。
全体を通してみますと、Carという抽象クラスではライトがあると決めているだけで、具体的な形は決まっていません。
実際にライトの形を決めるのはA社やB社などの各メーカーが決定することになります。
つまり、抽象クラスでは最低限の機能を定義し、それを継承したサブクラスで具体化する、ということです。
◆まとめ
・具象クラス ・・・ インスタンス化できるクラス。
・抽象クラス ・・・ インスタンス化できないクラス。abstractキーワードがついている。サブクラスを作って使用する。
・抽象メソッド・・・処理内容の記述がないメソッド。abstractキーワードがついている。必ずサブクラスでオーバーライドしなければならない。
次回はインターフェースについて扱います。