Java8已經(jīng)發(fā)布很久了,但是由于Android一直沒有提供支持复隆,所以并沒有關(guān)注太多甲献。最近Android Studio的最新預(yù)覽版已經(jīng)開始支持Java8的一些新特性,作為一個(gè)程序員痊剖,比較重要的是跟上技術(shù)的節(jié)奏,所以最近開始學(xué)習(xí)一下Java8的新特性垒玲,在這里進(jìn)行一些學(xué)習(xí)心得和經(jīng)驗(yàn)的分享陆馁。
由于是剛開始學(xué),肯定有很多地方理解的不到位和錯(cuò)誤的情況合愈,歡迎進(jìn)行指正和補(bǔ)充叮贩,大家一起共同進(jìn)步谨湘。
1 接口的默認(rèn)方法與靜態(tài)方法
Java8 對接口的定義進(jìn)行了進(jìn)一步擴(kuò)展冠桃,在之前,一個(gè)接口中的所有方法必須是抽象的。而在這里憾儒,引入了默認(rèn)方法與靜態(tài)方法的概念开仰。
(這一新特性在API 24 及以上可以使用)
1.1 默認(rèn)方法
在官方文檔中對默認(rèn)方法是這樣解釋的:
Default methods enable you to add new functionality to the interfaces of your libraries and ensure binary compatibility with code written for older versions of those interfaces.
簡單來說就是可以向接口中提供新的方法喉刘,而保證對舊版本的兼容
至于為什么會這樣新博,我們先看看什么是默認(rèn)方法:
首先,默認(rèn)方法可以有方法體桃纯,并且用關(guān)鍵字default修飾:
interface MyListener
default void sayHello(){
System.out.println("hello");
}
}
默認(rèn)方法與普通接口內(nèi)方法最大的區(qū)別是酷誓,接口的實(shí)現(xiàn)類可以選擇不重寫此方法。
具體應(yīng)用情況是比如在一個(gè)項(xiàng)目中态坦,對于新的需求盐数,需要在接口中抽象新的方法,但又不是所有的實(shí)現(xiàn)類都需要新方法伞梯,如果放在之前玫氢,我們就不得不對所有的實(shí)現(xiàn)類都重寫新的抽象方法。而默認(rèn)方法的引入就很大程度上解決了這種困境壮锻。當(dāng)需要抽象新方法時(shí)考慮使用默認(rèn)方法琐旁,然后只在需要的地方重寫即可。這樣就實(shí)現(xiàn)了官方文檔中所說的:提供新方法而且兼容舊版本猜绣。
默認(rèn)方法在接口中可以定義多個(gè)。
注意如果實(shí)現(xiàn)類重寫了默認(rèn)方法敬特,那么該方法就不可以再用default修飾
如果是一個(gè)接口繼承另一個(gè)有默認(rèn)方法的接口掰邢,也可以選擇不重寫,如果重寫伟阔,也可以重寫為新的默認(rèn)方法
interface MyListener2 extends MyListener{
@Override
default void sayHello() {
}
}
當(dāng)然也可以去除default修飾辣之,重新成為一個(gè)新的抽象方法
interface MyListener2 extends MyListener{
@Override
void sayHello();
}
如果是在多重實(shí)現(xiàn)有多個(gè)相同的默認(rèn)方法,為了避免歧義皱炉,這時(shí)就必須重寫該方法
1.2 靜態(tài)方法
既然可以在接口中定義帶方法體的默認(rèn)方法怀估,那么引入靜態(tài)方法也在情理之中了。
與普通的靜態(tài)方法一樣合搅,使用static修飾即可:
static void sayHi(){
System.out.println("hi");
}
還記得普通類中的靜態(tài)方法既可以通過類名調(diào)用多搀,也可以通過實(shí)例調(diào)用,但是在接口中的靜態(tài)方法則只能通過 接口名.方法名 的形式調(diào)用灾部。也就是說不能通過實(shí)現(xiàn)類進(jìn)行調(diào)用康铭。
由于只能通過 接口名.方法名 的形式調(diào)用,所以多重實(shí)現(xiàn)中赌髓,靜態(tài)方法可以重名或相同从藤,并不會引起歧義催跪。
最后需要注意的時(shí),雖然默認(rèn)方法的引入極大的方便我們項(xiàng)目的擴(kuò)展夷野,但是由于比較容易引起歧義懊蒸,所以使用時(shí)還是要考慮完全。