Java8 接口在变化
一、主要變化
Java8 中的接口發(fā)生了一些變化,具體的變化如下:
1.提供了靜態(tài)方法和默認(rèn)方法,分別使用 static 和 default 關(guān)鍵字修飾,這兩種方法可以有方法體 (下面是需要注意的地方)。
????[1]:default 方法屬于實(shí)例,static 方法屬于接口或類(lèi)。要注意的是:default 方法可以被繼承,static 方法不會(huì)。
????[2]:如果一個(gè)類(lèi)實(shí)現(xiàn)了多個(gè)接口,并且這些接口之間沒(méi)有相互繼承關(guān)系,同時(shí)存在相同的 default 方法時(shí)會(huì)報(bào)錯(cuò),不過(guò)你可以在實(shí)現(xiàn)類(lèi)中重寫(xiě) default 方法并通過(guò) <接口>.super.<方法名>(); 形式指定調(diào)用哪個(gè)父接口中的 default 方法。
2.如果一個(gè)接口只有一個(gè)抽象方法,那么這個(gè)接口會(huì)默認(rèn)自動(dòng)變成函數(shù)式接口。
3.如果使用了@FunctionalInterface 注解對(duì)接口進(jìn)行修飾,說(shuō)明這個(gè)接口是一個(gè)函數(shù)式接口,在該接口只能有一個(gè)抽象方法 (不限制靜態(tài)方法和默認(rèn)方法)。一個(gè)函數(shù)式接口可以通過(guò) Lambda 表達(dá)式來(lái)創(chuàng)建該接口的對(duì)象。
二、簡(jiǎn)單示例
下面是一個(gè)關(guān)于 Java8 中接口的一個(gè)簡(jiǎn)單示例:在接口中定義了一個(gè) static 方法與一個(gè) default 方法,這兩個(gè)方法都可以有獨(dú)立的方法體,打破了以前只能在接口中定義抽象方法的規(guī)則。
通過(guò)一個(gè) Test 類(lèi)去實(shí)現(xiàn) TestInterface 接口,Test 類(lèi)的實(shí)例可以調(diào)用 testDefaultMethod() 方法但是不能調(diào)用 testStaticMethod() 方法,如果想調(diào)用 testStaticMethod() 方法可以通過(guò)使用接口的名字直接調(diào)用靜態(tài)方法。
public interface TestInterface {static void testStaticMethod(){System.out.println("static method run");}default void testDefaultMethod(){System.out.println("default method run");} }class Test implements TestInterface {public static void main(String[] args) {Test test = new Test();test.testDefaultMethod();//test.testStaticMethod(); Static method may be invoked on containing interface class onlyTestInterface.testStaticMethod(); //對(duì)于接口中的靜態(tài)方法可以使用接口名直接調(diào)用} } 輸出
default method run
static method run
如果一個(gè)類(lèi)實(shí)現(xiàn)了兩個(gè)接口,這兩個(gè)接口之間沒(méi)有繼承關(guān)系,并且這兩個(gè)接口中有相同的默認(rèn)方法,那么你在實(shí)現(xiàn)它們兩個(gè)的時(shí)候必須要重寫(xiě)其中的默認(rèn)方法,可以在重寫(xiě)的方法中調(diào)用指定接口中的默認(rèn)方法,否則會(huì)報(bào)錯(cuò)。
public interface TestInterface {default void testDefaultMethod(){System.out.println("TestInterface default method run");} }interface TestInterface1{default void testDefaultMethod(){System.out.println("TestInterface1 default method run");} }class Test implements TestInterface,TestInterface1 {public void testDefaultMethod(){TestInterface1.super.testDefaultMethod();}public static void main(String[] args) {Test test = new Test();test.testDefaultMethod();} } 輸出
TestInterface1 default method run
三、 定義函數(shù)式接口
定義函數(shù)式接口的方式有兩種,一種是定義一個(gè)接口并且在該接口中只有一個(gè)抽象方法;第二種方式是使用@FunctionalInterface 注解聲明該接口是一個(gè)函數(shù)式接口,一旦加了@FunctionalInterface 注解那么在該接口中只能定義一個(gè)抽象方法,定義多了或者不定義會(huì)報(bào)錯(cuò)。
@FunctionalInterface public interface TestFunctionalInterface {static void staticMethod(){} //在函數(shù)式接口中不限制定義靜態(tài)方法與默認(rèn)方法default void defaultMethod(){}void functionalInterfaceMethod();// void functionalInterfaceMethod2(); 不允許 }總結(jié)
以上是生活随笔為你收集整理的Java8 接口在变化的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Java8 Lambda 表达式
- 下一篇: Java 设计模式之策略模式