4、java基礎:JDK8接口新特性以及接口和抽象類區別


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

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 {  
    //實現接口后,因為默認方法不是抽象方法,所以可以不重寫,但是如果開發需要,也可以重寫  
}  

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

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只能通過接口類調用接口中的靜態方法,所以對編譯器來說是可以區分的。但是如果兩個接口中定義了一模一樣的默認方法,並且一個實現類同時實現了這兩個接口,那么必須在實現類中重寫默認方法,否則編譯失敗。

public interface JDK8Interface1 {  
  
    // static修飾符定義靜態方法  
    static void staticMethod() {  
        System.out.println("JDK8Interface1接口中的靜態方法");  
    }  
  
    // default修飾符定義默認方法  
    default void defaultMethod() {  
        System.out.println("JDK8Interface1接口中的默認方法");  
    }  
  
}  
public class JDK8InterfaceImpl implements JDK8Interface,JDK8Interface1 {  
  
    // 由於JDK8Interface和JDK8Interface1中default方法一樣,所以這里必須覆蓋  
    @Override  
    public void defaultMethod() {  
        System.out.println("接口實現類覆蓋了接口中的default");  
    }  
}  
public class Main {  
    public static void main(String[] args) {  
        JDK8Interface.staticMethod();  
        JDK8Interface1.staticMethod();  
        new JDK8InterfaceImpl().defaultMethod();  
    }  
}  

二者的區別

抽象類:

  1、包含一個或多個抽象方法的類本身必須被聲明成抽象的。

  2、除了抽象方法之外,抽象類還可以包含具體數據和具體方法

  3、擴展抽象類的兩種選擇(抽象方法的具體實現在子類中):

       A、 抽象類中定義部分抽象類或不定義抽象類方法,這樣就必須將子類也標記為抽象類。

       B、定義全部的抽象方法,這樣子類就不是抽象的了

   4、不能直接被實例化,可以間接使用

   5、一個類如果繼承一個抽象類,必須實現該抽象類里聲明的抽象方法

接口:

1、一個類可以實現(implement)一個或多個接口,並在需要接口的地方,隨時使用實現了相應接口的對象

2、接口不是類,而是對類的一組需求描述,這些類要遵從接口描述的統一格式進行定義

3、接口中的所有方法自動地屬於public,因此,聲明方法時,不必提供關鍵字public,不過,實現接口時,必須把方法聲明成public,否則,編譯器將認為這個方法的訪問屬性是包可見性,即類的默認訪問屬性。

4、接口中不能含有實例域或靜態方法,但卻可以包含常量

5、接口不能被實例化

6、接口中定義的方法都為抽象方法

注:當多個接口中有同名、同參、返回值類型不同的方法時,會產生命名沖突(因為接口支持多繼承,防止出現二義性)

7、接口之間允許多繼承(java只在接口允許多繼承)

8、Java 8用默認方法與靜態方法這兩個新概念來擴展接口的聲明


免責聲明!

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



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