java8中爲接口新增了一項功能:定義一個或者更多個靜態方法。用法和普通的static方法同樣。java
public interface InterfaceA { /** * 靜態方法 */ static void showStatic() { System.out.println("InterfaceA++showStatic"); } }
測試ide
public class Test { public static void main(String[] args) { InterfaceA.show(); } }
結果測試
InterfaceA++showStatic
注意,實現接口的類或者子接口不會繼承接口中的靜態方法spa
在接口中,增長default方法, 是爲了既有的成千上萬的Java類庫的類增長新的功能, 且沒必要對這些類從新進行設計。 好比, 只需在Collection接口中
增長default Stream stream(), 相應的Set和List接口以及它們的子類都包含此的方法, 沒必要爲每一個子類都從新copy這個方法。設計
public interface InterfaceA { /** * 靜態方法 */ static void showStatic() { System.out.println("InterfaceA++showStatic"); } /** * 默認方法 */ default void showDefault() { System.out.println("InterfaceA ++showDefault"); } } /**先只實現這個接口 */ public class InterfaceAImpl implements InterfaceA{ }
測試code
public class Test { public static void main(String[] args) { InterfaceA.showStatic(); new InterfaceAImpl().showDefault(); } }
結果繼承
InterfaceA++showStatic InterfaceA ++showDefault
若是接口中的默認方法不能知足某個實現類須要,那麼實現類能夠覆蓋默認方法。接口
public class InterfaceAImpl implements InterfaceA{ /** * 跟接口default方法一致,但不能再加default修飾符 */ @Override public void showDefault(){ System.out.println("InterfaceAImpl++ defaultShow"); } }
測試string
public class Test { public static void main(String[] args) { InterfaceA.showStatic(); new InterfaceAImpl().showDefault(); } }
結果it
InterfaceA++showStatic InterfaceAImpl++ defaultShow
新建立個接口InterfaceB
/** */ public interface InterfaceB { /** * 靜態方法 */ static void showStatic() { System.out.println("InterfaceB++showStatic"); } /** * 默認方法 */ default void showDefault() { System.out.println("InterfaceB ++showDefault"); } }
若是不加劇寫方法就會報錯,由於實現類不知道你使用的是哪一個接口中的默認方法:
public class InterfaceAImpl implements InterfaceA,InterfaceB{
}
修改實現類
public class InterfaceAImpl implements InterfaceA,InterfaceB{ @Override public void showDefault() { System.out.println("InterfaceAImpl ++ showDefault"); }
測試結果
InterfaceA++showStatic InterfaceAImpl ++ showDefault
須要注意一點就是若是實現多個接口時,每一個接口都有相同的default方法須要重寫該方法。