抽象類和接口的區別已經變了

原文:抽象類和接口的區別已經變了java

隨着JDK的不斷迭代,抽象類和接口的區別已經有了些許改變,你是否還停留在JDK 7 的答案呢?面試

定義

  • 抽象類定義經過 abstract class
public abstract class A {}
複製代碼
  • 接口定義經過 abstract(默認) interface
public abstract interface A {}
複製代碼

派生方式

  • 子類繼承抽象類經過 extends , 單繼承
public abstract class A {}
public class B extends A {}
複製代碼
  • 抽象類實現接口經過 implements , 多實現,接口繼承接口經過 extends
public interface A {}
public interface B {}

public interface C extends A {}

public class D implements B,C {}
複製代碼
  • 子類(非抽象類)必須實現 抽象父類或接口 的所有未實現方法

實例化

  • 抽象類和接口均不能實例化
  • 抽象類能夠有構造方法,接口不能有構造方法
public abstract class A {
  public A () {}
}
複製代碼

屬性

  • 接口中定義屬性只能是 (public)靜態常量
public interface A {
  //默認(public static final) String A="ABC";
  String A = "ABC";
}
複製代碼
  • 抽象類中能夠定義有任意變量常量
//任意訪問修飾符的變量及常量
public abstract class A {
    private String a = "a";
    boolean b = true;
    public char c = 'a';
    protected int d = 2;
    public static final int e = 1;
}
複製代碼

方法

抽象類

抽象類中能夠和普通類中同樣擁有各自普通方法,也能夠擁有(沒必要須)抽象方法。微信

  • 抽象方法沒有方法體
  • 抽象方法權限修飾符不能爲 pirvate
public abstract class A {

  // protected or default
    public abstract void a();
}
複製代碼

抽象方法的目的就是爲了讓子類繼承重寫的,因此抽象方法不能私有,不能final修飾。架構

接口

JDK 7

  • 只能有方法的聲明
  • 方法必須聲明爲 public (默認)
public interface A {
  //默認(public abstract) void test();
    void test();
}
複製代碼

JDK 8

  • 增長默認實現方法
public interface A {
  // 這裏的 default 不能省略
  public(默認自動添加) default void defaultMethod(){
    //do something
  } 
}
複製代碼

默認方法的出現主要是面向類庫的開發者的,在堆接口進行擴展時,大量的實現類會讓人望而卻步。擁有默認方法後,子類可直接繼承使用或重寫。另外,添加默認方法不會影響函數式接口的使用。ide

  • 增長靜態方法
public interface A {
  // 靜態方法
  public(默認自動添加) static void staticMethod(){
    //do something
  }
}
複製代碼

靜態方法的調用直接經過接口名調用A.staticMethod() ,子類沒法重寫(override), 但能夠有同名方法。函數

JDK 9

  • 增長私有方法
public interface A {
  // 不能被子類繼承或重寫
  private void privateMethod(){
    //do something
  } 
}
複製代碼
  • 增長私有靜態方法
public interface A {
  // 不能被子類繼承或重寫
  private static void privateStaticMethod(){
    //do something
  } 
}
複製代碼

這兩種私有方法實際上是對JDK8 默認方法和靜態方法 的補充,這樣能夠避免代碼的冗餘。spa

設計

  1. 抽象類是對一組類的共同特徵進行抽象 ,是子類的模板(is-a)設計

  2. 接口是對行爲的抽象,是一種行爲的規範和約束 (like-a)code

往期文章一覽

千萬不要這樣使用 Arrays.asList !視頻

八張圖帶你認識Java

Java開發必備手冊

關注微信公衆號 「碼上實戰」 回覆 :面試視頻 和 架構師 送你很是不錯的資料!

相關文章
相關標籤/搜索