天天看點

不學Java8你就Out了—Java8的default方法詳解 不學Java8你就Out了!——Java8的default方法詳解

Java 8新增了default方法,它可以在接口添加新功能特性,而且還不影響接口的實作類。下面我們通過例子來說明這一點。

上面的代碼顯示了MyClass類實作了InterfacesA接口的saySomething()方法。現在我們為InterfacesA接口新增一個sayHi()方法。這麼做的話,MyClass類是無法通過編譯的,除非我們提供了sayHi()的實作方法。

Default方法是非常有用的,通過在接口定義的方法的通路修飾符前加上關鍵字default,那麼實作類就無需提供該方法的實作了。比如:

要注意,我們必須提供所有的default方法的實作。是以,default方法使我們的代碼更加靈活,在接口中也可以寫方法實作了。實作的方法會作為預設的方法實作。

那麼,多接口存在沖突該怎麼辦?

由于Java類可以實作多個接口,那麼就可能存在這樣的情況:兩個或多個接口都有一個同名的default接口方法,進而造成沖突。因為Java虛拟機在程式運作時,并不清楚你要使用哪一個default方法。這會導緻編譯錯誤。

讓我們來看看下面的例子。

它是通不過編譯的,會報以下錯誤:

“Duplicate default methods named sayHi with the parameters () and () are inherited from the types InterfaceB and InterfaceA.”

除非在MyClass類中重寫了sayHi()方法:

如果想指定調用哪一個接口的sayHi()方法,我們可以這麼做:

答案是不是很簡單呢?