JDK8以前,interface中能夠定義常量和抽象方法,訪問修飾符是public。java
public interface A { /** a1和a2寫法是等價的 */ public static final int a1 = 0; int a2 = 0; /** methodA1和methodA2寫法是等價的 */ public abstract void methodA1(); void methodA2(); }
JDK8起,容許咱們在interface中使用static和default修飾方法(使用這兩種修飾符中其一就不能使用abstract修飾符),從而方法具備方法體。ide
public interface A { /** default訪問修飾符修飾的方法 */ default void methodB1() { System.out.println("this is default method"); } /** static修飾符修飾的方法 */ public static void methodB2() { System.out.println("this is static method"); } }
default修飾的方法,經過接口的實現類的對象調用;static修飾的方法,直接經過接口名調用。this
public class Test implements A{ public static void main(String[] args) { /** 接口的default方法,經過接口的實現類的對象調用 */ Test test = new Test(); test.methodB1(); /** 接口的靜態方法,經過接口名調用 */ A.methodB2(); } }
因爲java支持一個實現類能夠實現多個接口,若是多個接口中存在一樣的static和default方法會怎麼樣呢?spa
public interface A { /** default訪問修飾符修飾的方法 */ default void methodB1() { System.out.println("this is default method -- InterfaceA"); } /** static修飾符修飾的方法 */ public static void methodB2() { System.out.println("this is static method -- InterfaceA"); } } public interface B{ /** default訪問修飾符修飾的方法 */ default void methodB1() { System.out.println("this is default method -- InterfaceB"); } /** static修飾符修飾的方法 */ public static void methodB2() { System.out.println("this is static method -- InterfaceB"); } } public class Test implements A,B{ /** 因爲A和B中default方法同樣,因此這裏必須覆蓋 */ @Override public void methodB1() { System.out.println("this is Overriding methods"); } public static void main(String[] args) { /** 接口的default方法,經過接口的實現類的對象調用 */ Test test = new Test(); test.methodB1(); /** A接口的靜態方法,經過接口名調用 */ A.methodB2(); /** B接口的靜態方法,經過接口名調用 */ B.methodB2(); } }
運行結果:.net
參考: https://blog.csdn.net/aitangyong/article/details/54134385code