默認(rèn)方法
聲明:java8新特性系列為個(gè)人學(xué)習(xí)筆記,參考地址點(diǎn)擊這里,侵刪??!
Java 8 新增了接口的默認(rèn)方法。
簡單說,默認(rèn)方法就是接口可以有實(shí)現(xiàn)方法,而且不需要實(shí)現(xiàn)類去實(shí)現(xiàn)其方法。
我們只需在方法名前面加個(gè) default 關(guān)鍵字即可實(shí)現(xiàn)默認(rèn)方法。
為什么要有這個(gè)特性?
首先,之前的接口是個(gè)雙刃劍,好處是面向抽象而不是面向具體編程,缺陷是,當(dāng)需要修改接口時(shí)候,需要修改全部實(shí)現(xiàn)該接口的類,目前的 java 8 之前的集合框架沒有 foreach 方法,通常能想到的解決辦法是在JDK里給相關(guān)的接口添加新的方法及實(shí)現(xiàn)。然而,對(duì)于已經(jīng)發(fā)布的版本,是沒法在給接口添加新方法的同時(shí)不影響已有的實(shí)現(xiàn)。所以引進(jìn)的默認(rèn)方法。他們的目的是為了解決接口的修改與現(xiàn)有的實(shí)現(xiàn)不兼容的問題。
語法
默認(rèn)方法語法格式如下:
interface Computer {
default void print(){
System.out.println("我是一臺(tái)電腦!");
}
}
多個(gè)默認(rèn)方法
一個(gè)接口可以有多個(gè)默認(rèn)方法,考慮這樣的情況,一個(gè)類實(shí)現(xiàn)了多個(gè)接口,且這些接口有相同的默認(rèn)方法,以下實(shí)例說明了這種情況的解決方法:
interface Computer {
default void print(){
System.out.println("我是一臺(tái)電腦!");
}
}
interface LenovoComputer {
default void print(){
System.out.println("我是一臺(tái)聯(lián)想電腦");
}
default void printPrise(){
System.out.println("我的售價(jià)是¥5000");
}
}
如果一個(gè)類,實(shí)習(xí)了多個(gè)接口,且多個(gè)接口的默認(rèn)方法名相同,那么該類要重寫該默認(rèn)方法,也可以使用 super 來調(diào)用指定接口的默認(rèn)方法
class MyComputer implements LenovoComputer, Computer {
@Override
public void print() {
LenovoComputer.super.print();
Computer.super.print();
}
}
interface Computer {
default void print() {
System.out.println("我是一臺(tái)電腦!");
}
}
interface LenovoComputer {
default void print() {
System.out.println("我是一臺(tái)聯(lián)想電腦");
}
default void printPrise() {
System.out.println("我的售價(jià)是¥5000");
}
}
多重繼承的沖突說明:
由于同一個(gè)方法可以從不同接口引入,自然而然的會(huì)有沖突的現(xiàn)象,規(guī)則如下:
1)一個(gè)聲明在類里面的方法優(yōu)先于任何默認(rèn)方法
2)優(yōu)先選取最具體的實(shí)現(xiàn)
一個(gè)類實(shí)現(xiàn)一個(gè)接口時(shí),必須重寫其中一個(gè)默認(rèn)方法,否則編譯出錯(cuò)。
class MyComputer implements LenovoComputer{
private void sayHello(){
System.out.println("hello");
}
@Override
public void printPrise() {
LenovoComputer.super.printPrise();
}
}
**默認(rèn)方法和抽象方法的區(qū)別: **是抽象方法必須要被實(shí)現(xiàn),默認(rèn)方法不是。作為替代方式,接口可以提供一個(gè)默認(rèn)的方法實(shí)現(xiàn),所有這個(gè)接口的實(shí)現(xiàn)類都會(huì)通過繼承得到這個(gè)方法(如果有需要也可以重寫這個(gè)方法)
靜態(tài)默認(rèn)方法
Java 8 的另一個(gè)特性是接口可以聲明(并且可以提供實(shí)現(xiàn))靜態(tài)方法。例如:
interface Computer {
static void printName(){
System.out.println("我沒起好名字");
}
default void print() {
System.out.println("我是一臺(tái)電腦!");
}
}