- ベストアンサー
インターフェイスと抽象クラスの違いと特徴
- 抽象クラスは、決まっているメソッドと決まっていないメソッドを持つ場合に、後からオーバーライドすることができます。
- インターフェイスでは変数は定数になり、メソッドは名前のみの宣言となります。
- 抽象クラスとインターフェイスの違いは、定義の仕方や使い方などにありますが、メリットとしてはインタフェースの配列でインスタンスを生成することができるという点が挙げられます。
- みんなの回答 (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には、どのボタンが押されたのか、どの座標で押されたのか、といった情報が格納されています。
その他の回答 (1)
- Sephy
- ベストアンサー率35% (7/20)
たとえば以下のようなメソッドを定義することができます。 public void Start(Runnable r) { r.run(); } このメソッドは、Runnableをインプリメントしたクラスのインスタンスならなんでも引数に取ることができます。 例えば、RunnableをインプリメントしたクラスAと、Runnableをインプリメントした別のクラスBを用意したとします。 ですがこのメソッドの前ではクラスAもクラスBもどちらもRunnableとして扱うのです。 インターフェースはメソッド名とその引数を定義できます。インターフェースをインプリメントしたクラスはその実装を「必ず」書かなければなりません。 つまり、そのインターフェースをインプリメントしたメソッドには、必ずそのインターフェースで定義されたメソッドが存在するという保証される、と考えたらわかりやすいでしょうか。 >Runnable、やMouselistenerはメソッドの内容が書かれていないのに、 >なぜ機能を持たせることが出来るのでしょう??? についてですが、Mouselistenerを例にするのがわかりやすいでしょうか。 Mouselistenerをインプリメントしたクラスを、addMouseListenerでウインドウに追加したとします。 このときウインドウは、マウスがクリックされたときはmouseClickedメソッドを、離されたときはmouseReleasedメソッドを・・・といったようにメソッドを呼び出します。 つまりこれらのメソッドを呼び出すのはプログラマではなくウインドウ(OS)です。 ウインドウがこのメソッドを呼び出したとき、どう動けばいいか、がインターフェースの実装なわけです。 >機能を持たせることが出来るのでしょう??? のところを勘違いしているのかもしれません。マウスがクリックされても、OSは「マウスがクリックされましたよ」と教えてくれるだけなのです。 クリックされたらどう動くか、は自分で書くのです。つまりこれが実装、「機能を持たせる」です。
補足
お早い回答ありがとうございます! はじめの数行のところは難しくてよくわかりません^_^; class A implements Runnable{} class B implements Runnable{} とあったとすると、 Runnable a = new A(); Runnable b = new B(); と出来る、と言うことでいいでしょうか・・・?? >つまり、そのインターフェースをインプリメントしたメソッドには、必ずそのインターフェースで定義されたメソッドが存在するという保証される あー、はい確かにこちらのほうがわかりやすいです! >機能を持たせることが出来るのでしょう??? ええとですね・・・ たとえば、Mouselistenerをインプリメンツした場合にはMouseclickとかEnteredとかのメソッドを定義しなければならないですよね。それわわかるんですが、たとえばMouseClick()が"マウスがクリックされたら実行するメソッド”だとして"マウスがクリックされたぞ”と言うイベントを受け取る機能はどうやって実装するのかなと言うことなのです。書いてきてなんとなくわかったのですが、それがMouseEventでしたね・・・? これでただしいですか?
補足
ありがとうございます。 勘違いでした^_^; >java.awt.Componentクラスには、addMouseListener なるほどーーーよくわかりました!