jdk8 接口的變化


在jdk8之前,interface之中可以定義變量和方法,變量必須是public、static、final的,方法必須是public、abstract的。由於這些修飾符都是默認的以下寫法等價

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修飾符定義靜態方法 
static void staticMethod() { 
System.out.println("接口中的靜態方法"); 
} 

// default修飾符定義默認方法 
default void defaultMethod() { 
System.out.println("接口中的默認方法"); 
} 
}

public class JDK8InterfaceImpl implements JDK8Interface { 
//實現接口后,因為默認方法不是抽象方法,所以可以不重寫,但是如果開發需要,也可以重寫 
}

public class Main { 
public static void main(String[] args) { 
// static方法必須通過接口類調用 
JDK8Interface.staticMethod(); 

//default方法必須通過實現類的對象調用 
new JDK8InterfaceImpl().defaultMethod(); 
} 
}

當然如果接口中的默認方法不能滿足某個實現類需要,那么實現類可以覆蓋默認方法。

public class AnotherJDK8InterfaceImpl implements JDK8Interface { 

// 簽名跟接口default方法一致,但是不能再加default修飾符 
@Override 
public void defaultMethod() { 
System.out.println("接口實現類覆蓋了接口中的default"); 
} 
} 

由於java支持一個實現類可以實現多個接口,如果多個接口中存在同樣的static和default方法會怎么樣呢?如果有兩個接口中的靜態方法一模一樣,並且一個實現類同時實現了這兩個接口,此時並不會產生錯誤,因為jdk8只能通過接口類調用接口中的靜態方法,所以對編譯器來說是可以區分的。但是如果兩個接口中定義了一模一樣的默認方法,並且一個實現類同時實現了這兩個接口,那么必須在實現類中重寫默認方法,否則編譯失敗。

 

轉載自:  https://blog.csdn.net/qq_40942323/article/details/96460798


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM