つまるところどうせオーバーライドするのであればスーパークラスでわざわざ処理を書く必要がない
(継承関係が他のクラスで成り立つ可能性が低いならなおさら)
そこでJavaにはメソッドの処理をあいまい(未定義)で記述する抽象メソッド用意する抽象クラスで定義することでメソッド名の宣言だけしてそのような煩わしさをなくせる。
■抽象メソッドのルールと何もしないメソッドとの違い
通常のメソッドの記述は、
public void method() {
}
のようなかじで{ }の間に処理を記述することで処理を実行できる
ところが何も書いていないと、「未定義」ではなく「何もしない」という処理を定義している
抽象化とは未定義のまま宣言する方法であるため
public abstruct void method();
と上記のメソッドを書き直すとことではじめて抽象メソッドとなる
細かいルールをまとめると
1.記述: アクセス修飾子 abstruct 返却値 メソッド名(引数); ←「{ }」で終わるのではなく呼び出しのときのように「;」で終わる
2.クラス宣言 : 抽象メソッド(abstruct修飾のメソッド)が1つでも定義されているなら、 アクセス修飾子 abstruct class クラス名 { }
3.コンストラクタ : 抽象クラスはインスタンス生成ができないので定義しないほうがよい
■サンプル
public abstruct class AbsClass {
abstruct void show();
}
public class SubClass extends AbsClass{
int num;
String name;
SubClass(String name,int num) {this.name=name; this.num=num; }
void show(){
System.out.print(name + "さんは" + num + "歳です");
}
}
public class MainClass {
public static void main(String [] gf) {
SuperClass sc = new SubClass("田中",25);
sc.show();
}
}
abstruct void show();
}
public class SubClass extends AbsClass{
int num;
String name;
SubClass(String name,int num) {this.name=name; this.num=num; }
void show(){
System.out.print(name + "さんは" + num + "歳です");
}
}
public class MainClass {
public static void main(String [] gf) {
SuperClass sc = new SubClass("田中",25);
sc.show();
}
}
----------
実行結果
----------
田中さんは25歳です
----------
実行結果は前回のポリモルフィズムと同じ振る舞いになります