• ベストアンサー

interface,extend,implementのちがい

お世話になります、 Javaを勉強しているのですが、 interface,extend,implementの使い分けがわかりません。 私の解釈としては、 (1)interfaceは、グローバル変数の定義、グローバルメソッドの定義(実装はしない)。 (2)extendは、extendクラスを親クラスとして親クラスの機能を使用できる。 (3)implementは…,implementもextendと同じような意味だと解釈しているんですが、違う点は、implementで定義してあるメソッドは、使用しなくても、実装しなければならないという点でしょうか? とにかくこの3つのを使い分けるコツとかあれば教えてください。 よろしくお願いします。

noname#1752
noname#1752
  • Java
  • 回答数3
  • ありがとう数24

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

  • ベストアンサー
  • kokucho81
  • ベストアンサー率61% (157/255)
回答No.3

バラバラに理解してもしょうがないッス。 まず、 (1)interface と implements (2)class と extends が対応しているわけっす。 JavaはC++と違って、比較的言語仕様を「簡単」にしたので「多重継承」という 概念がないです。 多重継承っていうのは、複数のクラスを親クラスにして継承するってことですね。 たとえば、 「TextFieldクラス」と「Japaneseクラス」を多重継承すると、 「JTextFieldクラス」ができるっていうのが自然な考え方でしょう? まぁ、例えば、日本語クラスであれば、getStringLength()メソッドなどが あったほうが良いでしょうか。 このgetStringLength()メソッドは、2バイト文字も1バイト文字も「1文字」 と数えてくれると言う点で、まさに、日本語クラス用のメソッドだと言えるでしょう。 例えば、Java的に記述すると、、、 class Japanese { public int getStringLength() {   ・・・ return strlength;  }  ・・・ } class TextField { ・・・ } class JTextField extends TextField, extends Japanese { ・・・・ } C++ではそのように実装するでしょう。 しかし、Javaにはこのような高度な機能はありません。 そこで、生まれた苦肉の策が、「interfaceとimplements」です。 interface Japanese { public int getStringLength(); // interfaceは実装を含まない!                  // すなわち「実装の継承」ができるわけではない。 } class TextField { ・・・ } class JTextField extends TextField implements Japanese { ・・・・ public int getStringLength() {   ・・・ return strlength; //implementsの実装を「各クラスで」実装してやる必要がある。  } } 結局のところ、Javaでは、複数のクラスを親クラスには持ち得ないため、継承できなかったクラスは「各クラスで実装してやる必要性」があるのです。 ではどのように使うのが効果的か? なまえのままです。「代表的なインターフェイス」にたいしてinterfaceを使うのが良いと思います。 例えば、プレイヤー系であれば、ビデオ・コンポ・ウォークマン・などにかかわらず、 interface controlpanel { public play(); public stop(); public next(); public back(); } というような基本的インターフェイスを「持っているべき」です。 こうすることで、それぞれのクラス宣言の際に、これらの「インターフェイスを持っているべきであり、実装されるべきである」ということを「強く暗示」することができます。 class videoplayer extends player implements controlpanel { public play() {・・・} public stop() {・・・} public next() {・・・} public back() {・・・} } こうすることで、同様のクラスを作成するユーザーは、 「プレイヤー系は、4つ操作が出来るコントロールパネルをインターフェイスとして持つべきなのだな!?」という暗示を受け取り、自分のクラスでもそれを模倣するでしょう。 class mp3player extends player implements controlpanel { public play() {・・・} public stop() {・・・} public next() {・・・} public back() {・・・} } また、これらのクラスを使用するユーザーも、「implements controlpanel」という 表記を見て、「4つの基本操作は押さえられているのだな!」という基本中の基本動作を抑えることが出来ます。 まとめると、クラスに「こういう特徴もたしてください!」「こういう特徴持ってますよ!」という一種の暗示的警告や方向性を与えることができるわけですね。

noname#1752
質問者

お礼

とてもわかりやすくて、講義を聴いているようでした。 implementできるクラスはインターフェースだけと言うことでしょうか? まだまだ勉強不足です。

その他の回答 (2)

  • sueoka
  • ベストアンサー率38% (24/62)
回答No.2

#1のsueokaです。 自分で読んでいても「分かり難いなあ」とか思ってしまったので、補足です。(笑 1)のインターフェースですが、これは「共通規格」の様な物です。  例えば「USB」と言う規格(?)がありますが、「USB対応」と言う機器なら  どのメーカーのでもUSBコネクタに繋げる事が出来ますよね。  でも、実際にやり取りするデータの中身はどれもこれも違います。  が、「USBポートを通してデータのやり取りをする」と言う表面上の  処理名は同じです。その処理方法(データの内容など)が異なっていたりするわけです。   このインターフェースは個人で小規模のアプリケーションを作成する分には  考える必要はないと思います。使って直ぐに利便性が得られるものではないと  思います。良い具体例が思い浮かばないのですが・・・ActionPerformedって  ありますよね。ボタンクリックした時などにどんな処理をおこなうかを記述する  部分ですが、何もこのメソッドはボタンだけに在るわけでは在りませんよね。   色々なコンポーネントがこのインターフェースを実装していて、「ユーザーが  そのコンポーネントに対してアクションを起こした」と言う共通の動作によって  呼び出されるメソッドです。そして、VM内部で何かしらのアクションをキャッチした時に  それが何かを調べる必要が在るわけですが、もしもインターフェースが無い場合には、  ボタンであるか、コンボボックスであるか、チェックボックスであるかと一つ一つ  場合分けをしなくてはいけなくなります。後々、コンポーネントの追加をしようと思ったら  これは大変ですね。でも、ActionListenerインターフェースを実装していれば、  何のコンポーネントだろうとActionPerformedを呼び出せば良いのです。   凄い長くなってしまいましたが、「実装元を気にせずに使える関数」  を宣言する時にインターフェースを使うのではないでしょうか。 2)のextendは親クラスに新しく機能を追加する時に使いますよね。 3)のimplementはインターフェースを実装する時に使います。 長ったらしい補足ですみませんでした。

noname#1752
質問者

お礼

なるほど、勉強になります。 ActionPerformedとかはJBUILDERとかを使用しているのでコンポネントのダブルクリックとかで簡単にやってたんですけど。意味わかってなかったかも知れないです。 ありがとうございました。

  • sueoka
  • ベストアンサー率38% (24/62)
回答No.1

いまいち自信が在りませんが・・・ 1)はメソッドの名前と変数だけを提供するクラスを作成する時に  使用するものだと思います。  例えば、「FileAccess」のインターフェースクラスを作成して、  メソッドとして「FileRead」と「FileWrite」を用意したとしましょう。  すると、このインターフェースを実装しているクラスなら、どれでも  この二つのメソッドを持っている事になるので、そのクラスに対して  気兼ねなく(?)メソッドの呼出しが出来ます。   FileAccessインターフェースを実装しているクラスであればどれでも、  ファイルの読み書きを提供していると言う事になるわけです。   インターフェースは多くのクラスで共通の関数名を使えるようにするものだ  と、僕は思っています。(処理の内容自体はクラスによって異なりますが。) 2)の「extend」は親クラスを継承して新しく子クラスを作成する時に  使用します。文字入力域の子クラスを作成して半角文字しか入力できない  オリジナルの入力域クラスを作成する時などに使います。 3)の「implement」はインターフェースを実装する時に使うものだと  思っています。例えば、2)で作成したオリジナル入力域に対して  「FileAccess」インターフェースを実装すると、  ファイルの読み書き機能を搭載した半角文字しか入力できないオリジナルの  入力域を作成する事が出来ます。 以上でどうでしょうか?かなり大まかな説明ですが。 意味不明な部分が在りましたら、補足します。

