[Java 8の新しいプロパティ]:インタフェースのデフォルトメソッドと静的メソッド

2042 ワード

インタフェースのデフォルトメソッドと静的メソッド
(1)、インタフェースのデフォルトメソッド
Java 8では、インタフェースに、抽象クラスの非抽象メンバーメソッドと同様にdefaultキーワード修飾を使用する「デフォルトメソッド」(拡張メソッドまたは仮想拡張メソッドまたはガードメソッドとも呼ばれる)と呼ばれる特定の実装メソッドが含まれます.
拡張メソッドは、Objectのメソッドを書き換えることはできませんが、Objectのメソッドを再ロードすることができます.
デフォルトメソッドでは、このインタフェースを実装する既存のクラスの互換性を破壊することなく、インタフェースに新しいメソッドを追加できます.つまり、インタフェースを実装するクラスにデフォルトメソッドを実装するように強制することはありません.
デフォルトメソッドと抽象メソッドの違いは、抽象メソッドが実装されなければならないことであり、デフォルトメソッドはそうではありません.代替として、インタフェースはデフォルトの方法実装を提供することができ、このインタフェースの実装クラスはすべて継承によってこの方法を得ることができる.
例:
interface MyInterface{
    default String getString(){
        return "Hello World!";
    }
}

(2)、インタフェースのデフォルトメソッドの「クラス優先」の原則
インタフェースにデフォルトのメソッドが定義され、別の親またはインタフェースに同じ名前のメソッドが定義されている場合は、親のメソッドを選択します.親クラスが特定のインプリメンテーションを提供する場合、インタフェースに同じ名前とパラメータを持つデフォルトのメソッドは無視されます.
インタフェースの競合.親インタフェースがデフォルトメソッドを提供し、別のインタフェースが同じ名前とパラメータリストを持つメソッドを提供している場合(メソッドがデフォルトメソッドであるかどうかにかかわらず)、競合を解決するためにメソッドを上書きする必要があります.
public class Demo8 {
    @Test
    public void Test(){
        MyClasss m = new MyClasss();//            ,      
        System.out.println(m.getString());//Hello Java!
        MyClasss m2 = new MyClasss();//        
        System.out.println(m2.getString());
    }
}
class MyClass{
    public String getString(){
        return "Hello Java!";
    }
}
interface MyInterfaces{
    default String getString(){
        return "Hello World!";
    }
}
interface MyInterfaces2{
    default String getString(){
        return "Hello BigData!";
    }
}
class MyClasss extends MyClass implements MyInterfaces{
}
class MyClassss implements MyInterfaces,MyInterfaces2{
    @Override
    public String getString() {
        return MyInterfaces2.super.getString();
    }
}

(3)、インタフェース内の静的方法
Java 8では、インタフェースに静的メソッドを追加できます.
public class Demo9 {
    @Test
    public void Test01(){
        Inter.Show();
    }
}
interface Inter{
    static void Show(){
        System.out.println("  !");
    }
}