- ベストアンサー
抽象クラスについて<Java>
「抽象クラス」は一体何のためにあるのか教えてください。どのような場面で使用するとその効力が味わえるのかも教えていただきたいです。具体的に分かりやすい例を挙げて説明してくれるとうれしいです。 非常に困ってますので、よろしくお願いします!!
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
抽象クラスは、抽象メソッドを持っています。 抽象メソッドは、サブクラス側でそのメソッドが実装されることはわかっているけど スーパークラス側でどのような内容のメソッドになるか確定できないものです。 逆に言えば、スーパークラス側で内容がわからなくても呼べるのです。 しょぼいですが、試しにちゃちゃっと作ってみました。 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(); } } }
その他の回答 (2)
- chuckcavaness
- ベストアンサー率53% (7/13)
ほんの一例ですが こんな感じでサブクラスで各々の処理が記述できます。 //基底クラス public abstract class Base{ public void execute(){ // 初期処理 System.out.println("初期処理"); // 個別の処理(サブクラスで実装) doExecute(); // 終了処理 System.out.println("終了処理"); } // ここではメソッド名だけ定義して、中身はサブクラスで実装 abstract void doExecute(); } //サブクラス public class Sub1 extends Base { void doExecute() { System.out.println("Sub1クラスでの処理"); } } //テスト実行用 public class Test { public static void main(String[] args) { Sub1 sub = new Sub1(); sub.execute(); } }
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
抽象クラスは、スーパークラスとしてクラスは必要だが 実際には、継承してかならずオーバーライドして使われるのでメソッドの本体が必要ないような場合に使用します。 メソッドの本体(処理中身)がないことと、メソッド自体がないことの違いは、そのメソッドを強要できることクラスの間で一貫したメソッドが使えるということです。(また、newした時にエラーになるので、かならず継承して使わなければならないということを強制できます) 具体的な例としては、 java.lang.Numberクラスが抽象クラスです。 SDKの中にソースがあります。
お礼
回答ありがとうございます。 まだちょっともやもやとしていますが、前より理解できました。
お礼
具体例を挙げてくださって、よく理解できました。 抽象メソッドの利便性も分かりました。 ありがとうございます。