• ベストアンサー

interface

javaを勉強中ですが、interfaceで分からなくなっています。 いったいこれは、どのような状況でつかうのでしょうか。 どういった利点があるのか分かりません。 interfaceを宣言しないで必要なときに実装するのではなにか不都合があるのでしょうか。 よろしくご教授下さい。

  • retr
  • お礼率90% (27/30)
  • Java
  • 回答数2
  • ありがとう数2

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

  • ベストアンサー
  • UKY
  • ベストアンサー率50% (604/1207)
回答No.2

Javaでは、クラスを拡張するときの親クラスはただ1つだけです。 例えば、あるクラスがクラスAとクラスBを同時に拡張する、というようなことは出来ません。 しかし、インタフェースはいくらでも実装できます。 例えば、スーパークラスが違う2つのクラスに、同じメソッドを実装させたい場合、親クラスが違うので抽象クラスのサブクラスを作る方法は使えません。しかし、それぞれのクラスに同じインタフェースを実装させることは出来るのです。 あるいは、ある抽象クラスを拡張し、同時にあるインタフェースを実装するクラスを作ったり、複数のインタフェースを1つのクラスが一気に実装して、いろんな機能を持つクラスを作ったり、様々な使い方が可能です。 抽象クラスとインタフェースは確かにいくらか似たような性質を持っています。抽象クラスはそのクラスの役割の本質を決定する、インタフェースはクラスに機能を追加する、というような感じです。 最初の方の回答にある例では、インタフェースの代わりに抽象クラスを使うことも出来ますが、クラスの継承関係がもっと複雑になってくると、インタフェースの役割が重要になってきます。

retr
質問者

お礼

