在我們面試時也會經常遇到面試官問抽象類和接口的差別是什麼,大部人肯定會說:接口中的所有方法都是抽象的,抽象類中的方法除了抽象方法還可以寫實作方法,如果你還這樣回答那你就 OUT 啦,要跟上形式。
這個問題我在面試一個 39 歲的程式員時,他居然也沒回答上來,其實了解 Java 8 的同學應該都知道,Java 8 在接口中推出了預設方法、靜态方法,打破了接口隻能寫抽象方法的傳統,如果你還不知道的可以點選閱讀我之前發的這篇文章。
既然接口都能寫實作方法了,那麼還要抽象類幹嘛呢?Java 8 中的接口和抽象類到底還有啥差別?大家是不是都有困惑?
是以,棧長這篇帶大家分析一下,不一定全,但希望對你有用。
差別1:
首先抽象類是一個“類”,而接口隻是一個“接口”,兩者的概念和應用場景不一樣,這也是抽象類和接口的主要差別。
差別2:
即使在 Java 8 中接口也能寫實作方法了,但卻不能寫構造方法,而在抽象類是可以寫構造方法的,意味着抽象類是參與類的執行個體化過程的,而接口則不是。
差別3:
抽象類可以有自己的各種成員變量,并且可以通過自己的非抽象方法進行改變,而接口中的變量預設全是 public static final 修飾的,意味着都是常量,并且不能被自己和外部修改。
差別4:
接口可以實作多繼承,而抽象類隻能單繼承。
下面我舉兩個例子:
public class HashMap<K,V> extends AbstractMap<K,V>
implements Map<K,V>, Cloneable, Serializable {
...
}
public interface Connection extends Wrapper, AutoCloseable {
...
}
類與類隻能單繼承,而類與接口、接口與接口可以多繼承。
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicmbw5iN1QzMyEjZzgTYzUmZ0IWY5EjN0Y2MhVmZjhTZ1EDZj9CX5d2bs92Yl1iclB3bsVmdlR2LcNWaw9CXt92Yu4GZjlGbh5yYjV3Lc9CX6MHc0RHaiojIsJye.png)
總結
Java 8 中的接口和抽象類的差別除了接口中可以寫實作方法之外這點變化,其他的還是保持不變的。
既然接口可以寫方法實作了,那麼抽象類的存在貌似是弱化了,因為類隻能是單繼承,耦合性不好,而接口可以多實作,可以靈活擴充,也不會增加類的耦合性。
雖然說是少用繼承,多用組合的設計理念,但繼承的場景也還是存在的,比如我們常用的模闆設計模式就是抽象類和各種模闆的子類,是以說,接口也不能完全代替抽象類的。
你認為抽象類的應用場景還有哪些呢?歡迎留言分享!
最後,Java 系列教程還會繼續更新,關注Java技術棧公衆号第一時間推送,還可以在公衆号菜單中擷取曆史 Java 教程,都是幹貨。