摘要:很多常見的面試題都會出諸如抽象類和接口有什么區別,什么情況下會使用抽象類和什么情況你會使用接口這樣的問題。在討論它們之間的不同點之前,我們先看看抽象類接口各自的特性。抽象類抽象類是用來捕捉子類的通用特性的。
很多常見的面試題都會出諸如抽象類和接口有什么區別,什么情況下會使用抽象類和什么情況你會使用接口這樣的問題。本文我們將仔細討論這些話題。
在討論它們之間的不同點之前,我們先看看抽象類、接口各自的特性。
抽象類
抽象類是用來捕捉子類的通用特性的 。它不能被實例化,只能被用作子類的超類。抽象類是被用來創建繼承層級里子類的模板。以JDK中的GenericServlet為例:
public abstract class GenericServlet implements Servlet, ServletConfig, Serializable { // abstract method abstract void service(ServletRequest req, ServletResponse res); void init() { // Its implementation } // other method related to Servlet }
當HttpServlet類繼承GenericServlet時,它提供了service方法的實現:
public class HttpServlet extends GenericServlet { void service(ServletRequest req, ServletResponse res) { // implementation } protected void doGet(HttpServletRequest req, HttpServletResponse resp) { // Implementation } protected void doPost(HttpServletRequest req, HttpServletResponse resp) { // Implementation } // some other methods related to HttpServlet }
接口
接口是抽象方法的集合。如果一個類實現了某個接口,那么它就繼承了這個接口的抽象方法。這就像契約模式,如果實現了這個接口,那么就必須確保使用這些方法。接口只是一種形式,接口自身不能做任何事情。以Externalizable接口為例:
public interface Externalizable extends Serializable { void writeExternal(ObjectOutput out) throws IOException; void readExternal(ObjectInput in) throws IOException, ClassNotFoundException; }
當你實現這個接口時,你就需要實現上面的兩個方法:
public class Employee implements Externalizable { int employeeId; String employeeName; @Override public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException { employeeId = in.readInt(); employeeName = (String) in.readObject(); } @Override public void writeExternal(ObjectOutput out) throws IOException { out.writeInt(employeeId); out.writeObject(employeeName); } }
抽象類和接口的對比
參數 | 抽象類 | 接口 |
---|---|---|
默認的方法實現 | 它可以有默認的方法實現 | 接口完全是抽象的。它根本不存在方法的實現 |
實現 | 子類使用extends關鍵字來繼承抽象類。如果子類不是抽象類的話,它需要提供抽象類中所有聲明的方法的實現。 | 子類使用關鍵字implements來實現接口。它需要提供接口中所有聲明的方法的實現 |
構造器 | 抽象類可以有構造器。 | 接口不能有構造器 |
與正常Java類的區別 | 除了你不能實例化抽象類之外,它和普通Java類沒有任何區別 | 接口是完全不同的類型 |
訪問修飾符 | 抽象方法可以有public、protected和default這些修飾符 接口方法默認修飾符是public。 | 你不可以使用其它修飾符。 |
main方法 | 抽象方法可以有main方法并且我們可以運行它 | 接口沒有main方法,因此我們不能運行它。 |
多繼承 | 抽象方法可以繼承一個類和實現多個接口 | 接口只可以繼承一個或多個其它接口 |
速度 | 它比接口速度要快 | 接口是稍微有點慢的,因為它需要時間去尋找在類中實現的方法。 |
添加新方法 | 如果你往抽象類中添加新的方法,你可以給它提供默認的實現。因此你不需要改變你現在的代碼。 | 如果你往接口中添加方法,那么你必須改變實現該接口的類。 |
什么時候使用抽象類和接口
如果你擁有一些方法并且想讓它們中的一些有默認實現,那么使用抽象類吧。
如果你想實現多重繼承,那么你必須使用接口。由于Java不支持多繼承,子類不能夠繼承多個類,但可以實現多個接口。因此你就可以使用接口來解決它。
如果基本功能在不斷改變,那么就需要使用抽象類。如果不斷改變基本功能并且使用接口,那么就需要改變所有實現了該接口的類。
Java8中的默認方法和靜態方法
Oracle已經開始嘗試向接口中引入默認方法和靜態方法,以此來減少抽象類和接口之間的差異。現在,我們可以為接口提供默認實現的方法了并且不用強制子類來實現它。這類內容我將在下篇博客進行闡述。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/76423.html
摘要:在抽象類中,聲明的是,可是。抽象類只能作為子類的超類,子類繼承抽象類時必須被實現。它根本不存在方法的實現實現子類使用關鍵字來繼承抽象類。添加新方法如果你往抽象類中添加新的方法,你可以給它提供默認的實現。轉自,抽象類與接口的區別 抽象類與接口 抽象類與接口一樣,都不能被實例化,可以有具體實現的方法,也可以有抽象的方法。在抽象類中,聲明的field是static、final,method可...
摘要:前言是面對對象的語言,因此有必要單獨紀錄下對象的各種定義和理解。面對對象基本概述概述是基于面向過程的變成思想,是對面向過程的一種封裝。面對對象開發就是不斷的創建對象,使用對象,指揮對象做事情。面對對象設計其實就是在管理和維護對象之間的關系。 前言 java是面對對象的語言,因此有必要單獨紀錄下對象的各種定義和理解。 面對對象,主要包括:面向對象思想,類與對象及其使用,對象的內存圖,成...
摘要:案例演示抽象類的成員特點抽象類的成員方法特性抽象方法強制要求子類做的事情。抽象類中定義的是該繼承體系的共性功能。 1.多態的概述及其成員訪問特點代碼體現 A:多態(polymorphic)概述 事物存在的多種形態 B:多態前提- 1.要有繼承關系 2.要有方法重寫 3.要有父類引用指向子類對象。 C:多態中的成員訪問特點之 成員變量:編譯和運行都看父類。 成員方法:編...
摘要:多態多態概述同一個對象,在不同時刻表現出來的不同形態舉例貓我們可以說貓是貓貓貓我們也可以說貓是動物動物貓這里貓在不同的時刻表現出來了不同的形態,這就是多態多態的前提和體現有繼承實現關系有方法重寫有父類引用指向子類對象多態中成員訪 1 多態1.1 多態概述同一個對象,在不同時刻表現出來的不同形態舉例: 貓我們可以...
閱讀 2252·2021-11-22 09:34
閱讀 2021·2021-09-22 15:22
閱讀 2021·2019-08-29 15:05
閱讀 2110·2019-08-26 10:43
閱讀 3411·2019-08-26 10:26
閱讀 886·2019-08-23 18:29
閱讀 3522·2019-08-23 16:42
閱讀 2001·2019-08-23 14:46