なるほど、interfaceの方が使い回しがきくのですね。ようやく分かってきました。確かに、自分はシンプルな場面しか考えてなかったです(^ ^; ありがとうございました。

その他の回答 (1)

回答No.1

interfaceとはすなわちそのクラスの顔です 具体例をあげると --interface public interface School{ public String getKnowledge(); } --sub class1 public class JuniorHighSchool implements School{ public String getKnowledge(){ return "数学"; } } --sub class1 public class ElementarySchool implements School{ public String getKnowledge(){ return "算数"; } } 以上の2つのサブクラスはSchoolでキャストすることができます、つまりサブクラス名(ElementarySchool,JuniorHighSchool)を意識しないでこれらのクラスを使用することができます。 --main class public class Factory{ public void main(String arg[]){ School school; if (arg[]==1){ shool = new JuniorHighSchool(); }else{ shool = new ElementarySchool(); } System.out.println(this.getSubject(shool)); } private String getSubject(School shool){ return school.getKnowledge(); } } こんな感じに使います。SchoolをInterfaceに持っているおかげでgetSubject(School shool)メソッドは1つだけですみますSchoolをInterfaceに持っていないと それぞれのクラス用のgetSubjectを作らないといけないことになりなります (getSubject(JuniorHighSchool shool)と  getSubject(ElementarySchool shool))というような こんな感でどうでしょうか、まだ使い方はいろいろあると思いますけど。。。

retr
質問者

お礼

回答ありがとうございます。 今までPerlやPHPを使っていたのですが、 特にオブジェクト指向を使うことがなかったため、 簡単なコードを読むのにも苦労します(^ ^; 頂きました回答で、なるほどと思ったのですが、これは、JuniorHighSchoolとElementarySchoolのスーパークラスを作って継承した場合でも可能なような気がするのです。 抽象クラスとinterfaceの違いを教えていただけると大変助かるのですが... (まとはずれなことを言っていたらすいません。)

関連するQ&A

  • インターフェース

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

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

    Javaを勉強中の者です。宜しくお願いします。 JavaのAPIの中で、Observerはインタフェースとなっています。Observerが普通のクラスではなくてインターフェイスとなっているのはなぜなのでしょうか? インターフェイスだと、複数の継承が可能になるからでしょうか?でももしそうなら、あるクラスAがObserverだけを継承している場合は、複数継承ではないので、Observerをインターフェイスにする必要がなくなりますよね。。という事は、他にもこのObserverをインターフェイスにする利点(理由)があるのでしょうか? どなたかご教授をお願いします。 Observerについては、下記のサイトを参考にしました(http://www.fuka.info.waseda.ac.jp/~washi/m_html/node12.html#observer)

    • ベストアンサー
    • Java
  • インターフェースの利点は?

    Javaを勉強しております。 インターフェースの使い方を知ったのですが、その利点がわかりません。 インターフェースの記述の仕方はクラスによく似ていますが、インターフェースでできること(フィールドやメソッドを書く)はクラスでもできると思います。 インターフェースでしかできないことはあるのでしょうか? インターフェースはどのような場面で活用するのが有効なのでしょうか?

  • RubyでJavaのInterfaceに相当するものはありますか?

    RubyでJavaのInterfaceに相当するものはありますか? Ruby 上で Javaの interface のようなものものを実現するには、どうしたらよ いのでしょうか? Rubyは型を宣言しないので機能的には interface は不要ですが。 クラスを実装する人に、あるクラスに実装しなければいけないメソッドを伝える (強制する)目的としての interface 的な使い方をしたいのです。 宜しくお願いいたします。

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

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

    • ベストアンサー
    • Java
  • インターフェイスは何故必要か

     Javaの初心者です、宜しくお願いします。  Javaには継承という仕組みがあるのに何故インターフェイスという 仕組みが必要なのでしょうか。  勿論、2個の親クラスからの継承を嫌ったのはなんとなく理解出来るのですが それなら子クラスでインターフェイスの機能を別途作ってやれば、わざわざイン ターフェイスという仕組みを考える必要がないと思うのですが。  親クラス、子、孫、またその孫としてやり、そのどれかのクラスに インターフェイスの機能を持たせれば良いだけと考えるのですが。  インターフェイスのメッソドを全て実装する必要とかもなくなると思うのですが。  以上宜しくお願いします。

    • ベストアンサー
    • Java
  • インターフェースの使い方。

    javaを勉強している者です。あるコードを読んでいるのですが、そのなかでインターフェースで宣言しているインターフェース(日本語変な気がしますが)を別のクラスで、クラスみたいに宣言しているようなコードがあるのですが、それは文法的に大丈夫なのでしょうか?具体的には public interface MailStore{//いくつかのメソッドなど} というのがMailStore.javaで書かれていて別のMain.javaというコードの中で priate static MailStore _mailStore; public static MailStore getMailStore(){return _mailStore;} という2行がこの中で書かれています。 よろしくお願いします。 (ちなみにコードは「EclipseによるJava実用プログラミング」という本によるものです。下記のURLからダウンロード可能で、mailというディレクトリの中のコードです) https://products.locus.co.jp/index.php3​

    • ベストアンサー
    • Java
  • Java interface

    Javaにおいて interfaceとClassは何が違うのでしょうか? またClassの中にinterfaceを書いても良いのでしょうか? Classの中にinterfaceを実装する物なのでしょうか? 恥を承知で質問致します。答えて頂けると嬉しいです。

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

    andoroidプログラミングを勉強している初心者です。 インターフェースの実装 というのが全くわからず困っています。 インターフェースはテレビのリモコンみたいなものだ、と本でみたことがありますが 意味が全くわかりません。 class クラス名 implements インタフェース名 { : } でインターフェースが実装できるということですが、 何のためにこれをやるのでしょうか?

    • ベストアンサー
    • Java
  • インタフェースのメソッド

    最近仕事でJAVAを使うことになり勉強し始めたのですが、分からないことがあります。 たとえばHTMLからPOST要求を受けるサーブレットでセッションを取得する際、 doPost(HttpServletRequest req , HttpServretResponse res){ HttpSession session = req.getSession(true) … } としますが、このgetSessionメソッドの中身はどこで実装されているのですか?reqインスタンスはHttpServletRequest型としか指定していませんが、HttpServletRequestはインタフェースなのでメソッドの実装をしていないと思うのですが・・・。 知らなくても「こうするものだ」と思っておけば問題はないのでしょうが、しっかり理解しておきたいのでよろしくお願いします。

専門家に質問してみよう