インターフェイスと抽象クラスの違いと特徴

このQ&Aのポイント
  • 抽象クラスは、決まっているメソッドと決まっていないメソッドを持つ場合に、後からオーバーライドすることができます。
  • インターフェイスでは変数は定数になり、メソッドは名前のみの宣言となります。
  • 抽象クラスとインターフェイスの違いは、定義の仕方や使い方などにありますが、メリットとしてはインタフェースの配列でインスタンスを生成することができるという点が挙げられます。
回答を見る
  • ベストアンサー

インターフェイスと抽象クラス

なかなか理解が難しくて苦しんでいます。 で自分なりに理解したのですが、 抽象クラス→内容に決まっているメソッドと決まっていないメソッドがある場合に決まっていないメソッドを あとからオーバーライドするだけでスーパークラスで定義したすべてのメソッドを利用できる。 これでただしいでしょうか? で、インターフェイスなのですが、この抽象クラスとそっくりなんですが、 (1)変数は定数になる(強制static)(2)メソッドは名前のみの宣言(内容は記述できない) と言うことで、かなり???なのです。 何のために・・・???記述するんでしょうか?? ただひとつメリットがあるとしたら、インターフェイスを実装すると、インターフェイスの配列でインスタンスを 生成出来るということぐらいでしょうか。 そこでちょっとお門違いの疑問かもしれないんですが、 Runnable、やMouselistenerはメソッドの内容が書かれていないのに、 なぜ機能を持たせることが出来るのでしょう??? 認識違い、間違い等ありましたら、教えてください よろしくお願いいたします。

  • Java
  • 回答数2
  • ありがとう数1

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

  • ベストアンサー
  • Sephy
  • ベストアンサー率35% (7/20)
回答No.2

>class A implements Runnable{} >class B implements Runnable{} >とあったとすると、 >Runnable a = new A(); >Runnable b = new B(); >と出来る、と言うことでいいでしょうか・・・??  はい、そういうことです。例えば、Runnableの配列を作れば、その配列にはクラスAもクラスBも格納できます。取り出すときはRunnableとして取り出すのでRunnableで定義されるメソッドしか使用できません。  つまり、同じインターフェースを持つクラスのインスタンスなら、たとえ違った種類のクラスのものでも、それらを同等に扱うことができる、ということです。 >>機能を持たせることが出来るのでしょう??? >たとえばMouseClick()が"マウスがクリックされたら実行するメソッド”だとして"マウスがクリックされたぞ”と言うイベントを受け取る機能はどうやって実装するのかなと言うことなのです。  java.awt.Componentクラスには、addMouseListenerというメソッドがあります。このメソッドを使うと"マウスがクリックされたぞ”と言うイベントを受け取ることができるようになります。ほかにもキーボードからの入力を受け取るためのaddKeyListenerなどがあります。   >書いてきてなんとなくわかったのですが、それがMouseEventでしたね・・・?  MouseEventはイベントの内容の方です。  MouseListenerに、mouseClicked(MouseEvent e)というのがあると思います。このメソッドはマウスがクリックされたときに呼び出されます。このときeには、どのボタンが押されたのか、どの座標で押されたのか、といった情報が格納されています。

azicyan
質問者

補足

ありがとうございます。 勘違いでした^_^; >java.awt.Componentクラスには、addMouseListener なるほどーーーよくわかりました!

その他の回答 (1)

  • Sephy
  • ベストアンサー率35% (7/20)
回答No.1

 たとえば以下のようなメソッドを定義することができます。 public void Start(Runnable r) {   r.run(); }  このメソッドは、Runnableをインプリメントしたクラスのインスタンスならなんでも引数に取ることができます。  例えば、RunnableをインプリメントしたクラスAと、Runnableをインプリメントした別のクラスBを用意したとします。  ですがこのメソッドの前ではクラスAもクラスBもどちらもRunnableとして扱うのです。  インターフェースはメソッド名とその引数を定義できます。インターフェースをインプリメントしたクラスはその実装を「必ず」書かなければなりません。  つまり、そのインターフェースをインプリメントしたメソッドには、必ずそのインターフェースで定義されたメソッドが存在するという保証される、と考えたらわかりやすいでしょうか。 >Runnable、やMouselistenerはメソッドの内容が書かれていないのに、 >なぜ機能を持たせることが出来るのでしょう???  についてですが、Mouselistenerを例にするのがわかりやすいでしょうか。  Mouselistenerをインプリメントしたクラスを、addMouseListenerでウインドウに追加したとします。  このときウインドウは、マウスがクリックされたときはmouseClickedメソッドを、離されたときはmouseReleasedメソッドを・・・といったようにメソッドを呼び出します。  つまりこれらのメソッドを呼び出すのはプログラマではなくウインドウ(OS)です。  ウインドウがこのメソッドを呼び出したとき、どう動けばいいか、がインターフェースの実装なわけです。 >機能を持たせることが出来るのでしょう???  のところを勘違いしているのかもしれません。マウスがクリックされても、OSは「マウスがクリックされましたよ」と教えてくれるだけなのです。  クリックされたらどう動くか、は自分で書くのです。つまりこれが実装、「機能を持たせる」です。

azicyan
質問者

補足

お早い回答ありがとうございます! はじめの数行のところは難しくてよくわかりません^_^; class A implements Runnable{} class B implements Runnable{} とあったとすると、 Runnable a = new A(); Runnable b = new B(); と出来る、と言うことでいいでしょうか・・・?? >つまり、そのインターフェースをインプリメントしたメソッドには、必ずそのインターフェースで定義されたメソッドが存在するという保証される あー、はい確かにこちらのほうがわかりやすいです! >機能を持たせることが出来るのでしょう??? ええとですね・・・ たとえば、Mouselistenerをインプリメンツした場合にはMouseclickとかEnteredとかのメソッドを定義しなければならないですよね。それわわかるんですが、たとえばMouseClick()が"マウスがクリックされたら実行するメソッド”だとして"マウスがクリックされたぞ”と言うイベントを受け取る機能はどうやって実装するのかなと言うことなのです。書いてきてなんとなくわかったのですが、それがMouseEventでしたね・・・? これでただしいですか?

関連するQ&A

  • 「インタフェースを実装してそれが持つ抽象メソッドをオーバーライドする」

    「インタフェースを実装してそれが持つ抽象メソッドをオーバーライドする」は正しい? はじめまして。Javaのインタフェースに関する質問です。 私はこれまで、インタフェースを使うときは、インタフェースを実装してクラスを宣言し、そのクラス、またはサブクラスでインタフェースがもつすべての抽象メソッドを定義する、と理解していました。 しかし、下の例をみてください。抽象メソッドの定義を、インタフェースの実装の以前で与えています。問題無くコンパイルでき、実行できます。実行結果も以下の通りです。 インタフェースの抽象メソッドへの定義の与え方やその実行のされ方は、メソッドのオーバーライドと同様と思っていましたので、下記のコードでは「クラスBが抽象クラスではありません」や、「インタフェースの抽象メソッドがオーバーライドされていません」などの文法エラーがでると思っていました。 そこで、質問です。 インタフェースが持つ抽象メソッドの定義を与える場所について、または、これに関する説明のあるページなど、何かご存知でしたら教えてください。 ★コード★ interface X{   void show(); } class A{   public void show(){     System.out.println("A");   } } class B extends A implements X{ } public class Main{   public static void main(String[] args){     X x=new B();     x.show();   } } ★実行結果★ >java Main A ★Java環境★ java 1.6.0_21 javac 1.6.0_16

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

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

  • 抽象クラスのオブジェクトを生成できない理由は?

    ・抽象クラスは、なぜ(オーバーライドしないと)オブジェクトを生成できないのでしょうか? ・インタフェースみたいに、抽象メソッドしか宣言することができないなら話は分かるのですが… ・抽象メソッドでない普通のメソッドを実装できるのなら、オブジェクトを生成してくれても良いと思うのですが… ・そういう問題ではない?

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

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

  • 継承・実装の関係で悩んでいます。

    継承・実装の関係について悩んでいます。 ここでは、アクセス制御を考えずに、インスタンスかstaticかabstract(ここではabstract final staticやabstract classのこと)の違いで、どう継承するのか考えています。 // 継承 はメソッドのオーバーライドのことを考えます。(オーバーロードは考えない) クラスAからクラスBでオーバーライドしたメソッドは、 クラスCでさらにオーバーライドできるのでしょうか? クラスCが クラスBのクラスAからオーバーライドしたメソッド をクラスBのメソッドとして見たときに、オーバーライドすることは可能なのでしょうか? クラスA │ インスタンスフィールドA │ staticフィールドA │ │ クラスA() { } │ │ インスタンスメソッドA () { } │ staticメソッドB() { } ↓ クラスB extends クラスA │ インスタンスフィールドA // 継承 │ インスタンスフィールドB │ staticフィールドB │ │ サブクラス1() { } // コンストラクタは継承しない、super()で呼び出す │ │ インスタンスメソッドA () { } // 継承 │ │ インスタンスメソッドB () { } │ staticメソッドB () { } ↓ クラスC extends クラスB implements インタフェースD, ... ↑ インスタンスフィールドA // クラスBのフィールドを継承 │ インスタンスフィールドB // クラスBのフィールドを継承 │ インスタンスフィールドC │ staticフィールドC │ │ サブクラス2() { } │ │ インスタンスメソッドA () { } // クラスBのメソッドを継承 │ インスタンスメソッドB () { } // クラスBのメソッドを継承 │ インスタンスメソッドD () { } // インタフェースDのメソッドを実装 │ インスタンスメソッドE () { } // インタフェースDのメソッドを実装 │ │ │ インスタンスメソッドC () { } │ staticメソッドC() { } │ interface インタフェースD extends インタフェースE ↑ │ staticフィールドD // public static final │ │ インスタンスメソッドD() { } // public abstract │ インスタンスメソッドE() { } // 継承 │ interface インタフェースE staticフィールドE // public static final インスタンスメソッドE() { } // public abstract

    • ベストアンサー
    • Java
  • インターフェイスと抽象メソッドについてお願いします。

    PHPの参考書で「抽象メソッド」と「インターフェイス」それに「実装」という言葉が出てきました。 プログラミングが初めてで全然理解できなく困っています。 ・抽象メソッド ・インターフェイス ・実装 上記の意味とメリットなどを教えてください。それとどのような面で使うのかも教えていただけると嬉しいです。 すみませんが、よろしくお願いします。

    • ベストアンサー
    • PHP
  • インターフェイスの使い方がわかりません(初心者です)

    Javaを始めたばかりの初心者です。 「やさしいJava」を買って一通り学んだのですが、 インターフェイスの使い方がよくわからず、困っています。 インターフェイスを実装することでインターフェイスが持つメソッドがすべて定義されてることが保障される、 というのはわかるんですが、そのことがどうして有用なのでしょう? また、具体的にはスレッドを扱うときにRunnableインターフェイスを実装する理由がわかりません。 Threadクラスのオブジェクトを作成するときに、 Runnableを実装したクラスのオブジェクトの変数を 引数にしないといけないんですよね? このとき、Runnableインターフェイスが 「runメソッドが定義されていなければならない」 とだけいうものだったとしたら、 Runnableを実装してなくてもrunメソッドさえ定義してあれば 実行できそうな気がするんですが・・・

    • ベストアンサー
    • Java
  • インターフェース

    インターフェースについて学ぼうと思っているのですが、 どうもいまいち何がなんだかわからなくなっています。 インターフェースはクラスによって実装され、 実装クラスはインターフェースで宣言されている 抽象メソッドを実行する とあるのですが、実装とは何ですか? 抽象メソッドとは何ですか?

    • ベストアンサー
    • Java
  • Java言語のインタフェースについて

    Java言語を学習している者です。 インターフェースについて理解できずに困っております。 ここでは、Runnableインターフェースを例にとります。 (1)正しいコード public class ThreadTest implements Runnable { public static void main (String args[]) { ThreadTest ins = new ThreadTest(); Thread th = new Thread(ins); th.start(); for(int i = 0; i < 10; i++) { System.out.println("main : " + i); } } public void run() { for(int i = 0; i < 10; i++) { System.out.println("run : " + i); } } } (1)のコードは正常に動きます。 (2)間違ったコード (implements Runnableを記述しなかった場合) public class ThreadTest{ public static void main (String args[]) { ThreadTest ins = new ThreadTest(); Thread th = new Thread(ins); th.start(); for(int i = 0; i < 10; i++) { System.out.println("main : " + i); } } public void run() { for(int i = 0; i < 10; i++) { System.out.println("run : " + i); } } } (2)のコードでは、 Thread th = new Thread(ins); で、 コンストラクタ―Thread(ThreadTest)は未定義です。 とエラーが出てしまいます。 確かに未定義なのですが、(1)でも定義していないように思えます。 Runnableインターフェースの働きのお陰だと言うことはわかるのですが、どういった働きによるものなのかがわかりません。 インターフェースのについて、 ・インターフェースのフィールドは必ず定数。 ・インターフェースのメソッドは必ず抽象メソッド。 ・インターフェースはインスタンスを作ることが出来ない。 ・抽象メソッドは必ず実装しなければならない。 は理解しているつもりです。 今回の質問をするに当たって、 RunnableのAPI http://java.sun.com/javase/ja/6/docs/ja/api/java/lang/Runnable.html を見たのですが、それでも理由が分からないので質問致します。 もし宜しかったら、APIの見方についてもコメントして頂けるとありがたいです。 宜しくお願いします。

    • ベストアンサー
    • Java
  • アブストラクトとインターフェースの簡単な一例文

    JAVAについて質問よろしくお願いします。 abstract抽象クラスとインターフェースについて下記理解なのですが、超かんたんな一例など欲しいのですが何かないでしょうか。たとえば package round1.chapter1; public class Helloworld { public static void main(String[] args) { System.out.println("こんにちは!"); } } というような一文です。 ~私の理解~ アブストラクトとは、違ったクラス内で同一メソッドがある場合は親クラスに置き、違ったメソッドがある場合は抽象クラスとして親クラスに置いて、実装はサブクラスに任せるという形式で使われる言葉 インターフェースとは、機能だけを仕様書として書いておき、定義されたとおりのメソッドを実装しないといけないという呼び出し方の統一を図る際に使われるメソッド置き場 ~~~~~ このふたつについてものすごく簡単な使用例を頂きたいです。 よろしくお願いいたします。

    • ベストアンサー
    • Java

専門家に質問してみよう