読者です 読者をやめる 読者になる 読者になる

美味しいカフェオレが飲みたい

意識高い系に憧れる主婦のメモです。

メソッドの強化

1Z0-810-JPN

Upgrade Java SE 7 to Java SE 8 OCP Programmer(1Z0-810-JPN)のテスト内容チェックリストのトピック「メソッドの強化」について記述する。

static メソッドをインタフェースに追加する

インターフェイス上にstaticメソッドを定義できる。

定義

interface A {
    static int bar() {// インターフェイスのstaticメソッド
        return -1;
    }
}

呼び出し

呼び出すときには、通常のstaticメソッドと同様に「クラス名.メソッド(引数)」で呼びだす。 ただし、継承したインターフェイス名や実装クラス名を使用することはできない。

A.bar(); //OK
AImpl.bar(); //NG

インタフェースのデフォルト・メソッドを定義および使用する。デフォルト・メソッドの継承ルールについて説明する

インターフェイスに処理が記述できるようになった。

定義

メソッドの前に default 修飾子をつける。 Objectクラスが持つメソッドはデフォルト・メソッドでは定義できない。

interface E {
    default void foo() {
        System.out.println("E#foo()");
    }
}

同一シグネチャを持つインターフェイスの多重継承をすると「Duplicate default methods named foo with the parameters () and () are inherited from the types F and E」というコンパイルエラーが発生する。 多重継承するためにはオーバーライドして定義する必要がある。

class EFImpl implements E, F {
    @Override
    public void foo() {
        //
        E.super.foo();
    }
}

参考

Java8で、Objectが持つメソッドについてはインターフェースでdefault実装をできないようにしている理由 - なみひらブログ