在JDK8以前,Interface之中是能夠定義變量和方法的,變量必須是public static final 的 , 方法必須是public abstract的 , 因爲這些修飾符是默認的,因此在JDK8以前,下面寫法是等價的。java
package com.simple.java8features; /** * Created with IntelliJ IDEA. * * @author: zhubo * @description: 在jdk8以前,interface之中能夠定義變量和方法,變量必須是public、static、final的,方法必須是public、abstract的。因爲這些修飾符都是默認的,因此在JDK8以前,下面的寫法都是等價的。 * @time: 2018年08月05日 * @modifytime: */ public interface JDK8BeforeInterface { public static final int field1 = 0; int field2 = 0; public abstract void m1(int a) throws Exception ; void m2(int a) throws Exception; }
JDK8及之後,容許咱們在接口中定義static方法和default方法。git
package com.simple.java8features; /** * Created with IntelliJ IDEA. * * @author: zhubo * @description: JDK8及之後,容許咱們在接口中定義static方法和default方法。 * @time: 2018年08月05日 * @modifytime: */ public interface JDK8Interface { // static修飾符定義靜態方法 static void staticMethod() { System.out.println("接口中定義靜態方法"); } // default修飾符定義默認方法 default void defaultMethod() { System.out.println("接口中的默認方法"); } }
再定義一個接口的實現類:github
/** * Created with IntelliJ IDEA. * * @author: zhubo * @description:因爲java支持一個實現類能夠實現多個接口,若是多個接口中存在一樣的static和default方法會怎麼樣呢? * 若是有兩個接口中的靜態方法如出一轍,而且一個實現類同時實現了這兩個接口,此時並不會產生錯誤,由於jdk8只能經過接口類調用接口中的靜態方法, * 因此對編譯器來講是能夠區分的。可是若是兩個接口中定義瞭如出一轍的默認方法,而且一個實現類同時實現了這兩個接口,那麼必須在實現類中重寫默認方法, * 不然編譯失敗。 * @time: 2018年08月05日 * @modifytime: */ public class JDK8InterfaceImpl implements JDK8Interface ,JDK8Interface1 { //實現接口後,由於默認方法不是抽象方法,因此能夠不重寫,可是若是開發須要,也能夠重寫 }
靜態方法,只能經過接口名調用,不能夠經過實現類的類名或者實現類的對象調用。default方法,只能經過接口實現類的對象來調用。編程
package com.simple.java8features; /** * Created with IntelliJ IDEA. * * @author: zhubo * @description: 靜態方法,只能經過接口名調用,不能夠經過實現類的類名或者實現類的對象調用。default方法,只能經過接口實現類的對象來調用。 * @time: 2018年08月05日 * @modifytime: */ public class Main { public static void main(String[] args) { // static方法必須經過接口類調用 JDK8Interface.staticMethod(); //default方法必須經過實現類的對象調用 new JDK8InterfaceImpl().defaultMethod(); } }
固然若是接口中的默認方法不能知足某個實現類須要,那麼實現類能夠覆蓋默認方法。ide
package com.simple.java8features; /** * Created with IntelliJ IDEA. * * @author: zhubo * @description: 固然若是接口中的默認方法不能知足某個實現類須要,那麼實現類能夠覆蓋默認方法。 * @time: 2018年08月05日 * @modifytime: */ public class AnotherJDK8InterfaceImpl implements JDK8Interface { @Override public void defaultMethod() { System.out.println("接口實現類覆蓋了接口中的default"); } }
因爲java支持一個實現類能夠實現多個接口,若是多個接口中存在一樣的static和default方法會怎麼樣呢?若是有兩個接口中的靜態方法如出一轍,而且一個實現類同時實現了這兩個接口,此時並不會產生錯誤,由於jdk8只能經過接口類調用接口中的靜態方法,因此對編譯器來講是能夠區分的。可是若是兩個接口中定義瞭如出一轍的默認方法,而且一個實現類同時實現了這兩個接口,那麼必須在實現類中重寫默認方法,不然編譯失敗。函數式編程
package com.simple.java8features; /** * Created with IntelliJ IDEA. * * @author: zhubo * @description: 因爲java支持一個實現類能夠實現多個接口,若是多個接口中存在一樣的static和default方法會怎麼樣呢? * 若是有兩個接口中的靜態方法如出一轍,而且一個實現類同時實現了這兩個接口,此時並不會產生錯誤,由於jdk8只能經過接口類調用接口中的靜態方法, * 因此對編譯器來講是能夠區分的。可是若是兩個接口中定義瞭如出一轍的默認方法,而且一個實現類同時實現了這兩個接口,那麼必須在實現類中重寫默認方法, * 不然編譯失敗。 * @time: 2018年08月05日 * @modifytime: */ public interface JDK8Interface1 { static void staticMethod(){ System.out.println("JDK8Interface1接口中的靜態方法"); } default void defaultMethod() { System.out.println("JDK8Interface1接口中的默認方法"); } }
package com.simple.java8features; /** * Created with IntelliJ IDEA. * * @author: zhubo * @description:因爲java支持一個實現類能夠實現多個接口,若是多個接口中存在一樣的static和default方法會怎麼樣呢? * 若是有兩個接口中的靜態方法如出一轍,而且一個實現類同時實現了這兩個接口,此時並不會產生錯誤,由於jdk8只能經過接口類調用接口中的靜態方法, * 因此對編譯器來講是能夠區分的。可是若是兩個接口中定義瞭如出一轍的默認方法,而且一個實現類同時實現了這兩個接口,那麼必須在實現類中重寫默認方法, * 不然編譯失敗。 * @time: 2018年08月05日 * @modifytime: */ public class JDK8InterfaceImpl implements JDK8Interface ,JDK8Interface1 { //實現接口後,由於默認方法不是抽象方法,因此能夠不重寫,可是若是開發須要,也能夠重寫 @Override public void defaultMethod() { System.out.println("接口實現類覆蓋了接口中的default"); } }
GitHub函數