Java抽象類與接口的區別
很多常見的面試題都會出諸如抽象類和接口有什麼區別,什麼情況下會使用抽象類和什麼情況你會使用接口這樣的問題。本文我們將仔細討論這些話題。
在討論它們之間的不同點之前,我們先看看抽象類、接口各自的`特性。
抽象類
抽象類是用來捕捉子類的通用特性的 。它不能被實例化,只能被用作子類的超類。抽象類是被用來創建繼承層級裏子類的模板。
以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 = Int();
employeeName = (String) Object();
}
@Override
public void writeExternal(ObjectOutput out) throws IOException {
eInt(employeeId);
eObject(employeeName);
}
}
抽象類和接口的對比
什麼時候使用抽象類和接口
如果你擁有一些方法並且想讓它們中的一些有默認實現,那麼使用抽象類吧。
如果你想實現多重繼承,那麼你必須使用接口。由於Java不支持多繼承,子類不能夠繼承多個類,但可以實現多個接口。因此你就可以使用接口來解決它。
如果基本功能在不斷改變,那麼就需要使用抽象類。如果不斷改變基本功能並且使用接口,那麼就需要改變所有實現了該接口的類。
Java8中的默認方法和靜態方法
Oracle已經開始嘗試向接口中引入默認方法和靜態方法,以此來減少抽象類和接口之間的差異。現在,我們可以為接口提供默認實現的方法了並且不用強制子類來實現它。這類內容我將在下篇博客進行闡述。
-
40個Java多線程問題總結
Java多線程是什麼Java提供的併發(同時、獨立)處理多個任務的機制。多個線程共存於同一JVM進程裏面,所以共用相同的內存空間,較之多進程,多線程之間的通信更輕量級。依我的理解,Java多線程完全就是為了提高CPU的利用率。Java的線程有4種狀態,新建(New)、運行(Runnabl...
-
Java 正則表達式
Java是一門編程語言,那麼大家知道Java正則表達式是怎樣的呢?下面一起來看看!Java正則表達式正則表達式定義了字符串的模式。正則表達式可以用來搜索、編輯或處理文本。正則表達式並不僅限於某一種語言,但是在每種語言中有細微的差別。正則表達式實例一個字符串其...
-
如何學好Java語言編程
決定好想學什麼編程語言了嗎,現在就讓我們開始學習吧。所有你需要做的就是打開一本書,然後開始閲讀,是這樣的嗎?不全是這樣的。learn-first我會給出學習第一門編程語言的理想方法佈局,你不僅應該學習這個佈局方法,還應該享受精通它——如果不能掌握的話。學習第一門...
-
計算機二級考試Java精選訓練題
下面是應屆畢業生考試網小編搜索整理的計算機二級考試Java精選訓練題,希望對大家有所幫助。[簡答題]本題中,在下畫線上填寫代碼,指定變量b為字節型,變量f為單精度實型,變量l為64位整型。publicclassjaval{publicstaticvoidmain(String[-]args){b=49;f=8.9f;l=0xfedl...