抽象クラスは、抽象メソッドを持っています。
抽象メソッドは、サブクラス側でそのメソッドが実装されることはわかっているけど
スーパークラス側でどのような内容のメソッドになるか確定できないものです。
逆に言えば、スーパークラス側で内容がわからなくても呼べるのです。
しょぼいですが、試しにちゃちゃっと作ってみました。
Tasu.java:スーパークラス(抽象クラス)
Moji.java:Tasuのサブクラス、文字列として足す
Suuchi.java:Tasuのサブクラス、数値として足す
Test.java:実行用
Tasuには、public abstract String plus() の抽象メソッドがありますが
これだけでは、どのような値が返ってくるかわかりません。
実装はサブクラス Moji、Suuchi で行われていて、
Mojiは文字列として連結、Suuchiは数値として足し算します。
実行用のTestにあるメソッド print(Tasu t) は引数に Tasu を取ります。
ここでは引数の内容がMojiなのかSuuchiなのかわかっていませんが、
plus()メソッドが実装されていることはわかっているので、
plus()メソッドを呼んでしまうことができます。
------
[実行結果]
$ java Test 111 222
Moji:222333
Suuchi:555
[Test.java]
public class Test {
public static void main(String[] args) {
Test test = new Test();
test.go(args);
}
private Test() {
}
private void go(String[] args) {
if(args.length < 2) {
System.out.println("パラメータを2つ指定してください");
return;
}
Moji m = new Moji(args[0], args[1]);
Suuchi s = new Suuchi(args[0], args[1]);
print(m);
print(s);
}
private void print(Tasu t) {
StringBuffer sb = new StringBuffer();
sb.append(t.getClass().getName());
sb.append(":");
sb.append(t.plus());
System.out.println(sb.toString());
}
}
[Tasu.java]
public abstract class Tasu {
protected String p1;
protected String p2;
public Tasu(String p1, String p2) {
this.p1 = p1;
this.p2 = p2;
}
public abstract String plus();
}
[Moji.java]
public class Moji extends Tasu {
public Moji(String p1, String p2) {
super(p1, p2);
}
public String plus() {
return super.p1 + super.p2;
}
}
[Suuchi.java]
public class Suuchi extends Tasu {
public Suuchi(String p1, String p2) {
super(p1, p2);
}
public String plus() {
try {
int i1 = Integer.parseInt(super.p1);
int i2 = Integer.parseInt(super.p2);
return Integer.toString(i1 + i2);
}
catch(NumberFormatException e) {
return e.toString();
}
}
}
お礼
具体例を挙げてくださって、よく理解できました。 抽象メソッドの利便性も分かりました。 ありがとうございます。