1. 程式人生 > 其它 >面試題:Java中 介面 和 抽象類 的區別

面試題:Java中 介面 和 抽象類 的區別

介面 和 抽象類 定義

抽象類:如果多個類中包含相同的行為,但行為發出的動作不一樣,這時可以進行上層的抽象,抽象出一層功能定義,即抽象方法,但沒有對應的功能實現。抽象方法包含在被 abstract 修飾的類中即抽象類。它具有如下特點

  • abstract 修飾的方法稱為抽象方法,抽象方法只有方法宣告沒有方法體
    • 注意:抽象類是為了繼承重寫抽象方法的,所以抽象類不能用 final 修飾。同時外部抽象類不允許使用 static 宣告,而內部的抽象類可以使用 static 宣告(繼承的時候使用“外部類.內部類”的形式表示類名稱)
  • 抽象類可以包含屬性、方法、構造方法,但構造方法不能用來例項化物件,只能被子類呼叫
    • 抽象類中的構造方法,其存在目的是為了抽象類的屬性初始化
    • 注意:子類物件例項化時,先執行父類構造器,再執行子類構造器
  • 抽象類不能被例項化,只能被繼承
  • 包含抽象方法的類一定是抽象類,但抽象類不一定包含抽象方法,抽象類還可以包含普通方法
  • 抽象方法的許可權修飾符只能為 public、protected、default,預設情況下為 public
  • 一個類繼承於一個抽象類,則子類必須實現抽象類的抽象方法,如果子類沒有實現父類的抽象方法,那子類必須定義為抽象類
public abstract class AbstractName{
    
    public String variable;
    
    public AbstractName(String variable){
        this.variable = variable;
    }
    
    public abstract void method1();
    
    public void method2(){
        //do something
    }
}

介面:Java介面可以看成是一種特殊的類,即用 interface 關鍵字修飾的類。它具有如下特點

  • 介面中可以包含 變數 和 方法,變數被隱式指定為 public static final,方法被隱式指定為 public abstract
  • 介面支援多繼承,解決了 Java 中類不能多繼承的問題
  • 一個類可以同時實現多個介面,一個類實現某個介面則必須實現該介面中的抽象方法,否則該類必須被定義為抽象類
public interface InterfaceName{
    
    public static final int variable=10;

    default void method1(){
        //do something
    }
    
    public static void method2(){
        //do something
    }
    
    public void method3();
}

總結:從設計層面來說,抽象是對類的抽象,是一種模板設計,而介面是對行為的抽象,是一種行為的規範


 介面 和 抽象類 區別

  1.  介面的方法預設是 public,所有方法在介面中不能有實現(Java 8 開始介面方法可以有預設實現和靜態方法),而抽象類可以有非抽象的方法
    1. 在 Java8 中,介面也可以定義靜態方法,可以直接用介面名呼叫,實現類是不可以呼叫的。如果實現類同時實現兩個介面,介面中都定義了一樣的預設方法,則必須重寫,不然會報錯

  2. 介面中除了 staticfinal 變數,不能有其他變數(在介面中,屬性都是預設public static final修飾的,這三個關鍵字可以省略),而抽象類中則不一定
  3. 一個類可以實現多個介面,但只能實現一個抽象類。介面自己本身可以通過 extends 關鍵字擴充套件多個介面
  4. 介面方法預設修飾符是 public,抽象方法可以有 publicprotecteddefault 這些修飾符(抽象方法就是為了被重寫所以不能使用 private 關鍵字修飾)