Java SE7 までのインタフェースに定義できるメソッドは「抽象メソッド」のみでした。
Java SE8 のインタフェースには、default というキーワードを記述することによって「具象メソッド」も定義可能になりました。
このメソッドのことを「デフォルトメソッド」といいます。
以下が使用例となります。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
public interface Employee { void setId(Integer id); default Integer getId() { return 0; } void setName(String name); default String getName() { return "No Name"; } } |
次にEmployeeインターフェースを実装したSalesEmployeeクラスを定義します。
EmployeeインターフェースのgetId()とgetName()はオーバーライドしないで、 setId()とsetName()のみオーバーライドします。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
public class SalesEmployee implements Employee { private Integer id; private String name; @Override public void setId(Integer id) { this.id = id; } @Override public void setName(String name) { this.name = name; } } |
SalesEmployeeクラスを利用した実行結果です。
1 2 3 4 5 6 7 8 9 10 |
public class Main { public static void main(String[] args) { Employee emp = new SalesEmployee(); emp.setId(1000); emp.setName("営業たろう"); System.out.println("id:" + emp.getId()); System.out.println("name:" + emp.getName()); } } |
実行結果
id:0
name:No Name
まず、setId()とsetName()を呼び出しフィールドのidとnameにセットします。SalesEmployeeクラスでオーバーライドしたメソッドが呼び出されます。
その後、getId()とgetName()を呼び出して出力していますが、セットした値は表示されません。Employeeインターフェースで定義したメソッドが呼び出されたからです。
それでは、getId()とgetName()もオーバライドしてみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
public class SalesEmployee implements Employee { private Integer id; private String name; @Override public Integer getId() { return id; } @Override public void setId(Integer id) { this.id = id; } @Override public String getName() { return name; } @Override public void setName(String name) { this.name = name; } } |
Mainクラスを再度利用して実行します。
実行結果
id:1000
name:営業たろう
今回は、SalesEmployeeクラスでオーバーライドしたgetId()とgetName()が呼び出されセットした値が表示されました。
インターフェースを実装するクラスの都合に合わせて、デフォルトメソッドはそのまま利用したり、オーバーライドしたりすることができるので非常に便利です。