接口和抽象方法的聯系和區別


一、相同點:

1、抽象方法和接口都不能被實例化,但可以定義抽象類和接口類型的引用。

二、不同點:

1、一個類繼承抽象類需要實現其中的抽象方法,否則該類還是需要被聲明為抽象類,當一個類實現了接口,就必須實現其所有方法。

2、接口相比於抽象類更抽象,抽象類中可以定義構造器,可以有抽象方法和實現方法,接口則沒有構造方法,且方法全是抽象方法。

3、接口中的方法默認是public的,抽象類的方法沒有限制

4、接口中定義的成員變量實際上都是常量(public static final),抽象類中的成員變量沒有限制

5、抽象類不一定要有抽象方法,而有抽象方法的類必須聲明為抽象類

==========================================================================================================

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

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

public interface test {
     public static  final int a = 1;
     int a_copy = 1;
   
public abstract void method1(int a); void method2(int a); }

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();
    }
}

 


免責聲明!

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



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