public interface InterfacePlus { void run(); static Date createDate(){ return new Date(); } }
public interface InterfacePlus { void run(); default void sayHello() { System.out.println("Hello Java8!"); } }
第一節開篇就說過,Java8採用註解@FunctionalInterface
來保證接口爲函數接口,即接口中只顯式聲明一個抽象方法,新增的靜態方法和默認方法是否會影響其成爲一個函數接口呢,並不會,緣由是:靜態方法和默認方法均爲非抽象方法!
同理,複寫父類的非抽象方法也不影響其成爲一個函數接口,如複寫equals
方法,以下圖所示:
html
靜態方法能夠直接用接口來調用。java
Date date = InterfacePlus.createDate(); System.out.println(date);
非抽象的方法實現,只須要使用 default 關鍵字便可,這個特徵又叫作擴展方法。在實現該接口時,該默認擴展方法在子類上能夠直接使用,它的使用方式相似於抽象類中非抽象成員方法。函數
/*自行實現後可直接調用default方法*/ //子類實例化 InterfacePlusImpl interfacePlusImpl = new InterfacePlusImpl(); interfacePlusImpl.sayHello(); //Lambda實例化 InterfacePlus interfacePlus = System.out::println; interfacePlus.sayHello();
但擴展方法不可以重載 Object 中的方法。例如:toString、equals、 hashCode 不能在接口中被重載。
測試