Javaプログラミング・ロジック(19) - インタフェースの性質

制限のデータタイプ

私たちは、簡単な操作、データ型の概念を導入するための高レベルの言語のためのデータは、Javaは8つの基本データ型を定義し、クラスはカスタムデータ型と同等でありながら、メインプログラムがデータ上のデータと操作で、前に言ってされていますクラスと継承の組み合わせを表し、物事やさまざまなオブジェクトを操作することができます。

しかし、これはいくつかの場合には、操作の種類に応じて、データ・タイプに属するオブジェクトとして見られ、そしてオブジェクトとオブジェクト操作の性質を反映していません。

なぜあなたは言うのですか?多くの場合、タイプは限りこのタイプを提供する能力が重要ではないとして、我々は実際に気にオブジェクトが、オブジェクトの能力ではありません。人生のいくつかの例で見てみましょう。

携帯電話を使用して、またはパッドショット、または一眼レフカメラでの撮影を使用しているように写真を撮るために、多くの時間が、ライン上の写真撮影の長い満たすようなニーズとして、それは問題で、気には、オブジェクトが写真撮影を持っているかどうかではありません容量、およびすることができ、最終的には携帯電話をオブジェクトの種類を気にパッドや一眼レフカメラはありません。

長い間、それは正しい結果を計算することができますようとして、数字のセットを計算するには、として暗算そろばんカウント、計算機を使用し、コンピュータソフトウェア事業者の人々によって、である、それは問題で、気には、オブジェクトが計算する能力を持っているかどうかではありません、と最後にオブジェクトがそろばんや電卓に関係していません。

冷たい水を加熱するために、お湯が長いことができますようにとして得ることができる、器具を加熱するガスストーブ、または電気ケトルで加熱し、重要ではありませんように、重要なのは、オブジェクトが熱水への能力を持っているかどうか、そして最終的にオブジェクトを気にしませんどのようなタイプ。

これらのケースでは、タイプが重要な能力である、重要ではありません。それはどのように行うための能力を意味しますか?

インタフェースの概念

Javaは表現能力インタフェースの概念を使用しています。

この概念は、生活の中で新しいものではないインタフェース、電子世界共通のインタフェースは、USBインタフェースです。PCは、多くの場合、あなたは、キーボード、マウス、Uディスク、カメラ、携帯電話などをすることができ、USBデバイスの様々なプラグインすることができ、複数のUSBポートを持っています。

インターフェイスは、機能のセットを宣言したが、彼はこの能力を実現していない、それだけで慣例だ、それはオブジェクトを2人の相互作用の当事者が関与、当事者はこのインタフェースは、このインタフェースを使用して他を実装する必要がありますが、両方のオブジェクトがお互いに直接依存していない、彼ら間接的にしかインタラクティブなインタフェースを介して。次のように示します:


USBインタフェースの上にそれを取る、USBの契約は、USBデバイスは、USBデバイス、コンピュータとUSBデバイスと対話するためにUSBプロトコルを使用してコンピュータが相互に依存しない、これらの機能のそれぞれを実現するために必要とされているUSBデバイスを達成する能力が必要ですが、USBを介して行うことができます互いに相互作用するためのインタフェース。

ここでは、Javaインタフェースを見てください。

定義されたインタフェース

ここでは、例を通じてJavaインターフェースの概念を説明します。

この例では、「より」で、多くのオブジェクトは、実際には、彼らがいる限り、オブジェクトがそれを比較することができますように、オブジェクトが何であるかの種類を気にしないソート、の最大値、最小値を求めるための手順、と比較することができ、または彼らは比較できない標的とする能力である気に。JavaはAPI Comparableインタフェース、同等の表現する能力を提供していますが、それは一般的なを使用していますが、私たちはジェネリックを導入していないので、このセクションでは、我々はMyComparableと呼ばれるComparableインタフェースを定義所有しています。

さて、まず、次のようにのは、このインタフェースを定義してみましょう:

パブリックインターフェースMyComparable { 
    int型のcompareTo(他のオブジェクト)。
}

