13

Java 8 インターフェイスのデフォルト メソッドと抽象クラスの非抽象メソッド - 2 つの間に違いはありますか (iface の違い以外に、クラス、可視性など)。

デフォルトのメソッドは Java の一歩後退ではありませんか? つまり、Java が何年も宣伝してきた本質に反していますか?!

4

5 に答える 5

4

心に留めておくべき重要なことは、デフォルトのメソッドは状態にアクセスできず、振る舞いだけにアクセスできるということです。実際には、合理的でデフォルトの動作を定義するのに最適な場所です。

インターフェースがあると想像してください:

public interface Plant {
    enum Pace { FAST, SLOW; }

    void grow(Pace pace);
    void growFast();
    void growSlow();
}

デフォルトの動作を提供することは合理的と思われます。

default void growFast() { grow(Pace.FAST); }
default void growSlow() { grow(Pace.SLOW); }

これは単純な例ですが、デフォルトのメソッドがどのように役立つかを示しています。この場合、方法growSlowまたはgrowFast動作はインターフェイス コントラクトの一部であるため、インターフェイス レベルで動作を定義することは理にかなっています。

ただし、インターフェースは、「植物を育てる」というアクションがどのように実装されるかについては想定していません。これは、抽象クラスで定義できます。

于 2013-11-22T10:16:28.770 に答える
0

大きな違いは、コンストラクターを匿名クラスで実行できる可能性があり、チェック済みの例外がある可能性があることです。これにより、匿名クラスが関数型インターフェイスになるのを防ぎ、ラムダ式の基礎として使用できなくなります。

于 2013-11-22T20:35:26.647 に答える
0

まず、デフォルトのメソッドを使用すると、既存の実装を壊すことなく、インターフェイスに新しいメソッドを追加できます。

また、インターフェイス権限Collectionsのユーティリティ クラスであるクラスの例を見てみましょう。Collection

したがって、デフォルトのメソッドを使用して、すべてのユーティリティ メソッドをデフォルトの実装としてCollectionそれ自体に移動できるようになりました。これは、そのようなユーティリティ用に別のクラスを作成するよりも理にかなっています。

abstractまた、プレーンなクラスでは実現できなかった、複数のインターフェースからメソッドを継承することもできます。

于 2013-11-22T07:39:51.050 に答える
0

主な違いは次のとおりです。インターフェースの Java 8 デフォルト メソッドは public ですが、抽象クラスの非抽象 (具象) メソッドは、public、protected、または private として定義できます。ラムダ式は Java 8 で導入されました。ラムダ機能を使用するには (下位互換性を維持するために) デフォルトのメソッドが必要です。抽象クラスの非抽象メソッドは目的を果たすことができません。

于 2014-04-19T21:46:48.273 に答える