抽象クラスは、通常のクラスとは違い、それだけでは成り立たない「
不完全なクラス」と言えます。
まずは実際にJavaでサンプルコードを書いてみます。
public class abSample{
public static void main(String[] args){
Dollar dollar;
dollar = new Dollar();
En en;
en = new En();
dollar.addMoney(100);
en.addMoney(10000);
dollar.show();
en.show();
}
}
abstract class Money{
protected int moneySum = 0;
public void addMoney(int m){
moneySum += m;
}
abstract void show();
}
class Dollar extends Money{
Dollar(){
System.out.println("Dollarクラスのインスタンスが作成されました。");
}
public void show(){
System.out.println("現在の所持金は" + moneySum + "ドルです。");
}
}
class En extends Money{
En(){
System.out.println("Enクラスのインスタンスが作成されました。");
}
public void show(){
System.out.println("現在の所持金は" + moneySum + "円です。");
}
}
【実行結果】
Dollarクラスのインスタンスが作成されました。
Enクラスのインスタンスが作成されました。
現在の所持金は100ドルです。
現在の所持金は10000円です。
上記サンプルは抽象クラスであるMoneyクラスをDollarクラス、Enクラスでそれぞれ継承し、お金についてDollarクラスはドル単位で、Enクラスは円単位で管理しています。
まずは、Moneyクラスについて見ていきます。
abstract class Money{
protected int moneySum = 0;
public void addMoney(int m){
moneySum += m;
}
abstract void show();
}
クラス定義の先頭に
abstractというキーワードがついていることに着目してください。
このようにabstractキーワードを付けて定義されたクラスを
抽象クラスと言います。
次に、show()メソッドに着目してください。
メソッド定義の先頭に
abstractキーワードが付いています。
そして、クラスの処理内容が定義されていません。
このようにabstractキーワードを付けたメソッドを
抽象メソッドと言い、
抽象メソッドを持つクラスは抽象クラスとして定義することになります。
では、このshow()メソッドの処理内容はどこで定義するのでしょう。
それは、抽象クラスを継承したクラスで定義(オーバーライド)することになります。
つまり、抽象クラス(Moneyクラス)だけではクラスとして成り立つことはできないのです。
このため、
抽象クラスは"インスタンスを生成する"ということができません。
次に、抽象クラスを継承したDollarクラスについて見ていきます。
class Dollar extends Money{
Dollar(){
System.out.println("Dollarクラスのインスタンスが作成されました。");
}
public void show(){
System.out.println("現在の所持金は" + moneySum + "ドルです。");
}
}
抽象クラスを継承したクラスは必ず、抽象クラスの抽象メソッドと同じ名前のメソッド(show()メソッド)を定義する必要があります。
ここで、DollarクラスとEnクラスの違いに着目してください。
Dollarクラスはお金をドル単位で管理し、Enクラスは円単位で管理する、両クラスの違いはこれだけあり、他の部分は同じ役割を果たしています。
この両クラスの違いの部分だけをあえて抽象的にし、同じ役割を果たす部分だけを定義したのがMoneyクラスです。
このように抽象クラスを活用することにより、コードの冗長をなくし、わかりやすくて簡潔な記述をすることができます。