Java
 Computer >> コンピューター >  >> プログラミング >> Java

Java 8インターフェースのデフォルトメソッドとは?基本と実装例を解説

Java 8では、インターフェースに「デフォルトメソッド」という新しい概念が導入されました。これは主に後方互換性(下位互換性)を保つために追加された機能で、既存のインターフェースを壊すことなく、Java 8のラムダ式の恩恵を受けられるようにするためのものです。

例えば、従来のListCollectionインターフェースにはforEachメソッドが宣言されていませんでした。ここに新しくメソッドを追加すると、これらのインターフェースを実装しているすべてのコレクションフレームワークの実装クラスがコンパイルエラーになってしまいます。

そこでJava 8ではデフォルトメソッドが導入され、ListCollectionインターフェース側にforEachメソッドのデフォルト実装を持たせられるようになりました。その結果、これらのインターフェースを実装するクラスは、同じメソッドを改めて実装する必要がなくなります。

デフォルトメソッドの実装例

以下のサンプルコードでは、VehicleFourWheelerという2つのインターフェースが、それぞれ同名のデフォルトメソッドprint()を持っています。両方を実装するCarクラスでは、InterfaceName.super.method()という構文を使って、どちらのインターフェースの実装を呼び出すかを明示的に指定しています。また、静的メソッドblowHorn()はインターフェース名を通じて直接呼び出せる点にも注目してください。

public class Java8Tester {
    public static void main(String args[]) {
        Vehicle vehicle = new Car();
        vehicle.print();
    }
}

interface Vehicle {
    default void print() {
        System.out.println("I am a vehicle!");
    }

    static void blowHorn() {
        System.out.println("Blowing horn!!!");
    }
}

interface FourWheeler {
    default void print() {
        System.out.println("I am a four wheeler!");
    }
}

class Car implements Vehicle, FourWheeler {
    public void print() {
        Vehicle.super.print();
        FourWheeler.super.print();
        Vehicle.blowHorn();
        System.out.println("I am a car!");
    }
}

実行結果

I am a vehicle!
I am a four wheeler!
Blowing horn!!!
I am a car!

ポイントまとめ

  • defaultキーワード: インターフェース内のメソッドにdefaultを付けることで、実装を持たせられます。
  • 競合の解決: 複数のインターフェースに同名のデフォルトメソッドがある場合は、実装クラス側でオーバーライドし、InterfaceName.super.method()で明示的に呼び分けます。
  • 静的メソッド: Java 8以降、インターフェースにも静的メソッドを定義でき、InterfaceName.method()の形式で呼び出せます。
  • 後方互換性: 既存の実装クラスに影響を与えずに、インターフェースへ新しい機能を追加できます。
  1. Javaのデフォルトメソッドを使ってダイヤモンド問題を解決する方法

    継承(Inheritance)とは 継承とは、あるクラスが別のクラスの性質(プロパティやメソッド)を受け継ぐ、2つのクラス間の関係のことです。この関係は extends キーワードを使って次のように定義します。 public class A extends B{ } 性質を受け継ぐ側のクラスは「サブクラス(子クラス)」、受け継がれる側のクラスは「スーパークラス(親クラス)」と呼ばれます。 継承が行われると、スーパークラスのメンバーのコピーがサブクラスのオブジェクト内に作成されます。そのため、サブクラスのオブジェクトを使えば、親クラスと子クラスの両方のメンバーにアクセスすることが可能です。 多重

  2. Java 9のJShellでデフォルトエディタを変更する方法

    JShellは、Java 9から導入されたREPL(Read-Evaluate-Print Loop)ツールです。コマンドラインからコードを読み込み、入力されたスニペットを評価し、その結果を画面に出力してくれます。 JShellのデフォルトエディタを変更する手順 JShellでは、デフォルトの「JShell Editor Pad」を使ってコードを編集できます。さらに、「/set」コマンドを使用すれば、デフォルトエディタを別のものに変更することも可能です。「/edit」コマンドを実行すると、設定されたエディタが起動されます。エディタを変更するには、次のコマンドを実行します。 /set edito