Java8中的default方法詳解
Java 8新增了default方法,它可以在接口添加新功能特性,而且還不影響接口的實(shí)現(xiàn)類。下面我們通過例子來說明這一點(diǎn)。
public class MyClass implements InterfaceA {
public static void main(String[] args){
}
@Override
public void saySomething() {
// TODO Auto-generated method stub
}
}
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)了。比如:
public class MyClass implements InterfaceA {
public static void main(String[] args){
}
@Override
public void saySomething() {
// TODO Auto-generated method stub
}
}
interface InterfaceA{
public void saySomething();
default public void sayHi(){
System.out.println("Hi");
}
}
要注意,我們必須提供所有的default方法的實(shí)現(xiàn)。因此,default方法使我們的代碼更加靈活,在接口中也可以寫方法實(shí)現(xiàn)了。實(shí)現(xiàn)的方法會作為默認(rèn)的方法實(shí)現(xiàn)。
那么,多接口存在沖突該怎么辦?
由于Java類可以實(shí)現(xiàn)多個(gè)接口,那么就可能存在這樣的情況:兩個(gè)或多個(gè)接口都有一個(gè)同名的default接口方法,從而造成沖突。因?yàn)镴ava虛擬機(jī)在程序運(yùn)行時(shí),并不清楚你要使用哪一個(gè)default方法。這會導(dǎo)致編譯錯(cuò)誤。
讓我們來看看下面的例子。
public class MyClass implements InterfaceA, InterfaceB {
public static void main(String[] args){
MyClass mc = new MyClass();
mc.sayHi();
}
@Override
public void saySomething() {
// TODO Auto-generated method stub
}
}
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");
}
}
它是通不過編譯的,會報(bào)以下錯(cuò)誤:
“Duplicate default methods named sayHi with the parameters () and () are inherited from the types InterfaceB and InterfaceA.”
除非在MyClass類中重寫了sayHi()方法:
public class MyClass implements InterfaceA, InterfaceB {
public static void main(String[] args){
MyClass mc = new MyClass();
mc.sayHi();
}
@Override
public void saySomething() {
// TODO Auto-generated method stub
}
@Override
public void sayHi(){
System.out.println("implemetation of sayHi() in MyClass");
}
}
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()方法,我們可以這么做:
public class MyClass implements InterfaceA, InterfaceB {
public static void main(String[] args){
MyClass mc = new MyClass();
mc.sayHi();
}
@Override
public void saySomething() {
// TODO Auto-generated method stub
}
@Override
public void sayHi(){
InterfaceA.super.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");
}
}
答案是不是很簡單呢?
相關(guān)文章
解讀SpringBoot中addCorsMappings配置跨域與攔截器互斥問題的原因
這篇文章主要介紹了解讀SpringBoot中addCorsMappings配置跨域與攔截器互斥問題的原因,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-12-12nodejs連接dubbo服務(wù)的java工程實(shí)現(xiàn)示例
這篇文章主要介紹了在項(xiàng)目遷移中,nodejs連接dubbo服務(wù)的java工程實(shí)現(xiàn)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2022-03-03Java多線程實(shí)現(xiàn)模擬12306火車站售票系統(tǒng)
12360火車票售票系統(tǒng)基本上大家都用過,那你知道是怎么實(shí)現(xiàn)的嗎,今天我們就模擬12306火車站售票系統(tǒng)來實(shí)現(xiàn),需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-05-05單例模式垃圾回收_動力節(jié)點(diǎn)Java學(xué)院整理
這篇文章主要為大家詳細(xì)介紹了單例模式垃圾回收的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-08-08