Java 8インタフェースのデフォルトメソッド

2837 ワード

Java 8インタフェースのデフォルトメソッド
デフォルトメソッドとは何か、なぜデフォルトメソッドがあるのか.
簡単に言えば、インタフェースには実装方法があり、実装クラスがその方法を実装する必要はない.メソッド名の前にdefaultキーワードを付けるだけです. 
なぜこの特性があるのですか?まず、以前のインタフェースは両刃の剣で、利点は抽象的で具体的なプログラミングに向いていないことであり、欠陥は、インタフェースを修正する必要がある場合、そのインタフェースを実現するクラスをすべて修正する必要があり、現在のjava 8以前の集合フレームワークにはforeach方法がなく、通常考えられる解決策はJDKに関連するインタフェースに新しい方法と実現を追加することである.しかしながら、パブリッシュされたバージョンでは、インタフェースに新しいメソッドを追加しながら、既存の実装に影響を与えないことはできません.だから導入したデフォルトの方法.彼らの目的は,インタフェースが既存の実装と互換性のない発展を導入しないようにすることである.
以下に示すように、
public interface Animal {
    default void eat() {
        System.out.println("animal eat default method");
    }
}

デフォルトのメソッドが1つしかないインタフェースを宣言しました.このインタフェースを実装する具体的なクラスを書きます
public class Dog implements Animal {
    public void sayHi() {
        System.out.println("dog");
    }

    public static void main(String args[]) {
        Dog dog = new Dog();
        dog.eat();
    }
}

さらに具体的なクラスではデフォルトメソッドを書き換える必要はありませんが、抽象メソッドを実装する必要があります.
デフォルトメソッドの多重継承
以下に示すコードで、
/**
 * Created by xinxingegeya on 15/9/18.
 */
public interface A {

    void doSomething();

    default void hello() {
        System.out.println("hello world from interface A");
    }

    default void foo() {
        System.out.println("foo from interface A");
    }
}

interface B extends A {
    default void hello() {
        System.out.println("hello world from interface B");
        A.super.hello();
        this.foo();
        A.super.foo();
    }
}

class C implements B, A {

    @Override
    public void doSomething() {
        System.out.println("c object need do something");
    }

    public static void main(String args[]) {
        A obj = new C();
        obj.hello();//  B   
        obj.doSomething();
    }
}

印刷結果:
hello world from interface B
hello world from interface A
foo from interface A
foo from interface A
c object need do something
obj.hello()は、Bインタフェースのデフォルトメソッドを呼び出します.また、Bインタフェースのデフォルトメソッドには、親インタフェースのデフォルトメソッドが呼び出されます.
もう1つの例を見てみましょう.多重継承で同名のデフォルト方法が現れたら、以下のように考えてみましょう.
/**
 * Created by xinxingegeya on 15/9/18.
 */
public interface D {
    default void hello() {
        System.out.println("hello world from D");
    }
}

interface E {
    default void hello() {
        System.out.println("hello world from E");
    }
}

class F implements D, E {

    @Override
    public void hello() {
        System.out.println("hello world F class");
        D.super.hello();
        E.super.hello();
    }

    public static void main(String args[]) {
        F f = new F();
        f.hello();
    }

}

どのインタフェースを呼び出すデフォルトの方法を設定する必要があります.
 D.super.hello();
 E.super.hello();

======END======