• ベストアンサー

抽象クラスについて<Java>

「抽象クラス」は一体何のためにあるのか教えてください。どのような場面で使用するとその効力が味わえるのかも教えていただきたいです。具体的に分かりやすい例を挙げて説明してくれるとうれしいです。 非常に困ってますので、よろしくお願いします!!

  • Java
  • 回答数3
  • ありがとう数3

質問者が選んだベストアンサー

  • ベストアンサー
  • osumitan
  • ベストアンサー率33% (102/307)
回答No.2

抽象クラスは、抽象メソッドを持っています。 抽象メソッドは、サブクラス側でそのメソッドが実装されることはわかっているけど スーパークラス側でどのような内容のメソッドになるか確定できないものです。 逆に言えば、スーパークラス側で内容がわからなくても呼べるのです。 しょぼいですが、試しにちゃちゃっと作ってみました。  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();     }   } }

takotyu
質問者

お礼

具体例を挙げてくださって、よく理解できました。 抽象メソッドの利便性も分かりました。 ありがとうございます。

その他の回答 (2)

回答No.3

ほんの一例ですが こんな感じでサブクラスで各々の処理が記述できます。 //基底クラス 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)
回答No.1

抽象クラスは、スーパークラスとしてクラスは必要だが 実際には、継承してかならずオーバーライドして使われるのでメソッドの本体が必要ないような場合に使用します。 メソッドの本体(処理中身)がないことと、メソッド自体がないことの違いは、そのメソッドを強要できることクラスの間で一貫したメソッドが使えるということです。(また、newした時にエラーになるので、かならず継承して使わなければならないということを強制できます) 具体的な例としては、 java.lang.Numberクラスが抽象クラスです。 SDKの中にソースがあります。

takotyu
質問者

お礼

回答ありがとうございます。 まだちょっともやもやとしていますが、前より理解できました。

関連するQ&A

  • 抽象クラスについて

    抽象クラスを使って派生クラスを作成していて疑問になったのですが、派生クラスで作るメンバ関数は、抽象クラスで仮想関数としてすべて定義しておくべきなのでしょうか。ご教授願います。

  • 抽象クラスのメリット

    抽象クラスを作成して、オーバーライドするならば、 普通のクラスを作成してオーバーライドしても同じ ではないでしょうか。 オーバーライドする事を忘れない、というメリットでは パンチが弱い気がします。 他に抽象クラスを使用する事によってのメリットは ありますでしょうか?

    • ベストアンサー
    • Java
  • インタフェースと抽象クラスの使い方

    インタフェースと抽象クラスの違いがいまいちよくわからないのですが、 違いではなく インタフェースにできて、抽象クラスではできないこと、 抽象クラスにできて、インタフェースにはできないこと をお伺いできますでしょうか。 宜しくお願いします。

    • ベストアンサー
    • PHP
  • JAVA:抽象クラスとインタフェースクラスの違い

    インタフェースクラスの存在意義がわかりません。 「処理の実体まで実装せず、箱だけ作っておく」という意味では、抽象クラスで良いのでは?と感じます。 (厳密には、インタフェースクラスの方は、継承せずに、複数の実装パターンを分けれるという部分に違いはあると思いますが、ほぼ存在意義がないように感じます。)

    • ベストアンサー
    • Java
  • 抽象メソッド、抽象クラス

    C#を勉強しております。Javaにも同じ機能がありC#のカテゴリーがない為こちらで質問させていただきます。抽象メソッドや抽象クラスを使う利点に関してです。 これらを使う利点を調べたところオーバーライドさせられると書いてありました。オーバーライドしないと 実装がないのでエラーになると書いてありました。その点は理解できたのですが何故基本クラスで実体のない定義をする利点がよくわかりません。それなら最初から派生クラスの方にメソッドを定義すればいいのではという考えになりました。 抽象メソッドとして実体のない定義を行う利点なるものを教えてください。 よろしくお願いします。

  • 抽象的概念

    抽象的概念の必要性について400字以内で説明せよ。 抽象的概念は一般的には分かりにくいが、具体例を用いて示すと分かりやすいことがある。 具体例は抽象的概念の理解に役立つが、一般化することはできない。 抽象的概念は一般化することができるから必要である? うーん・・・。 現代文の教科書を読んだりしてみているのですが、論が深まりません。 どのように論を展開したらよいでしょうか。 お知恵を拝借したく思いますm(__)m

  • インターフェイスと抽象クラスについて

    オブジェクト指向について学んでいます。 下記のように、単体でクラスを定義して各メソッドの実行する方法などは理解しているつもりです。 class Test { public function __construct() { // コンストラクタ } public function setName($name) { $this->name = $name; } public function getName() { return $this->name; } } $test = new Test(); $test->setName('太郎'); echo $test->getName(); // 太郎 ここまではいいのですが、インターフェイスと抽象クラスってどんな時に使うべきなのでしょうか? 簡単な例で使い方を紹介しているサイトはいくつかあるのですが実用性がないものばかりで、これらは本当に必要なものなのか?という疑問があります。。。 具体的に実用性がある例で使い方とメリットをおしえていただけませんでしょうか?

    • ベストアンサー
    • PHP
  • 抽象クラスのエラーが出ます

    http://www5f.biglobe.ne.jp/~kenmo/program/skinmesh/skinmesh.html このサイトのコードを動かそうとすると、 >error C2259: 'CAllocateHierarchy' : 抽象クラスをインスタンス化できません。 というエラーが出てしまいます。 抽象クラスというのを初めて聞いたのですが、 どうすればこのエラーを消せるのでしょうか?

  • 抽象クラスとインターフェースの使い分け

    抽象クラスとインターフェース、この2つの違い、使い分け方が未だにはっきりとはわかりません・・・ 抽象クラスもインターフェースも実装は持たず、抽象クラスはサブクラスで、インターフェースはそれをインプリメントしたクラスで実装を行うのですよね? 両者ともに言わば中身はなく外枠だけ定義されていると言えると思うのですが、だとしたらこの2つの違いや使い分けってどうなるのでしょうか。 抽象クラスでは部分的な実装を含められることや、インターフェースでは実装クラスが全てのメソッドを実装しなければいけない、複数実装できるといった使い方の違いしかないのでしょうか。 だとしたら実際に抽象クラスとして用意するのかインターフェースとして用意するのかの選択基準はなんなのでしょうか。 明確にこういう場合は抽象クラス、こういう場合はインターフェースなどと言った使い分けってあるのでしょうか。

  • 抽象クラスの継承について

    すいませんがご教授下さい。 ASP.NETとVB.NETを使用してアプリを開発しています。 存在するクラスは以下のようなクラスです。 (WebForm1.aspxとWebForm1.aspx.vbとClass1.vb(抽象クラス)があります。) したい事はClass1.vbをWebForm1.aspx.vbが継承したいのですが継承させた後にWebForm1.aspxを開こうとすると「Webフォームデザイナにファイルを読み込めませんでした。・・・・」とエラーポップアップが表示されます。「はい」でHTMLは見れるのですがデザインはタブ自体がないです。普通のクラスを継承させると問題ないのですが。抽象クラスだとエラーになります。 対処方を教えて下さい。