Java 8 では、インターフェースにデフォルトメソッドという、中身を実装したメソッドを定義することができるようになった。抽象クラスというものがあるのに、なぜインターフェースに実装を含ませるのか、という気がしないでもないけど。

デフォルトメソッドを使ってみるサンプルコード。せっかくなので、同じメソッド名 doXXX を用意して、インターフェースを多重継承させて衝突させてみる。


public class DefaultMethods{

  public interface Foo{
    default void doFoo(){System.out.println("Foo::doFoo");}
    default void doXXX(){System.out.println("Foo::doXXX");}
  }

  public interface Bar{
    default void doBar(){System.out.println("Bar::doBar");}
    default void doXXX(){System.out.println("Bar::doXXX");}
  }

  public static class Hoge implements Foo, Bar{

    // インターフェースのメソッド名が衝突する場合は
    // 実装クラス側でオーバーライドする必要がある
    public void doXXX(){

      // インターフェース名.super.メソッド名で、
      // 指定したインターフェースのメソッドを呼び出せる
      Foo.super.doXXX();
    }
  }

  public static void main(String[] args){
    Hoge hoge = new Hoge();
    hoge.doFoo();
    hoge.doBar();
    hoge.doXXX();
  }
}

実行結果。


$ java DefaultMethods
Foo::doFoo
Bar::doBar
Foo::doXXX

tags: java

Posted by NI-Lab. (@nilab)