在jdk8之前,interface之中可以定義變量和方法,變量必須是public、static、final的,方法必須是public、abstract的。由于這些修飾符都是默認(rèn)的,所以在JDK8之前,下面的寫法都是等價(jià)的。
public interface JDK8BeforeInterface {
public static final int field1 = 0;
int field2 = 0;
public abstract void method1(int a) throws Exception;
void method2(int a) throws Exception;
}
JDK8及以后,允許我們在接口中定義static方法和default方法。
public interface JDK8Interface {
// static修飾符定義靜態(tài)方法
static void staticMethod() {
System.out.println("接口中的靜態(tài)方法");
}
// default修飾符定義默認(rèn)方法
default void defaultMethod() {
System.out.println("接口中的默認(rèn)方法");
}
}
————————————————
再定義一個(gè)接口的實(shí)現(xiàn)類:
public class JDK8InterfaceImpl implements JDK8Interface {
//實(shí)現(xiàn)接口后,因?yàn)槟J(rèn)方法不是抽象方法,所以可以不重寫,但是如果開發(fā)需要,也可以重寫
}
靜態(tài)方法,只能通過接口名調(diào)用,不可以通過實(shí)現(xiàn)類的類名或者實(shí)現(xiàn)類的對象調(diào)用。default方法,只能通過接口實(shí)現(xiàn)類的對象來調(diào)用。
public class Main {
public static void main(String[] args) {
// static方法必須通過接口類調(diào)用
JDK8Interface.staticMethod();
//default方法必須通過實(shí)現(xiàn)類的對象調(diào)用
new JDK8InterfaceImpl().defaultMethod();
}
}
當(dāng)然如果接口中的默認(rèn)方法不能滿足某個(gè)實(shí)現(xiàn)類需要,那么實(shí)現(xiàn)類可以覆蓋默認(rèn)方法。
public class AnotherJDK8InterfaceImpl implements JDK8Interface {
// 簽名跟接口default方法一致,但是不能再加default修飾符
@Override
public void defaultMethod() {
System.out.println("接口實(shí)現(xiàn)類覆蓋了接口中的default");
}
}
由于java支持一個(gè)實(shí)現(xiàn)類可以實(shí)現(xiàn)多個(gè)接口,如果多個(gè)接口中存在同樣的static和default方法會(huì)怎么樣呢?如果有兩個(gè)接口中的靜態(tài)方法一模一樣,并且一個(gè)實(shí)現(xiàn)類同時(shí)實(shí)現(xiàn)了這兩個(gè)接口,此時(shí)并不會(huì)產(chǎn)生錯(cuò)誤,因?yàn)閖dk8只能通過接口類調(diào)用接口中的靜態(tài)方法,所以對編譯器來說是可以區(qū)分的。但是如果兩個(gè)接口中定義了一模一樣的默認(rèn)方法,并且一個(gè)實(shí)現(xiàn)類同時(shí)實(shí)現(xiàn)了這兩個(gè)接口,那么必須在實(shí)現(xiàn)類中重寫默認(rèn)方法,否則編譯失敗。
public interface JDK8Interface1 {
// static修飾符定義靜態(tài)方法
static void staticMethod() {
System.out.println("JDK8Interface1接口中的靜態(tài)方法");
}
// default修飾符定義默認(rèn)方法
default void defaultMethod() {
System.out.println("JDK8Interface1接口中的默認(rèn)方法");
}
}
public class JDK8InterfaceImpl implements JDK8Interface,JDK8Interface1 {
// 由于JDK8Interface和JDK8Interface1中default方法一樣,所以這里必須覆蓋
@Override
public void defaultMethod() {
System.out.println("接口實(shí)現(xiàn)類覆蓋了接口中的default");
}
}
public class Main {
public static void main(String[] args) {
JDK8Interface.staticMethod();
JDK8Interface1.staticMethod();
new JDK8InterfaceImpl().defaultMethod();
}
}

原文地址:https://blog.csdn.net/aitangyong/article/details/54134385