ホームページ >Java >いつ抽象化を使用し、いつインターフェイスを使用するのでしょうか?

いつ抽象化を使用し、いつインターフェイスを使用するのでしょうか?

PHPz
PHPz転載
2024-02-22 12:25:19751ブラウズ

php エディタ Zimo を使用すると、Java の抽象クラスとインターフェイスの使用機会を探索できます。 Java プログラミングでは、抽象クラスをいつ使用するか、インターフェイスをいつ使用するかを選択することが重要です。この記事は、この一般的な質問に答え、さまざまな状況で適切な抽象クラスまたはインターフェイスを選択する方法をより深く理解するのに役立ちます。

質問内容

抽象化とインターフェースの違いはなんとなくわかったのですが、どうしても理解できないのが、どのような場合に抽象化を使用し、どのような場合にインターフェイスを使用するのかということです。インターフェイス抽象化を選択するにはどのような変数が必要ですか?またその逆も同様です?オンラインの回答のほとんどは違いを示すことを目的としていますが、私でも理解できます。いつがより適切かわかりません。

解決策

一般的な古いルールは、抽象クラスを書かざるを得なくなるまでインターフェイスを使い続けることです。

Java の

interface は、他の型が準拠するために 選択 できるパブリック インターフェイスを定義するインスタンス化不可能な型です。

    インターフェイスはパブリック メソッドを宣言できますが、これは実装者によって定義される必要があります。このようなメソッドはすべて暗黙的に
  • abstract であるため、abstract という単語を使用する必要はありません。
  • 古いバージョンの Java では、インターフェイスにデフォルトの実装を含めることができないため、各メソッドは
  • abstract になります。これはもう当てはまりません。置き換えられない限り、インターフェースは implementing クラスで使用されるデフォルトの実装を持つことができるようになりました。
  • 最新バージョンの Java では、インターフェイスで
  • private ヘルパー メソッドを宣言できます。これらはデフォルトの実装に役立ちます。
  • インターフェイスにはコンストラクターやインスタンス変数を含めることはできません。
  • クラスは複数のインターフェイスを
  • 実装できます。

abstract class は、インスタンス化できない単なるクラスです。抽象クラスでは abstract メソッドを定義する必要はありませんが、定義したくなることもよくあります。

    抽象クラスは、任意の可視性を持つメソッドを宣言できます:
  • publicprivateprotected、および package-private。
  • 抽象クラスはメソッドを実装することも、メソッドを
  • abstract として保持することもできます。抽象クラスのメソッド 暗黙的な abstract ではないため、そのようにマークする必要があります。
  • 抽象クラスはコンストラクターを持つことができます。
  • 拡張クラスは、独自のコンストラクターでコンストラクターを呼び出すために super を使用する必要があります。抽象クラスは任意の可視性のインスタンス変数を持つことができ、それらは親クラスのインスタンス変数と同様に機能します。
  • 1 つのクラスは
  • abstract クラスまたは具象クラスの 1 つのクラスのみを 拡張できます。クラスの abstract 性によって、そのクラスが持つことができるスーパークラスの数は変わりません。
抽象クラス

は標準ではなく例外であるべきです。サブクラスに独自の動作を定義させながら内部状態を維持する必要がある場合は、抽象クラスを使用する必要があります。良い例は、Java Swing GUI ライブラリの AbstractButton です。 abstractbutton は、ボタン、トグル ボタン、メニュー内の項目など、ウィンドウ内のボタンのように漠然と動作するものの抽象親です。誰もが abstractbutton をサブクラス化し、そのメンバーを実装してボタンのような表示を定義できます。ただし、abstractbutton は、ウィンドウやスイング API 全体と通信するために、多くの内部状態 (その多くは jcomponent からのもの) も維持する必要があります。 型のコレクションのパブリック インターフェイスを定義する場合は、

interface

を使用します。これらのメソッドの一部にデフォルトの実装を提供し、2014 年以降にリリースされた Java バージョンを使用する場合は、インターフェイスを使用します。デフォルトの実装が必要だが、依然として 2000 年代に留まっている場合は、抽象クラスを使用してください。 Java のバージョンに関係なく、プライベート状態 (インスタンス変数など) またはカスタム初期化 (コンストラクターなど) が必要な場合は、抽象クラスを使用します。 ######インターフェース:### たとえば、次のようなインターフェイスがあるとします。 リーリー そして、animal を実装するいくつかのクラス:

リーリー

インターフェイスを戻り値の型として使用できるようになったので、メソッドは

cat

または

dog

を返すことができます。

リーリー

抽象クラス: 抽象クラスがあるとします: リーリー ここで、これを拡張するクラスは

getname

メソッドを実装する必要があります:

リーリー

上記のクラスは両方とも、必要な

getname

メソッドを実装していますが、親クラスの makenoise メソッドにもアクセスでき、必要に応じてオーバーライドすることもできます。

その他の違いに注意することも重要です: 拡張できる抽象クラスは 1 つだけですが、複数の抽象クラスを実装できます。 インターフェース。

インターフェイスは、異なる型が同じメソッド シグネチャを持つ必要がある場合に使用する必要があり、実装が共通の動作を共有する場合は抽象クラスを使用する必要があります。

これらは相互に排他的ではありません。
  • インターフェイスはパブリック メソッドのみを持つことができますが、抽象クラスはパブリック メソッドと保護されたメソッドを持つことができます。

以上がいつ抽象化を使用し、いつインターフェイスを使用するのでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はstackoverflow.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。