noname#1752
質問者

お礼

ありがとうございました。 ちなみに、JTextFieldを継承した新しい機能を持ったTextFieldを作成するにはどうすればいいのかなあ… って感じで今悩んでます。

関連するQ&A

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

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

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

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

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

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

  • インターフェース

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

    • ベストアンサー
    • Java
  • Interface変数について

    C#勉強初めて間もない者です。 Interfaceについて教えて頂きたい事あります。 Interfaceとは規約を定める為のクラスで、メソッドは定義してあるだけで中身はそのInterfaceを継承したクラスで実装する物だと認識しています。 そこで以下のようなコーディングに出会い混乱しました。。。 IList loList = "22,22,".Split(','); ※へたくそな例ですがお許し下さい 上記のコーディングで、中身のないインターフェイスのloList変数が何故抽象メソッドして定義されている「Add」やプロパティ「Count」が使えるようになるのでしょうか? ご質問に答えて下さる方いらっしゃいましたら宜しくお願いします。

  • フレームワークによくあるインターフェースについて

    たとえばSpringだとInitializingBeanインターフェースを 実装してafterPropertiesSetメソッドに処理を書くことによって Beanを初期化したときにその処理が実行されるようですが、 これはどのような仕組みでそのインターフェースを実装しているか どうかを判断しているのでしょうか? getInterfacesメソッドを使うとそのクラスが実装している インターフェースを調べることができるようですが、 これは親クラスのインターフェースまでは調べられないようですし、 フレームワークはどのようにしてそのクラスが実装している インターフェイスを判定しているのか不思議です。

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

    「インタフェースを実装してそれが持つ抽象メソッドをオーバーライドする」は正しい? はじめまして。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
  • インターフェースについて

    いまサーブレットをやっています。 Java言語仕様では、 「インターフェースの定義には、メソッドの定義を書いてはいけない」 (メソッドの定義はそのインターフェースをimplementsしたクラスのなかで オーバーライドする) ということになってますよね? …でも、 APIリファレンスを読むと、 インターフェースHttpServletRequestのメソッドgetParameterには、 「リクエストパラメータの値をString型として返す」と書かれています。 ↑これって上記のJava言語仕様と矛盾してませんか? まるでどこかでgetParameterメソッドの定義がなされているかのようです。 これってどういうことでしょう? 考えれば考えるほど、訳わかりません。とっても混乱中です(-_-)

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

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

    • ベストアンサー
    • Java
  • インターフェースとサブクラスはどっちを使えばいい?

    ある機能Aを持ったクラスを作りたいとき、次の二つの方法があると思います。 (1) サブクラス → 機能Aを持ったクラスを拡張したサブクラスを作る。 (2) インターフェース → 機能Aを実現するメソッドをまとめてインターフェースにし、そのインターフェースを実装するクラスを作る。 これらの使い分けはどうすればよいのでしょうか?つまり、どういうときに(1)を使ってどういうときに(2)を使えばよいのでしょうか? 私が現在思いつく(1)と(2)の違いは以下の二つです。 ・(1)の方法は手軽 ・(1)の方法だと、一つのクラスの拡張しかできない これくらいでしょうか。もっと本質的な違いはあるのでしょうか?

    • ベストアンサー
    • Java