説明:

  • Javaインタフェースは、インタフェース修飾子は一般公開されて宣言するために、このキーワードを使用します。
  • インターフェイスの後ろにインタフェースMyComparableの名前です。
  • インターフェース定義の内部では、単一の方法のcompareToが、メソッド本体ではなく、インタフェースの実装を定義していません。インターフェイスメソッドが公開されてとせずに、それは他の修飾することはできません、追加の修飾子を必要としません。

再びのcompareToメソッドを説明します。

  • メソッドのパラメータは、他のタイプのオブジェクトの変数であり、別のオブジェクト参加比較を表します。
  • 第一の目的は、自分の参加を比較します
  • 結果は、パラメータオブジェクトよりも大きい整数、オブジェクトパラメータが-1未満自身のために、0同じためであります

クラスのインターフェイスは、メソッドのコードを実装していません。自体は何もしなかったインタフェースの定義は、多くの使用がない、それはのインターフェイスを実装してみましょう、少なくとも2人の参加者、インタフェースを使用してインターフェイスおよびその他を実装する必要性を必要とします。

インターフェイスを実装します

クラスがインターフェイスを実装することができ、オブジェクトのクラスは、インタフェース表現する能力を示します。我々は以前、我々はポイントが同等にする能力を持っていることを示すPointクラス、ポイントそれとの間にどのような比較を説明する例を見て?私たちは、比較され、原点からの距離に応じて、以下はPointクラスのコードであることを前提としています。

コードをコピー
パブリッククラスポイントを実装MyComparable { 
    プライベートint型のX; 
    プライベートint型のy; 
    
    公共ポイント(int型のx、int型Y){ 
        this.x = X。
        this.y = Y。
    } 
    
    公共の二重距離(){ 
        リターンMath.sqrt(X * X + Y * Y)。
    } 

    @Override 
    公共int型のcompareTo(他のオブジェクト){ 
        ()ポイントのinstanceof(他!)場合は{ 
            )(新しいIllegalArgumentExceptionをスローし、
        } 
        ポイントotherPoint =(ポイント)、その他; 
        ダブルデルタ=距離() - otherPoint.distance()。
        IF(デルタ<0){ 
            リターン-1。
        }そうであれば(デルタ> 0){  
            1を返します。
        }他{ 
            0を返します。
        } 
    } 

    @Override 
    パブリック文字列のtoString(){ 
        リターン"(" + X + " "+ Y +")"。
    } 
}
コードをコピー


我々は説明します。

  • Javaは、インターフェイス名に続いて、クラス名の前に、実装インタフェースが実現することを示すキーワードを使用しています。
  • 達成すべきインタフェースで宣言されたインタフェースメソッドを実装する必要があり、ポイントは、compareToメソッドを実装します。

私たちは、実装ののcompareToポイントを説明しましょう:

  • ポイントは、他のタイプのオブジェクトと比較することはできません、オブジェクトがポイントタイプを比較し、そうでない場合は、スローが例外をスローし使用するかどうか、それを最初にチェックは、私たちが説明する異常、フォローアップ記事を言及していないが、ここでは無視することができます。
  • ポイントタイプの場合は、他のパラメータを使用してオブジェクトの型キャストは、タイプポイントotherPointのパラメータに変換されます。
  • この明示的な型チェックと強制は、我々がジェネリックを紹介しますフォローアップ記事を避けるために、一般的なメカニズムを使用することができます。

 クラスは複数のインターフェイスを実装することができ、以下のように、それぞれの間のインターフェースは、カンマで区切って、オブジェクトクラスは、複数の機能を備えていることを示し、構文は次のとおりです。

パブリッククラステスト実装インターフェース1、インターフェイス2 { 

... 

}

インターフェイスを定義し、実装し、その後、我々はインターフェイスを使用する方法を見て。

使用できるインターフェイス

クラスと異なり、インタフェースは、直接インタフェースオブジェクトを作成することはできません、オブジェクトはクラスによって新しい作成することができますすることができません。しかし、インターフェースは、インターフェースのタイプクラスオブジェクトリファレンス実装の変数を宣言することができます。例えば、それはすることができます。

MyComparable P1 =新しいポイント(2,3)。
MyComparable P2 =新しいポイント(1,2)。
System.out.println(p1.compareTo(P2))。

P1、P2は、変数のMyComparableタイプであるが、タイプポイントのオブジェクトを参照し、ポイント実装MyComparableインタフェースため割り当てることができました。このタイプのオブジェクトは、可変のインターフェイスタイプのいずれかに割り当てることができる器具インタフェースの複数種類の場合。

P1およびP2はMyComparableインタフェースメソッドを呼び出すことができ、この方法は、MyComparableインターフェース、実際のインプリメンテーション、実行コードの実装クラスと呼ぶことができます。

なぜタイプポイントMyComparableのオブジェクトは型の変数に割り当てられたする必要がありますか?上記のコードでは、実際には必要ではありません。ただし、一部のプログラムでは、コードは、これはどこのインターフェイスパワープレー、我々はMyComparableインタフェースを使用し、次の例を見ている、特定のタイプを知りません。

コードをコピー
パブリッククラスCompUtil { 
    パブリック静的オブジェクトMAX(MyComparable [] OBJS){ 
        IF(OBJS == NULL || objs.length == 0){ 
            戻りヌル。
        } 
        MyComparableマックス= OBJS [0]。
        以下のために(INT I 1 =; I <objs.length; I ++){ 
            IF(max.compareTo(OBJS [I])<0){ 
                最大= OBJS [I]。
            } 
        } 
        マックス返します。
    } 
    
    パブリック静的ボイドソート(MyComparable [] OBJS){ 
        ためには(; I <objs.length、整数iが0 = I ++){ 
            int型分= I。
            {(; J <objs.length J ++のint J = I + 1)のための
                IF(OBJS [J] .compareTo(OBJS [分])<0){ 
                    分= J。 
                } 
            }
            IF(!分= I){ 
                 MyComparable TEMP = OBJS [I]。
                 OBJS [I] = OBJS [分]。
                 OBJS [分] = TEMP。
            } 
        } 
    } 
}
コードをコピー

 

CompUtilクラスは昇順で配列をソートし、ソートにおいて、アレイ型パラメータはMyComparableあり、入ってくる配列を取得する二つの方法は、MAXの最大値を提供します。最大のコードが理解しやすくなり、ソート、簡単な選択肢を使用して並べ替えられ、説明されていません。

図から分かるように、このクラスはMyComparableプログラミング・インタフェース用で、それは気にしませんどのような特定のタイプを知りませんが、それは動作するように、あらゆるタイプMyComparableインタフェースのために実現することができます。ポイントは次のよう私たちは、操作の種類を見てみましょう。

コードをコピー
点[]ポイント=新しいポイント[] { 
        新たな点(2,3)、
        新たな点(3,4)、
        新たな点(1,2)
}。
System.out.println( "最大:" + CompUtil.max(ポイント)); 
CompUtil.sort(ポイント)。
System.out.println( "ソート:" + Arrays.toString(ポイント));
コードをコピー

ソート順で、最大値MAX CompUtil方法を得る、ポイントタイプのポイント・アレイを作成し、その結果を出力し、出力:

最大:(3,4)
ソート:[(1,2)、(2,3)、(3,4)]

ここでのポイントは、操作の配列を実証することである、実際には、MyComparableインタフェースを実現するために、アレイのいずれかのタイプを操作することができます。

これは、インターフェイスの電源ですが、プログラミングインタフェースではなく、特定のタイプのために、コンピュータプログラムを思考の重要な方法である、と言うことができます。インターフェイスのため、多くの場合、被写体とオブジェクト操作の性質を反映しています。これは、コードの再利用、限り、これらのオブジェクトは、同じ機能を持っているとして、CompUtilとして、オブジェクトの多くの異なる種類を扱うことができ、コードの同じセットの最初の多くの利点があります。

、カップリングを減少させる柔軟性を高めるために、より重要なことは、インタフェースの使用は、ユーザインターフェイスに影響を与えることなく、交換、インタフェースプログラムがある場合に実施することができるインターフェースの特定のタイプを達成するためにではなく、インタフェース・コード自体に依存しています。複雑な問題を解決するための鍵小さな問題に分け、分割統治にあるが、小さな問題は何も持っていなかった間に、それは不可能である、コア分解が結合を低減することで、増加の柔軟性、インタフェースが適切な分解では、強力なツールを提供します。

インターフェイスの詳細

インタフェースの基本的な要素たちの上に、を含むインタフェースのいくつかの詳細があります。

  • インタフェース変数
  • 継承インタフェース
  • 継承とインターフェイスクラス
  • instanceofは

私たちは、次の一つ一つを導入しました。

インタフェース変数

次のようにインタフェースが、変数を定義することができ、構文は次のとおりです。

パブリックインターフェースインターフェース1 { 
    パブリック静的最終int型A = 0。
}

ここではint型の変数の定義は、修飾子は公共の静的な決勝ですが、この修飾子がない場合は、書き込み、オプションですが、またのpublic static final。この変数は、例えばInterface1.aとして「インタフェース名、変数名」アプローチによって使用することができます。

継承インタフェース

他のインターフェイスへのインタフェースを継承することができるインタフェースは、クラスの基本的な概念として継承し、継承することができるが、次のようにクラスは、インターフェイスは、複数の親インターフェイス・コードを有することができます。

コードをコピー
パブリックインターフェースIBase1 { 
    ボイド法1()。
} 

パブリックインターフェイスIBase2 { 
    ボイド方法2(); 
} 

IChildインタフェース公衆IBase1、IBase2 {延び
}
コードをコピー

継承同じインターフェースは、複数の親インターフェイス間のカンマで区切って、キーワードを拡張します。

継承とインターフェイスクラス

次のように1つ以上のインターフェイスを達成しながら、クラス継承とインターフェイスは、クラスは、ベースクラスの場合に継承することができ、換言すれば、共存することができ、構文は次のとおりです。

パブリッククラスの子供は基本実装を拡張IChild { 

 // ... 

}

実装前に配置されるように拡張します。

instanceofは

そしてクラス、インタフェースは、例えば、オブジェクト実装しているかどうかインターフェイスを決定するために、instanceofのキーワードを使用することができます。

点p =新しいポイント(2,3)。
もし(P instanceofのMyComparable){ 
    するSystem.out.println( "同等")。
}

継承の代替インタフェースを使用してください

私たちは、あなたが相続を交換するインタフェースを使用することができ、前のセクションで述べました。どのようにそれを置き換えますか?

私たちは、一つは、コードの再利用であり、他方は団結ハンドルに異なるサブクラスのさまざまなオブジェクトを結合多型とダイナミックの使用で、少なくとも二つの利点を継承すると言います。

代替継承の組み合わせを使用して、コードを再利用しますが、治療を統一することができません。インターフェイスオブジェクトをプログラムするための使用インタフェースは、異なる種類の処理を統一することができるが、インターフェースは、コードではなく、コードの再利用を実装していません。ポートフォリオとインターフェースを組み合わせ、それは単一であってもよいし、コードが多重化されてもよいです。我々はまだ例上記のセクションを説明します。

次のようにしてみましょう増加インタフェースIADD、コードは次のとおりです。

パブリックインターフェースIADD { 
    ボイド追加(INT番号); 
    空のaddAll(int型[]の数字)。
}

ベースのコードを変更し、彼はIADDインターフェイスコードは基本的に同じである達成してみましょう:

パブリッククラスベース実装IADD { 

// ... 

}

修正子コード、だけでなく、IADDインタフェースコードを達成するために、本質的には同じです。

パブリッククラスの子が実装IADD { 

 // ... 

}

したがって、だけでなく、あなたが集中することができ、コードを再利用することができますが、パッケージにダメージを心配しないでください。

概要

このセクションでは、我々は思考のデータ・タイプの限界を議論するインタフェースの導入は、プログラムの概念とJavaインタフェースの詳細、およびプログラミング・インターフェースを紹介思考の重要な方法であるので、しばしば言及した懸念は、むしろタイプよりも、能力でありますこの方法は、コードを再利用することができないだけで、あなたはまた、複雑な問題を打破するための重要なツールである、カップリング、増加の柔軟性を減らすことができます。

インタフェースが実装コードを持っていないし、導入前に完全な実装クラスを持っている、あなたがオブジェクトを作成することができ、Javaはまた、インタフェースとクラスの範囲の間で考え方を持っている、抽象クラス、それはそれで何をするのでしょうか?

おすすめ

転載: www.cnblogs.com/ivy-xu/p/12387374.html