Java8新特性:接口靜態方法與默認方法

在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函數

相關文章
相關標籤/搜索