驚呆了!JDK1.8竟然打破了我對(duì)接口的一切認(rèn)知:default
來(lái)源:cnblogs.com/AlanWilliamWalker/p/11156455.html
?簡(jiǎn)介
在JDK1.8中打破了這樣的認(rèn)識(shí),接口中的方法可以有方法體,但需要關(guān)鍵字static或者default來(lái)修飾,使用static來(lái)修飾的稱之為靜態(tài)方法,靜態(tài)方法通過(guò)接口名來(lái)調(diào)用,使用default來(lái)修飾的稱之為默認(rèn)方法,默認(rèn)方法通過(guò)實(shí)例對(duì)象來(lái)調(diào)用。
靜態(tài)方法和默認(rèn)方法的作用:
靜態(tài)方法和默認(rèn)方法都有自己的方法體,用于提供一套默認(rèn)的實(shí)現(xiàn),這樣子類對(duì)于該方法就不需要強(qiáng)制來(lái)實(shí)現(xiàn),可以選擇使用默認(rèn)的實(shí)現(xiàn),也可以重寫(xiě)自己的實(shí)現(xiàn)。當(dāng)為接口擴(kuò)展方法時(shí),只需要提供該方法的默認(rèn)實(shí)現(xiàn)即可,至于對(duì)應(yīng)的實(shí)現(xiàn)類可以重寫(xiě)也可以使用默認(rèn)的實(shí)現(xiàn),這樣所有的實(shí)現(xiàn)類不會(huì)報(bào)語(yǔ)法錯(cuò)誤:Xxx不是抽象的, 并且未覆蓋Yxx中的抽象方法。
?示例
public?interface?IHello?{
//?使用abstract修飾不修飾都行
void?sayHi();
static?void?sayHello(){
System.out.println("static?method:?say?hello");
}
default?void?sayByebye(){
System.out.println("default?mehtod:?say?byebye");
}
}
HelloImpl實(shí)現(xiàn)類
public?class?HelloImpl?implements?IHello?{
@Override
public?void?sayHi()?{
System.out.println("normal?method:?say?hi");
}
}
Main
public?class?Main?{
public?static?void?main(String[]?args)?{
HelloImpl?helloImpl?=?new?HelloImpl();
//?對(duì)于abstract抽象方法通過(guò)實(shí)例對(duì)象來(lái)調(diào)用
helloImpl.sayHi();
//?default方法只能通過(guò)實(shí)例對(duì)象來(lái)調(diào)用
helloImpl.sayByebye();
//?靜態(tài)方法通過(guò)?接口名.方法名()?來(lái)調(diào)用
IHello.sayHello();
//?接口是不允許new的,如果使用new后面必須跟上一對(duì)花括號(hào)用于實(shí)現(xiàn)抽象方法,?這種方式被稱為匿名實(shí)現(xiàn)類,匿名實(shí)現(xiàn)類是一種沒(méi)有名稱的實(shí)現(xiàn)類
//?匿名實(shí)現(xiàn)類的好處:不用再單獨(dú)聲明一個(gè)類,缺點(diǎn):由于沒(méi)有名字,不能重復(fù)使用,只能使用一次
new?IHello()?{
@Override
public?void?sayHi()?{
System.out.println("normal?method:?say?hi");
}
}.sayHi();
}
}
執(zhí)行結(jié)果:
normal?method:?say?hi
default?mehtod:?say?byebye
static?method:?say?hello
normal?method:?say?hi
這篇文章雖然簡(jiǎn)單,但是我覺(jué)得還是有必要分享一下,畢竟與1.7相比,發(fā)生了不少的變化,希望本文能對(duì)你有所幫助。
我們視頻號(hào)開(kāi)通啦,
是關(guān)于國(guó)外程序員題材的視頻號(hào)
長(zhǎng)按二維碼關(guān)注
評(píng)論
圖片
表情
