• ベストアンサー

インタフェース、クラスの継承、コンストラクタ意味

Javaを学習している初心者です。 インタフェース、コンストラクタ、クラスの継承について、 必要な理由が、イマイチよく分かりません。 特に設定しなくても、プログラムは動くと思うのですが・・・ (特にインタフェース) 詳しい方、教えて下さい。

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

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

  • ベストアンサー
  • nda23
  • ベストアンサー率54% (777/1415)
回答No.3

単純な例題などでは必要性を感じないでしょうね。実際不要だし… しかし、プロジェクトが複数で、パッケージが200~300、ソースが 2000以上などと言う規模になると、必要になってきます。 コンストラクタ 早い話がクラスの初期設定です。不要なら空の記述でかまいません。 ただ、面白い使い方があります。コンストラクタの属性をprivate、 あるいは「無し」にします。前者は特定の方法でしかインスタンスを 作れないようにする、後者は同一パッケージ内でのみインスタンスを 作れるようにする場合です。プロジェクトが大きく、これに携わる プログラマの技量にバラつきがある場合、不要な混乱を避けるという 効果があります。また、マルチスレッドで、クリティカルな制御を する場合(複数の処理スレッドが同時に実行された時に混乱しない ようにするための制御)などに使います。 インターフェース これは分かり難い。事実、技量不足のプログラマに作らせると、 とんでもないバグの原因になったりしますので、使い方も難しい。 例え話:会社の支店を考えましょう。支店には必ず支店長、住所が あるものとします。しかし、新宿支店には特設会場があり、渋谷支店 には保養所がある。この状態で支店住所を処理するプログラムがある とすると、支店が新宿なら…、渋谷なら…、○○なら…というように しなければなりませんね。でも、各支店が支店インターフェースを 持ち、これに支店長と住所があると記載されていれば、プログラムは 「支店の住所」とするだけで良いのです。 同様の使い方をするものに抽象クラスというものがあります。 個人的にはこちらの方が好みです。間違いが少ないし、手続実体を 記述することができます。 継承 機能A、B、Cを持つクラスXがあるとします。仕様が変更になり、 機能Dを追加したとします。直接、Xを修正しても良いのですが、 既存機能A、B、Cが影響を受けていないかどうかを再テストする 必要があります。しかし、Xを継承したクラスYを作り、ここには 機能Dだけを記述します。この場合は機能Dのテストだけで十分と 言えます。(作り方がマズイと継承元の機能に影響することもある) クラスYはXを継承しているので、機能A、B、Cを持っています。 また、ある共通機能を持つクラスを独立させておくと、これを使う 場合、このクラスをインスタンス化する必要がありますが、この クラスを継承すると、インスタンス化する必要はなく、自身の メソッドを呼ぶのと全く同じ感覚で実行することができます。 他にも継承の恩恵は数多くありますが、長くなるので、この辺で 止めます。 と、まぁ文章で語るとこんな具合で、どうしても抽象概念しか分かり ませんよね。感覚的に「こういうもんだ」と分かるには実経験を 積んで、いろいろな場面に遭遇するしかないでしょうね。

gookinger
質問者

お礼

たくさんの方の詳しい回答を、戴きまして ありがとうございます。 例題プログラムを、 コマンドプロンプトからせっせと タイプしているレベルなので、 助かります。 コンストラクタもインタフェースも、 何でこんなのワザワザ設定してるんだろ・・・ を、思いながらやってました。 早く悩めるレベル目指して、頑張ります。

その他の回答 (2)

  • kana_m
  • ベストアンサー率40% (26/65)
回答No.2

確かにインターフェースや継承を使わなくてもプログラムは作れます。 ですが、便利な機能であるのに敢えて使わない理由も無いでしょう。 ほとんどの場合インターフェースや継承を使った方が 効率的に設計・製造できますし、何よりフレームワークやAPIなど 既存の便利な仕組みを活用することができます。 例えばjava.utilのListインターフェースなどですね。 コンストラクタはどう考えても必要でしょう。 Javaの言語仕様上、明示的であるにしろないにしろ コンストラクタを使わずにインスタンスを作ることは 推奨されませんし、通常はまず行いません。 逆にコンストラクタを使わなくてよいのでは、 との考えに至った経緯を知りたいです。

noname#94983
noname#94983
回答No.1

