Javaベース - 抽象クラスとインタフェース(RPM)

      抽象クラスとインタフェースは、その存在は、Javaに強力なオブジェクト指向の機能を与えていたからこそ、抽象的な概念を定義する2つのメカニズムのJava言語です。彼らも交換可能、非常によく似た2つの抽象概念間のサポートを持っていますが、違いがあります。

 

      まず、抽象クラス
       我々はすべてのすべてのオブジェクトはクラスによって記述されているが、すべてのクラスは、オブジェクトを記述するために使用されないが、すべてが、オブジェクト指向の領域内のオブジェクトであることを知っています。クラスは十分に特定のオブジェクトを記述するための情報、およびそれをサポートするために、他の特定のクラスの必要性を持っていない場合は、これは我々が抽象それを呼び出すクラスです。たとえば、新しい動物が()、我々はすべて、これは動物の動物のオブジェクトを生成しているが、この特定の動物たちが知らないものに育つことを知って、それは動物の特定の概念がありませんので、彼は抽象クラスであり、我々は特定の動物を必要としますイヌ、ネコはその具体的な説明を行うようにと、私たちはそれを長いChengshayang知っています。

      特定の問題領域は、抽象クラスに対応していないで抽象的な概念のオブジェクト指向の概念のフィールドので、それがインスタンス化された抽象化を特徴づけることはできません。

      一方、抽象クラスは、データ抽象化のアイデアを具現多型を実装するためのメカニズムです。これは、抽象メソッドのこのグループの具体的な症状を実装するクラスを派生しているために、抽象メソッドのセットを定義します。一方、抽象クラスを継承の概念を提供し、その出発点のいずれかの感が継承することで、それ以外の場合は存在しません。だから、継承レベル抽象クラスノードのチェーンにしながら、抽象クラスの継承の定義は、使用する必要があり、リーフノードは、特定のカテゴリでなければなりません。(このような理解が間違っているのだろうか!!!専門家の指導を....)

      抽象クラスのポイントを使用する場合は注意します:

         1、抽象クラスはインスタンス化作業が完了するまでにそのサブクラスに引き渡されるべき、インスタンス化することはできません、それは参照のみを持っている必要があります。

         2、抽象メソッドは、サブクラスでオーバーライドする必要があります。

         図3に示すように、限り、抽象クラスが抽象メソッドを含むように、方法に関係なく、また、含まれる他の方法が存在するかどうかの、抽象クラスとして定義されなければなりません。

         図4は、抽象メソッドを含まなくてもよい、もちろん、特定の抽象クラスのメソッドを含んでいてもよいです。

         図5は、同じ名前の抽象サブクラスは、親クラスの抽象メソッドにすることはできません。

         6、抽象は、同じクラスのために結ばれ、最終的に変更することはできません。

         図7に示すように、ネイティブまたは改変方法プライベート抽象的ではなく、静的、最終的なタイ。

      例:

      猫、犬が叫び()メソッドを実装する必要がありますので叫び()メソッドは、抽象的であるため)叫び(という抽象メソッドを提供し、抽象動物の動物を定義し、ネコ、イヌは、動物のサブクラスです。次のように:


抽象クラス動物{公共
;パブリック抽象ボイドクライ()
}

{パブリッククラス猫動物を拡張

@Override
公共ボイドクライ(){
;のSystem.out.println( "ニャー...ニャー")
}
}

publicクラスの犬{動物ザは延び

@Override
公共ボイドクライ(){
;:のSystem.out.println( "樹皮...犬")
}

}

publicクラステスト{

公共の静的な無効メイン(文字列[] args){
動物新しい新しい猫A1を= ();
動物犬新しい新しいA2 =();

a1.cry();
a2.cry();
}
}

------------------------- -------------------------------------------
出力:
ニャー:ニャーニャー...
犬の吠え:吠え...


      抽象クラスと抽象メソッドを作成します。彼らが明確なの抽象クラスを作成し、それらを使用する方法およびコンパイラをユーザーに伝えることができるので非常に便利です。彼らは私たちが簡単に公衆にできるので抽象クラスには、便利な再構成でありますこの方法は、継承階層に沿って上方に移動します。(投稿者:Javaで考えます)

 

      第二に、インターフェイスの
      インターフェイスはの抽象クラスよりも抽象的である「クラス」。ここで私が表現するより良い言葉を見つけることはできませんが、我々は明確にポイントされている必要があり、引用符「のように」、インタフェース自体は、私たちは一つのインタフェースからインスタンス化することはできませんクラスを見ることができるではありませんします。新しいRunnableを()として、確かに間違っている、私たちはその新しいクラスを達成することができます。

      プロトコルは、クラスとクラスの間のインタフェースを確立するために使用され、それは、特定の実装せず、唯一の形態を提供します。インターフェースは、彼がグループを表し、または特定のインターフェイスに従うクラスにimplementsキーワードを使用してインターフェイスのすべてのメソッドを実装する必要があります実装するクラスを実現しながらも、「インタフェースのみ、その外観を言ったが、今我々は、それがどのように動作するかを宣言する必要があります。」

      インタフェースは、抽象クラス、Javaのデータのセキュリティを保証することはできません多重継承の拡張子は、その継承が一つだけの親クラスが存在しているが、異なるインタフェースは、クラスが同時に複数のインタフェースを実装することができ、これらのインタフェースの間には関係は関係なく、存在しませんそのインターフェースは、抽象クラスのために欠陥の多重継承を作ることはできませんが、データのセキュリティを確保することができ、複数の継承を実装することができますように、一般的な継承とインターフェイスを使用することをお勧めします。

      インタフェースを使用しての過程で、以下の質問に注意を払う必要があります。

         すべての当事者が法1にアクセスし、インターフェイスは自動的にpublicとして宣言すること。むしろのみ公開し、もちろん、あなたが保護され、民間の宣言を表示することができますが、コンパイラが間違って行くでしょう!

         図2に示すように、インターフェースは、「メンバ変数」を定義することができ、または「メンバ変数」のインタフェースが自動的にパブリック静的最終的に変化するので、不変の定数です。ImplementClass.name:あなたは、クラス名から直接アクセスすることができます。

         図3に示すように、インタフェースに実装された方法は存在しません。

         4、インタフェースを実装する非抽象クラスは、インタフェースのすべてのメソッドを実装する必要があります。抽象クラスは、達成することはできません。

         図5に示すように、新たなオペレータインタフェースをインスタンス化するために使用することができないが、インターフェイスは、そのインターフェイスを実装するオブジェクトのクラス(を参照)を参照する必要があり、変数を宣言することができます。あなたは、オブジェクトが特定のインタフェースを実装しているかどうかをチェックするためにinstanceofを使用することができます。例えば:(anObjectが比較INSTANCEOF)場合、{}。

         図6に示すように、メソッド名を繰り返すことを避けなければならない複数のインタフェースを実装する場合。

 

      第三に、抽象クラスとインタフェースの違い
      であっても同じ大きなポイントの抽象クラスとインタフェースの間に存在しているが、とは時々も交換することができますが、これは、それらの間の差異を補うことはありません。抽象クラスとインタフェースの設計レベルと2レベルの側面から、次の構文を詳しく説明します。

      3.1構文レベル
      シンタックスレベルでは、抽象クラスとインタフェースのJava言語は、異なる定義が与えられています。デモは、それらの違いを表示するには、次のクラスがあります。

      実装する抽象クラスを使用します。


パブリック抽象クラスデモ{
抽象ボイド法1();


ボイド方法2(){
//实现
}
}

       達成するためのインターフェイスを使用

インタフェースデモ{
ボイド法1()。
空法2();
}

       抽象クラスは、抽象クラスは、メンバーデータの任意の範囲を持つことができますが、また、独自の非抽象メソッドを持つことができますが、インターフェースモードは、それが唯一の静的データメンバーを変更することはできませんことができます(しかし、我々は、インタフェースに一般的ではありませんすべてのメソッドは抽象的でなければならない一方で、)メンバーデータを使用しています。ように、インターフェースは、抽象クラスの専門です。
      サブクラスが懸念している、それだけで(データセキュリティの考慮事項のためのJavaである)抽象クラスを継承することができますが、複数のインタフェースを実装することができます。

      3.2デザインのレベル
      だけでそれらの間の関係を区別するための構文やプログラミングの観点のレベル以上、これらは低レベルです、抽象クラスとインタフェースの本当に良い使用のために、我々はより高いレベルから区別しなければなりません。それだけで自分の本質の設計思想の視点から見ることができます。一般的に、彼らは次のように三つの異なる点は存在します。

      1、抽象化の異なるレベル。抽象クラスは抽象クラスで、インターフェイスは抽象的行動です。抽象クラスは、属性、行動を含む全体の全体のための抽象クラスですが、インターフェースは、部分的(行動)抽象的に基づいています。

      図2に示すように、異なるクロスドメイン。クロスドメイン抽象クラスは、同様の特性を持つクラス、およびインタフェースクロスドメインが、異なるクラスです。私たちは、抽象クラスをサブクラスの公開部分で発見されていることを知っている、と抽象クラスへの一般化は、サブクラスは親クラスができ継承しますが、異なるインタフェース。そのサブクラスが共通で任意の関係を持つことはできません実現。そのような猫、犬など、動物と呼ばれる方法で、クラス抽象クラスに抽象化することができます。鳥、飛行機は飛ぶが、私たちは鳥、航空機のシェア親もすることはできません飛行行動、で、インターフェイスを実装飛ぶことができます!だから、抽象クラスが存在しなければならない合理的な継承関係を作るために、継承の種類を体現「で、」親と派生クラス間の関係、それは自然の概念で親クラスと派生クラスが同じであるべきです。インタフェースがないために、それだけでのみ契約インターフェイスの定義を達成するために、インターフェイスおよび概念によって定義されたインタフェースの実装は本質的に同じである必要はありません。

      3、異なる設計レベル。抽象クラスの場合、それはあなたが唯一のルールを定義する必要があり、サブクラスの存在を知っている必要はありません、それはボトムアップデザインは、我々は最初の抽象スーパークラスにサブクラスを知っている必要があり、インターフェイスが異なっています何のサブクラスについては、いつ、どのようにそれを達成するためには何も知りませんでした。例えば、我々はここでしかのような猫を持っている、これはあなたが動物に抽象化されている場合、ビット過剰に設計されていませんか?我々は、少なくとも2匹の動物、ネコ、イヌ、ここでなければならない、我々は彼らの抽象フォーム抽象クラス動物に共通して、それを持っています!だから、抽象クラスは、多くの場合、再建を通ってきます!しかし、異なっている、例えば、飛ぶ、我々は単純にも、未知を達成するためにどのように、このことが達成するためのインタフェースを飛ぶかわからない、私たちがしなければならないインターフェイスを事前に定義されたインタフェースの良い飛行行動。抽象クラスは、ボトムアップから抽象されるように、インターフェースはトップダウン設計されています。

      (上記の純粋に個人的な意見、異なる場合、間違った場所、あなたは一種の希望です!!!!)

      良好記載区別するために、実施例を用いて説明します。ます。http://blog.csdn.net/ttgjz/article/details/2960451この例はから取られます

      私たちは、抽象化の扉を持って、それが(オープン)と(近い2幕)、その後、私たちは抽象クラスとインタフェースを通じてこの抽象概念を定義するために定義することができますがあります。

      抽象クラス:


抽象クラスドア{
抽象ボイド)(オープン。
抽象ボイド近いです();
}

      インターフェース

インタフェースドア{
ボイドオープン();
空に近いです();
}

       抽象クラスのドアを定義したり、ドアを定義することができ、他の具体的なクラスについては両方ここで見つけるとは大きな差がない、拡張使用して使用するインタフェースを実装します。
      しかし、今、我々はドアアラーム機能を持っている必要がある場合は、それを達成するためにどのように?

      解決策1:ドアアラーム方法高めるために:clarmを();


抽象クラスドア{
抽象ボイド)(オープン。
抽象ボイド近いです();
抽象ボイドアラーム();
}

       若しくは

インタフェースドア{
ボイドオープン();
空に近いです();
無効アラーム();
}

       このアプローチは、コア原則ISPオブジェクト指向設計(インタフェース棲み分け原理)違反-メソッドの動作に固有のドアのコンセプトと一緒に混合概念さらに「アラーム」動作方法で定義ドア内の注釈を参照してください。このような問題は、「アラーム」と変更、およびその逆の概念ので変わるだけでドアモジュール概念に依存している人々によって引き起こされます。
      ソリューション2

      )((クローズ)(オープン)とアラームが2つの異なる概念に属しているので、我々は3通りの方法で定義され、抽象クラスの二つの異なる概念を表す2つに定義されているISPの原則に従ってそれらを分離します:

       図1は、両方の抽象クラスが定義されている使用します。

      図2は、両方ともインターフェイスを定義するために使用されます。

      図3に示すように、抽象クラス定義は、インタフェースの定義です。

      最初のものは現実的ではありませんので、Javaのので、多重継承をサポートしていません。後者の二つは可能ですが、何を選択することは、問題のドメインの性質をご理解を反映しています。

      あなたは第二のインタフェースが定義されている選択した場合、それは二つの問題を反映:1に、我々は問題領域を明確に理解を持っていない可能性があり、最終的にAlarmDoorも、自然の概念にドアアラームです。2は、問題領域の我々の理解は問題ありません場合は、例えば、私たちは、コンセプトは同じですが、その後、私たちは、分析、設計における当社の設計意図を反映する権利はない本質的にAlarmDoorを同定しました。あなたが定義するために2つのインターフェイスを使用しているため、その概念は上記の意味を反映していない定義します。

     問題領域の理解がこれであれば第三に、:自然AlarmDoorドアが、それはまた、行動のアラーム機能を持って、私たちは番目のオプションを使用して、この時間は、私たちの設計意図に記載することができます。アラーム機能付きAlarmDoorは、それが行動機能アラームの概念の定義を完了することができますので、アラームを定義するインターフェイスを使用できることを示してはいるがAlarmDoorは、基本的に、私たちは抽象クラスを定義するには、この概念を使用する理由である、あります。次のように:


抽象クラスドア{
抽象ボイド)(オープン。
抽象ボイド近いです();
}

インタフェースアラーム{
ボイドアラーム();
}

クラスAlarmDoorドアアラーム{実装延び
ボイドオープン(){}
ボイド近い(){}
ボイドアラーム(){}
}

       この実装は、基本的に私たちの問題領域を明確に理解を反映することができ、右は、私たちの設計意図を明らかにしています。実際には、抽象クラスが表す「ある-」の関係は、インタフェースは、選択の誰もが基礎として使用することができます「のような-」の関係を表し、もちろん、これは、次のような問題領域の理解に基づいています。私たちの場合AlarmDoorは、概念は、本質的にアラームですが、またドアの機能を持って、その後、上記の定義は、道を向けるだろうと考えられています。
      注釈:

   ISP(インタフェース偏析原理):コアオブジェクト指向の原則。これは、より全体的に単一のインターフェイスを使用するよりも、複数の専門的なインタフェースを使用することを示しています。

   他のクラスに依存するクラスは、最小のインターフェイスに基づくべきです。

   インタフェースは役割を表し、異なる役割がインターフェイスに引き渡されてはなりません。ない関連のインターフェースは、ロールとのインターフェイスの汚染が大きい肥大化インターフェースを形成するために一緒にマージします。

      
      IVの概要
      図1は、Java言語で抽象クラスは、親クラスのサブクラスでのみ存在することができ、継承を表現するが、複数のインターフェイスが存在してもよいです。

      図2に示すように、抽象クラスで独自のメンバ変数と非抽象クラスのメソッドを有することができるが、インターフェースは、静的データメンバで存在することができる不変(一般的にインターフェースデータメンバで定義されていない)、その方法の全てであります抽象的な。

      設計思想が異なる反映3、抽象クラスとインタフェースは、抽象クラス「は、」されている関係を表し、及びインターフェースを「様」の関係で表されます。

      抽象クラスとインタフェースは、それらの間の多くの類似点があるものの、二つの異なる抽象化でJava言語は、その存在の多型は、非常に良いサポートを提供しています。しかし、彼らの選択のために、多くの場合、問題領域の理解を反映しています。のみ正しいと合理的な設計を行うために、問題領域の性質をよく理解しています。

 

注: - 上(でも、再コンパイルせずに)インターフェースがすでに変更を加えるために存在していた実装する新しいメソッドクラスを追加することなく、本来の設計目標のJavaインタフェース8のデフォルトの方法では、インターフェイスがすでに進化を存在になることですあなたは、インターフェイスの新しいバージョンを使用することができます。

おすすめ

転載: www.cnblogs.com/guanbin-529/p/11306191.html