Java 8新增了default方法,它可以在接口添加新功能特性,而且還不影響接口的實(shí)現(xiàn)類。下面我們通過例子來說明這一點(diǎn)。
interface InterfaceA{
public void saySomething();
}
上面的代碼顯示了MyClass類實(shí)現(xiàn)了InterfacesA接口的saySomething()方法?,F(xiàn)在我們?yōu)镮nterfacesA接口新增一個(gè)sayHi()方法。這么做的話,MyClass類是無法通過編譯的,除非我們提供了sayHi()的實(shí)現(xiàn)方法。
Default方法是非常有用的,通過在接口定義的方法的訪問修飾符前加上關(guān)鍵字default,那么實(shí)現(xiàn)類就無需提供該方法的實(shí)現(xiàn)了。比如:
interface InterfaceA{
public void saySomething();
default public void sayHi(){
System.out.println("Hi");
}
}
要注意,我們必須提供所有的default方法的實(shí)現(xiàn)。因此,default方法使我們的代碼更加靈活,在接口中也可以寫方法實(shí)現(xiàn)了。實(shí)現(xiàn)的方法會(huì)作為默認(rèn)的方法實(shí)現(xiàn)。
那么,多接口存在沖突該怎么辦?
由于Java類可以實(shí)現(xiàn)多個(gè)接口,那么就可能存在這樣的情況:兩個(gè)或多個(gè)接口都有一個(gè)同名的default接口方法,從而造成沖突。因?yàn)镴ava虛擬機(jī)在程序運(yùn)行時(shí),并不清楚你要使用哪一個(gè)default方法。這會(huì)導(dǎo)致編譯錯(cuò)誤。
讓我們來看看下面的例子。
interface InterfaceA{
public void saySomething();
default public void sayHi(){
System.out.println("Hi from InterfaceA");
}
}
interface InterfaceB{
default public void sayHi(){
System.out.println("Hi from InterfaceB");
}
}
它是通不過編譯的,會(huì)報(bào)以下錯(cuò)誤:
“Duplicate default methods named sayHi with the parameters () and () are inherited from the types InterfaceB and InterfaceA.”
除非在MyClass類中重寫了sayHi()方法:
interface InterfaceA{
public void saySomething();
default public void sayHi(){
System.out.println("Hi from InterfaceA");
}
}
interface InterfaceB{
default public void sayHi(){
System.out.println("Hi from InterfaceB");
}
}
如果想指定調(diào)用哪一個(gè)接口的sayHi()方法,我們可以這么做:
interface InterfaceA{
public void saySomething();
default public void sayHi(){
System.out.println("Hi from InterfaceA");
}
}
interface InterfaceB{
default public void sayHi(){
System.out.println("Hi from InterfaceB");
}
}
答案是不是很簡(jiǎn)單呢?
新聞熱點(diǎn)
疑難解答
圖片精選