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();
}
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の抽象メソッドをオーバーライドしました");
}
}