・コンストラクタ コンストラクタがないと、インスタンスの初期化処理は、別にメソッドなどで用意し、newしたらそれを呼び出すような形になる。となると、初期化メソッドの呼び忘れでエラーになったりするトラブルが続出するだろう。newすれば自動的に実行されるコンストラクタがあることで、安心してインスタンスが作れる。 ・継承 例えば、AWTとかSwingとかのGUIを使って、ウインドウを表示したプログラムを作る場合、継承を利用すれば、FrameやJFrameといった、既に用意されているウインドウの土台となるクラスを継承して簡単に作れる。、継承がないと、ウインドウを作り、各種のイベントに応じて表示を更新したり動かしたりする処理をすべて自分で書かないといけない。すべてにおいて、そうやって「全部、一から作る」ことになる。ウインドウを表示してボタンをクリックして何か実行、なんてものは、継承を使えばせいぜい数十行でできるが、継承がなくすべて自分で実装するとなると、下手すると千行以上書かないといけない。 ・インターフェース 例えば、ウインドウを使ったプログラムで、ボタンをクリックしたらこれこれの処理をする、というような場合、ActionListenerを組み込んで処理を作る。これは、考えてみると不思議なことだ。ボタンには、ActionListenerなんて入っていない。が、これをaddすると勝手にリスナーを認識して動く。ということは、ボタンは、ActionListenerが入っていないのに、「もし、これにActionListenerが組み込まれたらこう動く」ということをあらかじめ想定して作られている、ということになる。これは、インターフェースにより「こういうふうな機能を持っているもの」ということをあらかじめ定義しておくことができるから可能なことだ。インターフェースにより、さまざまな部品の定義だけをあらかじめ用意し、(実際のクラスはまだないのに)それがあるものとしてプログラムを作っていける。そして、後から必要に応じて実際のクラスを作って設定すれば、ちゃんと動いてくれる。インターフェースを実装しさえすれば、どんなクラスでもそこにはめ込んで動かせる。こういうプログラムをプラグイン的に組み合わせてちゃんと動くようにできるのは、インターフェースがあるからこそだ。

関連するQ&A

  • 親クラスのコンストラクタは? 引数付きコンストラクタは?

    VisualBasic.NETです。 あるクラスを継承したクラスからインスタンスを作成したときに、派生クラスのコンストラクタは呼び出されると思うのですが、基本クラスのコンストラクタはどうなるのでしょうか? JAVAのように、super() で呼び出す必要があるのでしょうか? 自動で呼び出されるのでしょうか? それとも、そもそも呼び出せないのでしょうか? また、引数の個数が違うコンストラクタは、同じクラス内に設定できるのでしょうか? JAVAのコードを移植しようと考えているのですが、出来るのかどうかが分からずに悩んでいます。 ご存じの方、よろしくお願いします。

  • インターフェイスは何故必要か

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

    • ベストアンサー
    • Java
  • Javaでは多重継承ができない、の意味が分からない

    「Javaでは多重継承ができない」「インターフェイスでは多重継承できる」の意味が分かりません。 「インターフェイス」の多重継承とは、あくまでも擬似多重継承であって、本当の多重継承とは機能が異なる、ということなのでしょうか? それとも、多重継承はあくまでもクラスに対して行う言葉であり、それをインターフェイスで実現しているから、擬似なのでしょうか? つまり、機能としては完全に多重継承と同一? あるいは、それ以外? インターフェイスで可能なら、Javaで多重継承ができないという表現はおかしいように思うのですが…。 例えば、Javaのクラスでは多重継承できない、という言い方だと、また違った意味になるのでしょうか?

    • ベストアンサー
    • 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
  • コンストラクタの記述について ―引数を持ったクラスを継承する場合―

    コンストラクタの記述について ―引数を持ったクラスを継承する場合― ActionScript3.0でプログラミングをしています。 クラスの継承に挑戦したのですが、うまくいきません。 コンストラクタの記述は、何か特別なものが必要なのでしょうか? ■コンストラクタに引数なし → 成功。 ■コンストラクタに引数あり → 失敗。  エラー「No default constructor found in base class <親クラスの名前>」。 ■エラーの出るソース↓ ・Main.as(コンストラクタ内抜粋)     var parent:Parent = new Parent(100);     var child:Child = new Child(200); ・Parent.as package {   import flash.display.Sprite;      public class Parent extends Sprite {     protected var str:String = "親クラスのプロパティ";     public function Parent(inNum:Number):void {       trace("親クラス, ", str, inNum);     }   } } ・Child.as package {   import Parent;   public class Child extends Parent {     public function Child(inNum:Number):void { //■エラー。       trace("子クラス, ", str, inNum);     }   } } ご存知の方、よろしくお願いします。 よろしくお願いします!

    • ベストアンサー
    • Flash
  • java.util.ArrayListクラスの継承

    Java5年ぶりでちょっと新しい仕様について教えてください。。 java.util.ArrayListクラスを継承したクラスを作成しようと思っているのですが、継承後のクラスでも ArrayListChild<E> というような記述を有効にするには、一体どのような処理をすればよいのでしょうか。 そもそも、<E>とコンストラクタの後などに付けるこの仕様、なんて名前の仕様なんでしょうか。 よろしくお願いします。

    • ベストアンサー
    • Java
  • 継承における暗黙のデフォルトコンストラクター

    ”継承の際、スーパークラスで引数なしのコンストラクターが省略せずにきちんと記述されるなら、そのサブクラスでコンストラクターを記述しなくても、スーパークラスの引数なしのコンストラクターが受け継がれるためコンパイルエラーがおきない。”のは分かりますが”スーパークラスで引数なしのコンストラクターが省略され、かつサブクラスでコンストラクターを省略した場合”はなぜコンパイルエラーがおきるのでしょうか? 暗黙の内にスーパークラスにコンストラクターが生成され、それがサブクラスに受け継がれることは出来ないのでしょうか? 宜しく願います。

  • コンストラクタについて

    VCの勉強をしています。 ちょっとショッキングなことを聞いてしまいました。 クラスのインスタンスを作成した場合、 コンストラクタは継承もとのコンストラクタもよばれる?? これって本当ですか!! MFCだとクラスの階層はだいぶ深いです。 例えば基本のCviewなんかはCObject>CCmdTarget>CWnd>Cviewの順に継承されています。 MFCでは更にCViewを継承したCTestViewなんてクラスがコードの主役です。 それでCTestViewのインスタンスを作成した場合、 コンストラクタはCTestViewのコンストラクタだけ実行すると思いますが、 ショッキングな内容ではCViewのコンストラクタも実行されてます。 これって本当にそうなるのでしょうか。 もし、そうならコンストラクタはてっぺんのCObjectから順に実行されますか。 それとも1つ上の継承先だけですか。 また、何でこんな仕組みにする必要があるのですか? 更にいえばCObjectにはSerializeという関数があります。 これをCTestView.serializeとした場合、 CObjectから順々にSerializeが呼び出されているのでしょうか? そんなことあるわけないよと、あまりにもバカバカしいのですが、 知人がそうだと言い張るのでよろしくお願いします。

  • 抽象クラスを継承してクラスを作成の作り方が分かりません

    -------------------------------------- Employee -------------------------------------- -name : String #coin:double -------------------------------------- +getName():String +setName(String name):void +getcoin():double +setcoin(double Salary):void -------------------------------------- 抽象クラスを継承してクラスを作成 car1.java car2.java Employee.javaはIEmployeeを継承 IEmployee.javaは、メソッド"String getRoleName()を定義するインターフェース IEmployee.javaも作成 Sample.javaを実行し次の結果を得られるように作成 どなたか分かる方がいましたら教えて下さい。宜しくお願いします。

  • 【.NET】コンストラクタをあとで呼出す方法

    .NET初心者です。 今VB.NETでVB6向けの自作COMクラスライブラリを作成しています。 自作クラスはStreamWriterクラスのラッパークラスとしてStreamWriterと継承関係にあります。 COMは引数なしのコンストラクターを一つ用意しなければなりませんが、 StreamWriterクラスは引数なしのコンストラクタを用意されていないため困っています。 自作クラス自身もFileクラスのラッパークラスで引数として使う必要があるため 継承関係を維持してVB6に公開する必要があります。 この問題をなんとか解決する手法って存在するのでしょうか? ちなみにほかに考えた手法は下記です。 ・プロパティーに StreamWriterのインスタンスを用いて継承関係なしであとでinitメソッドを呼び出す   →Fileラッパークラスの引数でStreamWriter型に代入出来ないため不可 ・StreamWriterを引数に取るメソッドの実装をあきらめる   →極力したくない ・StreamWriterラッパークラスの引数なしコンストラクタでStreamWriterクラスの引数ありコンストラクタを呼ぶ   →後でファイルのパスを指定する方法が見つからないため不可 他言語はそれなりにやってきたのでコンストラクターをあとで呼び出すなんて出来ないのはなんとなくわかるのですが何せ.NETを触り始めたのが最近なのでよろしくお願い致します。

専門家に質問してみよう