之前面試時被過關于java8中接口的新特性問題挥转,當時沒有回答好,后查找資料共屈,在這里做下筆記绑谣。
java8之前接口中的方法默認類型都是public abstract,也就是抽象方法拗引,具體實現(xiàn)都交給實現(xiàn)類借宵。而java8對接口功能做了增強,增加了default方法和static方法矾削,也就是說從java8開始接口中的方法不再只能是抽象的壤玫,也可以有實現(xiàn)豁护。
其應用也非常簡單,如下面的例子所示垦细,在接口中定義default和static方法:
public interface DefaultInterface {
// default方法
default void defaultFunction(){
System.out.println("this is a default function");
}
// static方法
static void staticFunction(){
System.out.println("this is a static funcion");
}
}
在實現(xiàn)類中可以直接調用接口的default方法择镇,通過接口名.方法名調用static方法:
public class DefaultInterfaceImpl implements DefaultInterface{
public static void main(String[] args){
// 調用default方法
new DefaultInterfaceImpl().defaultFunction();
// 調用static方法
DefaultInterface.staticFunction();
}
}
運行結果如下:
注意點:
- 實現(xiàn)類可以重寫default方法,不能重寫static方法
- 如果一個類實現(xiàn)了兩個接口括改,而這兩個接口擁有相同方法簽名(相同的方法名、參數(shù))家坎、返回類型的default方法時嘱能,實現(xiàn)類就必須重寫該default方法,否則編譯器會因為不知道應該調用哪一個接口中的default方法而報錯虱疏。重寫接口中default方法后惹骂,編譯器會執(zhí)行重寫后的方法。不過好的編程習慣是明智的選擇方法名做瞪,避免和其它接口產生沖突对粪。
- 如果一個類同時繼承了一個類和實現(xiàn)了一個或多個接口,而父類中擁有和接口中default方法相同的簽名装蓬、返回值的方法時著拭,當該類未重寫該方法,直接調用時牍帚,將會調用父類中的方法儡遮。
新特性帶來的好處:
- 增加default方法,可以在不破壞java現(xiàn)有實現(xiàn)架構的情況下能往接口里增加新方法暗赶。
盡管如此鄙币,還是不推薦過度使用,如果你大量使用default方法在你的應用接口中蹂随,你將很快意識到他沒有真正精簡代碼十嘿。因為你不能在接口中提煉default里重復的代碼到一個新的普通方法,這與以精簡代碼為目的的default關鍵字相沖突岳锁。不過這個問題在java9中通過在接口中支持private interface methods得到解決绩衷。不過一般公司項目在jdk版本的使用上并不會太激進。
具體參考鏈接:https://www.cnblogs.com/wanshiming/p/9011879.html - 而static方法除了調用比較方便外還有一個有趣的意義浸锨,程序入口main方法也是static唇聘,現(xiàn)在在接口也可以運行了。
接口和抽象類:
如此看來接口是不是和類越來越接近了柱搜?那么回歸到一道基礎的面試題:現(xiàn)在接口和抽象類有什么區(qū)別呢迟郎?
- 一個類只能繼承一個抽象類,卻可以實現(xiàn)多個接口聪蘸。
- 雖然接口和抽象類都不能被實例化宪肖,但是抽象類可以有構造器表制,接口沒有構造器。
- 抽象類中方法可以有public控乾、protected么介、默認(包)甚至private范圍的方法,接口只能有public范圍的方法(即使是default也是public范圍的蜕衡,當然從java9開始接口也可以有private方法 壤短。