面試——談談你對抽象和接口的理解(小知識大考點)


經典回答

接口和抽象是Java 面向對象設計的兩個基礎機制。

接口是對行為的抽象,它是抽象方法的集合,利用接口可以達到API 和實現分離的目的。它不包含任何非常量的變量,同時沒有方法實現。JDK1.8 后引入的default 后可以。用關鍵字implements 實現。

抽象類是不能實例化的類,用關鍵字abstract 修飾,其主要目的是代碼重用。除了不能實例化,形式上和一般的 Java 類並沒有太大區別,可以有一個或者多個抽象方法,也可以沒有抽象方法。抽象類大多用於抽取相關 Java 類的共用方法實現或者是共同成員變量,然后通過繼承的方式達到代碼復用的目的。

一個類可以單繼承多實現。

以下為網上摘取的不同點:


 

考點分析

接口和抽象的區別是面試中經常問到的考點。雖然很簡單,但是往深了想其實還是有很多值得我們在意的地方。主要是設計方面的問題。

考點一:Java 為什么是單繼承多實現?

我們都知道C++ 可以實現多繼承。但是多繼承會出現菱形繼承的問題:A 類實現了一個方法,B、C類分別繼承與A 並重寫了這個方法,D 類繼承B、C 但是不知到該調用誰的方法。雖然C++ 提供了解決辦法(好像是虛繼承),但是還是不方便。Java 因此摒棄了多繼承。

為什么可以多實現呢?首先接口不可能出現菱形繼承關系:A 接口被B、C 類實現,D 因為單繼承只能選擇一個來進行繼承。其次,就算實現的兩個接口擁有相同的方法名,在實現里面也不會出現歧義。


 

無論是A 還是B 來回調函數,都可以找到實現。只是這樣設計不太好。

考點二:接口和抽象都可以實現抽象方法,為什么還要設計兩個?

這種問題其實在很多地方都可以問到,比如多線程既然Thread 可以直接start,何必要設計一個Runnable 接口,多此一舉?

new Thread().start();
new Thread(new Runnable()).start; //偽代碼

  

其實回答這些問題無非兩個關注點:

  •  功能
  • 簡潔

接口更關注在於API 和實現分離,而繼承更關注與方法和屬性重用;同時接口更簡潔,抽象需要額外繼承很多父類的東西。

考點三: 對JDK 新特性的掌握

JDK1.8 引入default 關鍵字讓接口可以實現具體方法,之所以這樣設計的原因是延展性考慮。類似於各種集合接口,它的實現類有很多,如果這種接口想要增加新方法,比如1.8 增加stream 流的操作,意味着所以實現類必須同樣增加實現?哪也太不便於維護和更新了,估計Java 底層設計師看到這個需求可以直接申請辭職了。

拓展

對設計模式的理解

我們在設計抽象和接口的時候需要考慮設計模式,常用的設計模式也就是所謂的 S.O.L.I.D 原則。
這里后面會補充


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM