2011-01-20 12 views
5

メソッドシグネチャだけを宣言でき、インターフェイスのインスタンスも作成できないことがわかっています。なぜインタフェースが必要なのか? JVMへのロードを不必要にします。これも1つのパフォーマンスの低下です。私たちは、インターフェースとそのインターフェースを実装するいくつかのクラスを作成し、そのインターフェースのすべてのメソッドを定義しています。実際に私たちはこのインターフェースから何を達成しましたか?いくつかの例を教えてください。なぜクラスの代わりにインターフェイスが必要なのか、インターフェイスから何を達成するのか

+1

[Java:interface/abstract classes/abstract method]の複製が可能です。(http://stackoverflow.com/questions/2124951/java-interface-abstract-classes-abstract-method) –

答えて

9

インターフェイスはあなたのクライアントにいくつかの指定されたものを実装することを余儀なくされている実装は、クライアントに残っています。また、javaは複数のクラスを拡張することによって複数の継承をサポートしていません。

例:Listは、add(..)メソッドを宣言しています。リストのすべての実装は、その実装を提供します。

簡単です。

インターフェイスAnimalとメソッドspeak()を定義すると、すべてのAnimalがさまざまな実装と話す必要があることを意味します。男は話します、犬は樹皮をし、ライオンは轟音になります。

私たちはどうしたらいいのでしょうか?すべてのクラスでspeak()を宣言できます。 Animalクラスから取得し、すべてのサブクラスでspeak()を実装することで、どんなふうになるのでしょうか。それでも私はこの概念を取得していない

主な利点は、あなたがここにも動物の行動を指定ある継承やポリモーフィズム[OOPのコアコンセプト]

です。あなたは

Animal obj = new Man(); 

Animal obj = getAnimalForThisCriteria(something here);//this will return some animal at runtime so you can catch instance using Animal. 

を持つことができます

ここで、あなたは、同じ方法では三つの異なるクラスの馬、犬、ライオンを持っているかもしれないが、彼らは一般的なクラスやインタフェースを拡張または実装しない限り、彼らはすべての動物です伝える方法がありません構造のコンセプトが来る

+0

私たちはcreate class動物の余分。すべてのクラスでspeak()を宣言できます。 Animalクラスから取得し、すべてのサブクラスでspeak()を実装することで、どんなふうになるのでしょうか。それでも私はこのコンセプトを得ていませんでした。 – Nishi

+0

更新を確認......... –

+0

@ JigarJoshi良い説明+1 – SpringLearner

4

クラスとは別のインターフェイスを持つと、がクリアされますオブジェクトとその実装のインターフェイス間の分離。それらがなければ、実装の詳細が含まれていないクラスを示す標準的な方法はありません。

第2に、Javaは複数の継承をサポートしていないため、インタフェースはクラスの外向き機能の継承を許可することによって、部分的な回避策です。

1

インターフェイスは、オブジェクトの機能についてのみ気にして、オブジェクトの機能をどのように実現するかについては考慮しません。

ロボットの高水準制御コードを記述しているとします。あなたは、ロボットが実際にどのように動くか気にしないで、前進、後退、左か右に回すように指示したいだけです。インタフェースがなければ、AbstractRobotという抽象クラスを実装します。抽象メソッド。この時点で、基本的にインターフェースは作成されていますが、抽象クラスの形であり、必要以上に重いものです。

最後に、クラスが複数インターフェースに準拠することができますが、唯一が一つのクラスからを継承することができます。これにより、複数の継承に依存するいくつかのデザインパターンが可能になります。

0

私はこれを簡単な言葉で説明しようとします。

お気に入りのコンピュータゲームを考えてみましょう。カウンターストライク このゲームでは、プレーヤー(テロリストまたはカウンターテロリスト)は武器を使用します。我々は(インタフェースに類似)weaponを使用する方法プレーヤーを教える場合

することは、それがAK47MaverickShotgunSniper(武器・インターフェースを継承するクラスに類似)のような任意の武器を使用することができます。

この利点は、Bazooka(これはWeaponを実装している)が将来のバージョンで開発されたためです。現在のプレイヤーは、武器のインターフェースを使用する方法を知っているので、変更なしでそれを使用することができます:

これは単なる例です。インタフェースの使用には他にも多くの理由があります。

+1

この例は、インターフェイスが存在しない場合でも動作します。武器の母クラスを定義するだけです。 –

+0

ああ、そうだよ。しかし、クラスは他のクラスを継承することができるので、Interfaceを使う方が良いでしょう。 Weaponマザークラスを使用すると、派生クラスはJavaで複数継承が存在しないため、他のクラスから派生クラスを継承することはできません。 – Trivikram

0

シンプルです。私は、インターフェイスと抽象クラスは同じ目的のためだと思います。違いは、抽象クラスを拡張すると、Javaでは他のクラスを拡張できないということです。理由:Javaは多重継承をサポートしていません。同時に、クラスに対して任意の数のInterfaceを実装することができます。

2

抽象クラスまたはインターフェイスのどちらを使用しますか?

  • あなたは、いくつかの密接に関連するクラス間のコードを共有したい:これらのステートメントのいずれかがあなたの状況に該当する場合

    は、抽象クラスを使用することを検討してください。

  • 抽象クラスを拡張するクラスには、多くの一般的なメソッドやフィールドがあり、public以外のアクセス修飾子(protectedやprivateなど)が必要です。
  • 非静的フィールドまたは非最終フィールドを宣言したいとします。これにより、オブジェクトが属するオブジェクトの状態にアクセスして変更できるメソッドを定義することができます。これらのステートメントのいずれかがあなたの状況に該当する場合

は、インタフェースを使用することを検討してください:

  • あなたは無関係なクラスがあなたのインターフェイスを実装することを期待しています。たとえば、ComparableとCloneableのインタフェースは、無関係な多くのクラスによって実装されています。
  • 特定のデータ型の動作を指定したいが、その動作を実装する人は関係しない。
  • タイプの多重継承を利用したいと考えています。
0

パラメータとしてメソッドにコード(anonymous inner classまたはlambda)を渡しているのがわかるように、インターフェイスの最も重要な用途です。

例:

は、私たちがコードの一部を実行するために必要な実行時間を返すことができる方法を作りたいとします。このメソッドにパラメータとして渡す必要があります。 Javaの8で

interface Code{ 
    public void run(); 
} 


long getExectutionTime(Code code){ 

    long startTime = System.nanoTime();  
    code.run();  
    return System.nanoTime() - startTime; 
} 


getExecutionTime(new Code(){ 

    public void run(){ 
      //the code to be executed 
    } 
}); 

getExecutionTime(()->{ 
    //the code to be executed 
}); 
0

インタフェースは何もありませんが、新しい実装 ためのガイドラインは、それが細部.INオブジェクトの機能を新たに実装するためにいくつかの命令を提供し、分類するかのようにインタフェースを作成し、実装のための命令を作成します。

0

インターフェイスの類推は、インターフェイスを電気壁のコンセントのように考えることで、実装をプラグとして考えることです。アウトレットは、コンセントに収まる限り、プラグの後ろにあるものは気にしません。擬似コードの用語では、それは次のように記述できます。

public interface ElectricOutlet { 
    public void powerUp(); 
} 

そしてElectricOutletを実装するクラスは、次のようになります。

public class Appliance implements ElectricOutlet { 
    //member variables 
    public void powerUp() { 
     //Draw power from the wall 
    } 
    ... 
} 

それでは、どのようにそのインタフェースを使用していますか?このように:

//lots of other code 
ElectricOutlet out = new Appliance(); //plug the appliance into the outlet 
out.powerUp; //power it up! 

もちろん、コンセントに接続するアプライアンスである必要はありません。それはテレビ、ラップトップ、芝刈り機のどちらでもかまいませんが、すべてアウトレットの視点から同じように動作します。では、これはプログラミングにどのように適用されますか?まったく同じ方法で:

List<String> list = new ArrayList<String>(); // create a new List of Strings 

私はちょうど新しい(空の)ストリングのリストを作成しました。それはArrayListのが右のパフォーマンスを提供していないことが判明し、LinkedListのは良く動作する場合、私は戻って、これにその行を変更することができます。

List<String> = new LinkedList<String>(); //should work better now 

のArrayListとLinkedListの両方がListインタフェースを実装するので、私はこれを行うことができます内部実装が異なる場合でも、同じ動作(API)を提供します。しかし、Listの観点からは、インターフェースが存在する限り、内部動作が何であるかは関係ありません。これにより、クラス間の独立性が高まり、より多くの再利用が可能になります。

関連する問題