Java—抽象類和接口的區別

1)抽象類與接口的問題,之前校招畢業時面了好幾個公司,都會被問到,其實這也是開發過程當中常常遇到的問題,在這裏所說的接口是指jdk1.8以前的,由於jdk1.8中接口是能夠有默認方法等改動的。
2)若是爲了面試,直接跳過全部的,看我整理的那張表格就好了。程序員

1 抽象類

1.1 抽象類的含義

  包含抽象方法的類叫作抽象類。若是一個類包含一個或多個抽象方法,該類必須被限定爲抽象的(不然,編譯器會報錯)面試

1.2 抽象類的總結點

  1. 含有abstract修飾符的class即爲抽象類,abstract類不能建立實例對象。
  2. 含有abstract方法的類必須定義爲abstract class,abstract class類中的方法沒必要是抽象的。
  3. abstract class類中定義抽象方法必須在具體(Concrete)子類中實現,因此,不能有抽象構造方法或抽象靜態方法。
  4. 若是子類沒有實現抽象父類中的全部抽象方法,那麼子類也必須定義爲abstract類型。設計模式

    2 接口(interface)

    2.1 接口的含義

      能夠說成是抽象類的一種特例,接口中的全部方法都必須是抽象的。能有的內容是:static final的靜態成員變量、public abstract的抽象方法(可使用abstract關鍵字也能夠不使用)架構

2.2 接口的總結點

  1. 接口中的域隱式地是static和final的;
  2. 接口能夠嵌套在類或其餘接口中;
  3. 接口是實現多重繼承的途徑;
  4. 接口中的方法定義默認爲public abstract類型,接口中的成員變量類型默認爲public static final。
  5. 接口不能有構造器;
  6. 接口中不能有main()方法;

3 二者語法上的區別

  1. 普通成員變量:抽象類中能夠有普通成員變量,接口中沒有普通成員變量(static final變量);
  2. 方法:抽象類中能夠包含非抽象的普通方法,接口中的全部方法必須都是抽象的,不能有非抽象的普通方法;
  3. 靜態成員變量:抽象類和接口中均可以包含靜態成員變量,抽象類中的靜態成員變量的訪問類型能夠任意,但接口中定義的變量只能是public static final類型,而且默認即爲public static final類型。
  4. 靜態方法:抽象類中能夠包含靜態方法,但不能是抽象靜態方法;接口中不能包含靜態方法(靜態的方法不能被覆寫)
  5. 構造方法(靜態的):抽象類能夠有構造方法,接口中不能有構造方法;
  6. 方法訪問權限:抽象類中的抽象方法的訪問類型能夠是public,protected和(默認類型,雖然eclipse下不報錯,但應該也不行),但接口中的抽象方法只能是public類型的,而且默認即爲public abstract類型。
  7. 子類實現和繼承: 一個類能夠實現多個接口,但只能繼承一個抽象類。
  8. 初始化過程:當一個類在初始化時,要求其父類所有都已經初始化過了;可是一個接口在初始化時,並不要求其父接口所有都完成初始化,只有在真正使用父接口的時候(如引用接口中定義的常量),纔會初始化。

4 二者應用上的區別

  接口更多的是在系統架構設計方法發揮做用,主要用於定義模塊之間的通訊契約;而抽象類在代碼實現方面發揮做用,能夠實現代碼的重用。
  例如,模板方法設計模式是抽象類的一個典型應用,假設某個項目的全部Servlet類都要用相同的方式進行權限判斷、記錄訪問日誌和處理異常,那麼就能夠定義一個抽象的基類,讓全部的Servlet都繼承這個抽象基類,在抽象基類的service方法中完成權限判斷、記錄訪問日誌和處理異常的代碼,在各個子類中只是完成各自的業務邏輯代碼。eclipse

5 表格形式總結二者區別總結區別

6 問題:使用接口仍是抽象類?

答:若是要建立不帶任何方法定義和成員變量的基類,就應該選擇接口而不是抽象類。抽象類爲了代碼的複用,接口爲了多態性。架構設計

7 使用接口的緣由

1)爲了可以向上轉型爲多個基類型(由此而帶來的靈活性);
2)與使用抽象基類相同:防止客戶端程序員建立該類的對象,並確保這僅僅是創建一個接口。設計

相關文章
相關標籤/搜索