抽象クラスとインターフェースのどちらかを選択する場合は常に、(ほぼ) デフォルト (ディフェンダーまたは仮想拡張とも呼ばれる) メソッドを優先する必要があります。
デフォルトのメソッドは、インターフェースの古典的なパターンと、そのインターフェースのほとんどまたはすべてのメソッドを実装するコンパニオン クラスに終止符を打ちました。例はCollection and AbstractCollectionです。ここで、インターフェイス自体にメソッドを実装して、デフォルトの機能を提供する必要があります。インターフェイスを実装するクラスは、メソッドをオーバーライドするか、デフォルトの実装を継承するかを選択できます。
デフォルト メソッドのもう 1 つの重要な用途は ですinterface evolution。次のようなクラス Ball があるとします。
public class Ball implements Collection { ... }
Java 8 では、新しい機能ストリームが導入されました。streamインターフェイスに追加されたメソッドを使用してストリームを取得できます。streamデフォルトのメソッドではない場合Collection、この新しいメソッドを実装していないため、インターフェイスのすべての実装が壊れていたでしょう。インターフェイスにデフォルト以外のメソッドを追加することは、source-compatible.
しかし、クラスを再コンパイルせず、このクラスを含む古い jar ファイルを使用するとしますBall。この欠落したメソッドがなくてもクラスは正常にロードされ、インスタンスを作成でき、すべてが正常に機能しているようです。しかしstream、プログラムがのインスタンスでメソッドを呼び出すBallと、 が得られAbstractMethodErrorます。したがって、メソッドをデフォルトにすることで両方の問題が解決しました。
Java 9には、デフォルトの実装を提供するインターフェース メソッドで使用された共通コード ロジックをカプセル化するために使用できる、インターフェース内のプライベート メソッドさえあります。