>> Java入門トップに戻る
Javaの抽象クラスについて説明します。
抽象クラスとは、「自身のインスンタンスは作成出来ず、継承の為に利用されるクラス」という感じのクラスです。
この抽象クラスには「抽象メソッド」というメソッドを定義することが出来ます。
この抽象メソッドを持つ抽象クラスを継承した場合、「サブクラスではそのメソッドを必ずオーバーライドしなければならない」という決まりがあります。
つまり、「抽象クラスを継承することで、サブクラス側で特定のメソッドの実装を保証できる」ことになります。
サブクラスで特定のメソッドを強制的に定義させることが出来るというわけです。
抽象クラスは以下のように定義します。
抽象メソッドを定義する場合もabstract修飾子をつけます。
おもしろいのは抽象メソッドの中身が何もないことです。
抽象メソッドは抽象クラスを継承するサブクラスにそのメソッドの実装を保証させるものなので、メソッドの具体的な処理を書く必要がないんです。
また、抽象クラスには「通常のメソッド」やフィールドも定義出来ます。
サブクラス側ではこれらを今まで通り呼び出すことが出来ますので、抽象クラスを継承するサブクラスで、共通の処理や共通のフィールドを持たせたいって時に使えます。
では実際に抽象クラスを継承してみましょう。
これをオーバーライドしないと、「AbstractChild は継承された抽象メソッド AbstractParent.getValue() を実装する必要があります」というエラーが出てコンパイル出来ません。
ちゃんと抽象メソッドとしての役割を果たしていますね。
7行目でAbstractChildクラスのインスタンスを作成し、10行目でオーバーライドしたgetValueメソッドを呼び出しています。
ここではコンストラクタでセットした値「10」が表示されますね。
13行目では抽象クラス内に定義している通常のメソッドgetNumメソッドを呼び出しています。
ここでは抽象クラス内でフィールドnumに初期値をセットしているので「5」が表示されます。
このように抽象クラスでは通常のメソッドも定義することが可能です。
以上が抽象クラスの説明です。
最初は使い方がいまいちよくわからないと思いますが、サブクラスでこのメソッドは必ず定義してね!っていう時に使えます。
それと一番最初にも書きましたが、「抽象クラス自身はインスタンスを作成できない」ということは覚えて置いてください。
抽象クラスのインスタンスを作成しようとするとエラーが発生します。
抽象クラスは必ず継承して利用してください。
>> 【インターフェイス interface】に進む
>> Java入門トップに戻る
抽象クラス abstract修飾子
抽象クラスとは、「自身のインスンタンスは作成出来ず、継承の為に利用されるクラス」という感じのクラスです。
この抽象クラスには「抽象メソッド」というメソッドを定義することが出来ます。
この抽象メソッドを持つ抽象クラスを継承した場合、「サブクラスではそのメソッドを必ずオーバーライドしなければならない」という決まりがあります。
つまり、「抽象クラスを継承することで、サブクラス側で特定のメソッドの実装を保証できる」ことになります。
サブクラスで特定のメソッドを強制的に定義させることが出来るというわけです。
抽象クラスは以下のように定義します。
//抽象クラス
abstract class Test{
private int num=0;
//抽象メソッド
abstract int getValue();
//通常のメソッドも定義可能
public int getNum(){
return num;
}
}
上記のように「class」の前に「abstract修飾子」を付けます。抽象メソッドを定義する場合もabstract修飾子をつけます。
おもしろいのは抽象メソッドの中身が何もないことです。
抽象メソッドは抽象クラスを継承するサブクラスにそのメソッドの実装を保証させるものなので、メソッドの具体的な処理を書く必要がないんです。
また、抽象クラスには「通常のメソッド」やフィールドも定義出来ます。
サブクラス側ではこれらを今まで通り呼び出すことが出来ますので、抽象クラスを継承するサブクラスで、共通の処理や共通のフィールドを持たせたいって時に使えます。
では実際に抽象クラスを継承してみましょう。
package test3;
public class AbstractClass {
public static void main(String[] args) {
AbstractChild obj = new AbstractChild(10);
//抽象メソッドgetValue呼び出し
System.out.println(obj.getValue());
//抽象クラスAbstractParentの通常のメソッドgetNum呼び出し
System.out.println(obj.getNum());
}
}
//抽象クラスを継承したサブクラス
class AbstractChild extends AbstractParent{
private int num;
public AbstractChild(int value) {
num = value;
}
@Override
public int getValue() {
return num;
}
}
//抽象クラス
abstract class AbstractParent{
private int num=5;
//抽象メソッド
abstract int getValue();
//普通のメソッドも定義可能
public int getNum(){
return num;
}
抽象クラス「AbstractParent」を継承したサブクラス「AbstractChild」で抽象メソッド「getValueメソッド」をオーバーライドしています。これをオーバーライドしないと、「AbstractChild は継承された抽象メソッド AbstractParent.getValue() を実装する必要があります」というエラーが出てコンパイル出来ません。
ちゃんと抽象メソッドとしての役割を果たしていますね。
7行目でAbstractChildクラスのインスタンスを作成し、10行目でオーバーライドしたgetValueメソッドを呼び出しています。
ここではコンストラクタでセットした値「10」が表示されますね。
13行目では抽象クラス内に定義している通常のメソッドgetNumメソッドを呼び出しています。
ここでは抽象クラス内でフィールドnumに初期値をセットしているので「5」が表示されます。
このように抽象クラスでは通常のメソッドも定義することが可能です。
以上が抽象クラスの説明です。
最初は使い方がいまいちよくわからないと思いますが、サブクラスでこのメソッドは必ず定義してね!っていう時に使えます。
それと一番最初にも書きましたが、「抽象クラス自身はインスタンスを作成できない」ということは覚えて置いてください。
抽象クラスのインスタンスを作成しようとするとエラーが発生します。
抽象クラスは必ず継承して利用してください。
>> 【インターフェイス interface】に進む
>> Java入門トップに戻る













