1. 程式人生 > >JDK8新特性:接口的靜態方法和默認方法

JDK8新特性:接口的靜態方法和默認方法

tool IT highlight RR 類名 another 存在 ltm tar

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

[java] view plain copy
  1. public interface JDK8BeforeInterface {
  2. public static final int field1 = 0;
  3. int field2 = 0;
  4. public abstract void method1(int a) throws Exception;
  5. void method2(int a) throws Exception;
  6. }

JDK8及以後,允許我們在接口中定義static方法和default方法。

[java] view plain copy
  1. public interface JDK8Interface {
  2. // static修飾符定義靜態方法
  3. static void staticMethod() {
  4. System.out.println("接口中的靜態方法");
  5. }
  6. // default修飾符定義默認方法
  7. default void defaultMethod() {
  8. System.out.println("接口中的默認方法");
  9. }
  10. }


再定義一個接口的實現類:

[java] view plain copy
  1. public class JDK8InterfaceImpl implements JDK8Interface {
  2. //實現接口後,因為默認方法不是抽象方法,所以可以不重寫,但是如果開發需要,也可以重寫
  3. }

靜態方法,只能通過接口名調用,不可以通過實現類的類名或者實現類的對象調用。default方法,只能通過接口實現類的對象來調用。

[java] view plain copy
  1. public class Main {
  2. public static void main(String[] args) {
  3. // static方法必須通過接口類調用
  4. JDK8Interface.staticMethod();
  5. //default方法必須通過實現類的對象調用
  6. new JDK8InterfaceImpl().defaultMethod();
  7. }
  8. }


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

[java] view plain copy
  1. public class AnotherJDK8InterfaceImpl implements JDK8Interface {
  2. // 簽名跟接口default方法一致,但是不能再加default修飾符
  3. @Override
  4. public void defaultMethod() {
  5. System.out.println("接口實現類覆蓋了接口中的default");
  6. }
  7. }



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

[java] view plain copy
  1. public interface JDK8Interface1 {
  2. // static修飾符定義靜態方法
  3. static void staticMethod() {
  4. System.out.println("JDK8Interface1接口中的靜態方法");
  5. }
  6. // default修飾符定義默認方法
  7. default void defaultMethod() {
  8. System.out.println("JDK8Interface1接口中的默認方法");
  9. }
  10. }

[java] view plain copy
  1. public class JDK8InterfaceImpl implements JDK8Interface,JDK8Interface1 {
  2. // 由於JDK8Interface和JDK8Interface1中default方法一樣,所以這裏必須覆蓋
  3. @Override
  4. public void defaultMethod() {
  5. System.out.println("接口實現類覆蓋了接口中的default");
  6. }
  7. }

[java] view plain copy
  1. public class Main {
  2. public static void main(String[] args) {
  3. JDK8Interface.staticMethod();
  4. JDK8Interface1.staticMethod();
  5. new JDK8InterfaceImpl().defaultMethod();
  6. }
  7. }

技術分享圖片

JDK8新特性:接口的靜態方法和默認方法