Java 8 允許在接口中定義默認(rèn)方法.默認(rèn)方法必須使用 default 修飾,該方法不能使用 static 修飾,無論程序是否指定,默認(rèn)方法總是使用 public 修飾.如果開發(fā)者沒有指定 public ,系統(tǒng)會(huì)自動(dòng)為默認(rèn)方法添加 public 修飾符.由于默認(rèn)方法并沒有 static 修飾,因此不能直接使用接口來調(diào)用默認(rèn)方法,需要使用接口的實(shí)現(xiàn)類的實(shí)例來調(diào)用這些默認(rèn)方法.
Java 8 允許在接口中定義類方法,類方法必須使用 static 修飾,該方法不能使用 default 修飾,無論程序是否指定,類方法總是使用 public 修飾.如果開發(fā)者沒有指定 public ,系統(tǒng)會(huì)自動(dòng)為類方法添加 public 修飾符.類方法可以直接使用接口來調(diào)用.
接口定義實(shí)例
public interface Output {
int MAX_CACHE_LINE = 50;
void out();
void getData(String msg);
// 在接口中定義默認(rèn)方法
default void print(String... msg) {
Arrays.asList(msg).forEach(m -> System.out.println(m));
}
default void print_v2(String... msg) {
for (String m : msg) {
System.out.println(m);
}
}
// 在接口中定義靜態(tài)方法
static String staticTest() {
return "接口里的靜態(tài)方法";
}
static String staticTest_v2() {
return "接口里的靜態(tài)方法_v2";
}
}
public class OutputImpl implements Output {
@Override
public void out() {
System.out.println("out invoke");
}
@Override
public void getData(String msg) {
System.out.println("getData invoke");
}
}
使用實(shí)例
Output output = new OutputImpl();
// 常規(guī)接口方法調(diào)用
output.out();
output.getData("hello");
// default方法調(diào)用
output.print("hello", "indian mi fan", "are you ok?");
output.print_v2("thank", "you");
// static方法調(diào)用
System.out.println(Output.staticTest());
System.out.println(Output.staticTest_v2());
// 不能通過接口的實(shí)現(xiàn)類直接調(diào)用接口的static方法OutputImpl.staticTest();
總結(jié)
- 接口的 default(默認(rèn)) 方法可以提供方法實(shí)現(xiàn)體
- 接口的實(shí)現(xiàn)類可以不實(shí)現(xiàn) default(默認(rèn)) 方法
- 接口的實(shí)現(xiàn)類可以實(shí)現(xiàn) default(默認(rèn)) 方法
- 接口的實(shí)現(xiàn)類的實(shí)例可以直接使用 default(默認(rèn)) 方法
- 接口的 static(靜態(tài)) 方法只能被接口直接調(diào)用.不能被接口的實(shí)現(xiàn)類調(diào)用
- 接口的 default(默認(rèn)) 方法與 static(靜態(tài)) 方法都可以定義多個(gè)
接口的 default 方法與 static 方法都不可以使用 final 進(jìn)行修飾
static 方法不能使用 final 修飾這個(gè)很容易理解, staitc 方法是屬于接口的方法,不會(huì)被實(shí)現(xiàn)類重寫.
default 方法不能被 final 修飾,個(gè)人的理解是 default 方法本質(zhì)上是一個(gè)"有實(shí)現(xiàn)體"的接口抽象方法,為所有實(shí)現(xiàn)類提供一個(gè)默認(rèn)的實(shí)現(xiàn),而這個(gè) default 方法和其他抽象方法一樣,被設(shè)計(jì)出來就希望是被實(shí)現(xiàn)類進(jìn)行重寫的.
假設(shè) default 方法可以被 final 修飾,則這個(gè)方法就不能被接口的所有實(shí)現(xiàn)類重寫,也就是說這個(gè)方法只能有一種實(shí)現(xiàn),那不就和 static 方法一樣了嗎?那直接將這個(gè)方法設(shè)計(jì)為 static 方法就好了.
注:重寫( override )是在繼承與多態(tài)的概念下才有的.
而 static 修飾的對(duì)象則屬于類本身,與繼承多態(tài)并無關(guān)聯(lián).
參考
《瘋狂Java講義》
Why is “final” not allowed in Java 8 interface methods?