java8中接口有兩個新特性,一個是靜態方法,一個是默認方法。
static方法
java8中為接口新增了一項功能:定義一個或者多個靜態方法。
定義用法和普通的static方法一樣:
public interface InterfaceTest { /** * 接口中的靜態方法 */ static void testStatic() { System.out.println("我是接口的一個靜態方法"); } }
調用的方式和靜態類調用靜態方法一樣:
InterfaceTest.testStatic(); // 我是接口的一個靜態方法
這里要注意的是,實現接口的類或者子接口不會繼承接口中的靜態方法。
default方法
在接口中,增加default方法,是為了既有的成千上萬的Java類庫的類增加新的功能,且不必對這些類進行重新設計。因此它既被稱為默認方法,又被稱為拓展方法。
比如說,只需要在Collection接口中增加default Stream stream(),相應的Set和List接口以及它們的子類都會包含此方法,不必再去為每個子類重新copy這個方法。
default方法的出現,允許了我們在接口中添加非抽象的方法實現。
實現單一接口,僅實現接口:
public interface InterfaceTest { /** * 接口下的靜態方法 */ static void testStatic() { System.out.println("我是接口下的靜態方法"); } /** * 接口下的默認方法 */ default void testDefault() { System.out.println("我是接口下的默認方法"); } } /** * 只實現這個接口 */ public class InterfaceTestImpl implements InterfaceTest { }
僅實現接口的運行:
InterfaceTest.testStatic(); // 我是接口下的靜態方法 new InterfaceTestImpl().testDefault(); // 我是接口下的默認方法
如果接口中的默認方法不能滿足某個實現類的需要,那么實現類可以覆蓋默認方法。
實現單一接口,並重寫接口中的default方法:
public class InterfaceTestImpl implements InterfaceTest { /** * 跟接口default方法一致,但不能再加default修飾符 */ @Override public void testDefault(){ System.out.println("我重寫了接口的默認方法"); } }
重寫了default方法的運行:
InterfaceTest.testStatic(); // 我是接口下的靜態方法 new InterfaceTestImpl().testDefault(); // 我重寫了接口的默認方法
實現多個接口,且接口中擁有相同的default方法和static方法:
public class InterfaceATestImpl implements InterfaceTest, InterfaceTest1{ @Override public void testDefault() { System.out.println("我重寫了兩個接口相同的默認方法"); } }
重寫了兩個接口相同的default方法的運行:
InterfaceTest.testStatic(); // 我是接口下的靜態方法 new InterfaceTestImpl().testDefault(); // 我重寫了兩個接口相同的默認方法
如果實現多個接口的時候,每個接口都有相同的default方法,則必須要重寫該方法。
"人的前半生沒有對錯,只有成長。"