変数宣言と修飾子

interface BadExample {
    // ERROR: 変数には暗黙的にpublic static finalが付与されるため、
    //        定数として初期化が必要
    int variable;

    // ERROR: メソッドには暗黙的にpublic abstractが付与されるため、
    //        protectedは使えない
    protected void method1();

    // ERROR: 抽象メソッドとしてオーバーライドされる必要があるため、
    //        finalでオーバーライドを禁止してはいけない
    final void method2();

    // ERROR: staticな抽象メソッドは宣言できない
    static void method3();
}

staticな具象メソッド

interface SampleInterface {
    static void staticMethod() {
        System.out.println("staticな具象メソッド");
    }
}

public class Main {
    public static void main(String[] args) {
        // OK: staticメソッドとして呼び出し可能
        SampleInterface.staticMethod();

        // ERROR: インターフェースはインスタンス化できない
        SampleInterface obj = new SampleInterface();
        obj.staticMethod();
    }
}

デフォルトメソッド

interface SampleInterface {
    // OK: デフォルトメソッドの正しい定義
    // 暗黙的にpublicが付与される
    default void method1() {
        System.out.println("デフォルトメソッド");
    }

    // ERROR: protectedは使用できない
    protected default void method2() {
        System.out.println("エラーになります");
    }

    // ERROR: equalsメソッドは定義できない
    default boolean equals(Object obj) {
        return true;
    }

    // ERROR: hashCodeメソッドは定義できない
    default int hashCode() {
        return 10;
    }

    // ERROR: toStringメソッドは定義できない
    default String toString() {
        return "無理です";
    }
}

defaultメソッド内の記述を整理するためなどの用途で、privateな具象メソッドを定義することもできる。(SE9以降)

継承と実装

interface MyInterface {
    void myInterfaceMethod();
}

class MyClass1 {
    void myClass1Method() {
        System.out.println("MyClass1内の具象メソッドです");
    }
}

// extends, implementsの順に書く
class MyClass2 extends MyClass1 implements MyInterface {
    @Override
    public void myInterfaceMethod() {
        System.out.println("MyInterfaceの抽象メソッドをオーバーライドしました");
    }
}