接口和抽象類的不同,就像你和我的不同一樣

接口和抽象類的不同,就像你和我的不同一樣;
但是抽象類和接口的不同能說盡
而你與我之間,言不盡也道不明。

1. 好吧,我們開始正題,先說抽象類

我把我的理解寫在最前:
抽象類就是普通的類加上了abstract修飾,原來的普通類中的代碼不受影響,也就是說普通類中能寫的東西抽象類中都能寫,能不能調用就要另說了。

我們先看一個普通的類

public class Student {    
    private String name;
    private int id;

    public Student(String name, int id) {
        this.name = name;
        this.id = id;
    }

    public String getName() {
        return name;
    }
}

下面我們把它加上abstract修飾

我們發現,已經寫好的代碼不受影響,不會報紅線
但是其中的字段已經不能再生效,因爲抽象類不能實例化對象

public abstract class Student {

    private String name;
    private int id;

    public Student(String name, int id) {
        this.name = name;
        this.id = id;
    }

    public String getName() {
        return name;
    }
}

加上 abstract 修飾的類,其中可以添加抽象方法,這便是它與普通類中拓展出來的功能。

比如我們添加一個抽象方法

//其他代碼
public abstract void play();

我們大概理解了抽象類,那麼我們下邊對它做一個用法總結

用法總結 ↓(建議在讀一下開頭的我的理解加深印象)

  1. 抽象類不能被實例化,構造方法用於子類在調用時用於初始化父類。(想實例化直接給你報紅線)
  2. 抽象類中不一定含有抽象方法,但是含有抽象方法一定是抽象類。
  3. 抽象類的子類要麼實現所有抽象方法,要麼子類繼續被標記爲抽象類。
  4. 抽象類中構造方法和靜態方法不能被聲明爲抽象(可以用抽象類名直接調用靜態方法)。

2. 聊完了抽象類我們來說說接口

我們來看張圖吧,這樣更好理解
在這裏插入圖片描述

在JDK1.8加入靜態方法,這種用法也比較常見,比如我們用過Collection接口調用它的靜態方法size()。(Collection/Collections是一對常見的接口和實用工具類) 參考自《Java核心技術 卷I》

2.1 容我聊聊default修飾的默認方法吧

  • 若對已有的接口增加default方法,因爲default方法可以不被子類實現類實現,所以這樣就避免出現“接口新增一個方法,對實現類都要進行修改”的情況,因爲在代碼量很大的情況下也很麻煩。

2.1.2 但是這樣也出現了默認方法衝突的問題(《Java核心技術 卷I》

  1. 容我來描述一下第一個問題,如果一個接口提供了一個默認方法,另一個接口也提供了一個同名且參數類型相同的默認方法,現在有一個類同時實現了這兩個接口,那麼在實現類中必須覆蓋這個方法來解決這個衝突,因爲它不會自己選擇一個方法執行。
  2. 我再來描述第二個問題,一個接口提供了一個默認方法,另一個是一個父類中的同名同參數類型默認方法,一個類同時繼承了父類又實現了接口,那麼會根據父類優先原則,接口中的默認方法會被忽略,直接採用父類中的默認方法。

3. 下面我們來聊它們的不同

必須說出來第1點

  1. 每個類只能繼承一個抽象類,強調的是“IS-A”關係,也就是從屬關係;而每個類可以實現多個接口,更強調的則是具有接口的功能。
  2. 抽象類中,可以又構造器,用來完成抽象類的初始化;接口中沒有構造器
  3. 抽象類中可以有普通方法,抽象方法,靜態方法,四種權限修飾符都可以用;接口中只有抽象方法,靜態方法和默認方法(default),權限都是public(在JDK1.8)
  4. 抽象類中可以有成員變量(但是沒什麼用)和靜態變量;接口中的變量都是常量,默認有 public static final 修飾
    在這裏插入圖片描述
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章