感性上的區(qū)別 :
- 抽象類,本質(zhì)上也是類,傾向于描述一個(gè)對(duì)象。如果你想要構(gòu)造的,更像是一個(gè)物體,就用抽象類。比如抽象工廠。
- 接口,更傾向于作為 操作 的集合。比如業(yè)務(wù)接口。
理性上的區(qū)別(一部分):
- 方法,接口的方法默認(rèn)都是 public abstract,抽象類的抽象方法不能是 private 和 static,其他方法沒有限制。
- 屬性,接口中屬性默認(rèn)都是 public static final,而抽象類你就當(dāng)做普通類一樣想。
- 抽象類可以沒有抽象方法(當(dāng)做一個(gè)普通類使用),接口里必須是抽象方法。
接口的屬性為什么必須是 public static final :
- public接口就是為了給別人使用的,所以公開
- static修飾的變量,跟隨接口的初始化就存在(參考類的初始化),所以它是屬于這個(gè)接口的。如果非 static ,就必須創(chuàng)建對(duì)象的時(shí)候才能有,但是接口不能實(shí)例化。
-
final修飾的變量一旦初始化不能被修改,防止實(shí)現(xiàn)類去修改它。Java是多實(shí)現(xiàn),多個(gè)實(shí)現(xiàn)類可以修改的話,屬性的值不好控制,與其放在接口中,還不如放在具體類
中比較好。
備注:接口中屬性和方法,可以不加修飾符直接寫,但是我們通過 javap 反編譯一下就能看到
package com.xieyupeng.springboot;
public interface Test {
int i = 0;
void test1();
}

1.png
抽象類和接口類為什么都不能被實(shí)例化 :
實(shí)例化表示成為了一個(gè)具體,如果它有屬性,我們能獲?。蝗绻蟹椒?,我們能調(diào)用執(zhí)行方法體的操作,哪怕是空方法體。接口都是抽象方法,用它是不能實(shí)例化出一個(gè)屬性和方法都是具體(實(shí)現(xiàn))的對(duì)象。而抽象方法雖然可以沒有抽象方法(當(dāng)做一個(gè)普通類來使用),但是 JVM 沒有必要?jiǎng)討B(tài)判斷,來決定是否能實(shí)例化,因?yàn)槌橄箢惖某踔圆皇菫榱水?dāng)做一個(gè)普通類來使用。
備注:
在模板方法模式中,抽象類得到了一個(gè)很好的利用,可以借鑒。
1、把公共的方法具體實(shí)現(xiàn),方便子類使用;并定義為 final,防止子類修改;
2、需要子類具體實(shí)現(xiàn)的,才定義為抽象方法,這樣子類就必須實(shí)現(xiàn)了,除非子類也是抽象方法;
3、使用 鉤子方法。