前言
新的一年開始了,學習的心態要有一個新的開始,所以複習整理一下JavaSE的知識點(其實差不多是預習了,參照網上大佬的博客搬運了示例代碼QAQ),寫的比較簡陋見笑了。
正文
首先分別概括一下什麼是接口和抽象類。
接口:簡單說就是一系列抽象方法的集合,如果一個類實現(implements)了某個接口,即繼承了這個接口的所有抽象方法,則該類必須實現這些抽象方法。
DEMO
//接口Externalizable
public interface Externalizable extends Serializable {
void writeExternal(ObjectOutput out) throws IOException;
void readExternal(ObjectInput in) throws IOException, ClassNotFoundException;
}
//實現Externalizable接口的Employee類
public class Employee implements Externalizable {
int employeeId;
String employeeName;br/> @Override
public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
employeeId = in.readInt();
employeeName = (String) in.readObject();br/> }
@Override
public void writeExternal(ObjectOutput out) throws IOException {
out.writeInt(employeeId);
out.writeObject(employeeName);
}
}
抽象類:首先,與接口不同的是,抽象類不能直接創建實例對象,抽象類中的抽象方法只能在其子類中實現(即通過extends的方式而不是implements),因此可以把抽象類看作是提供給繼承的子類的一個模板。抽象類本身沒有任何用處,它是爲了繼承而存在的,創建一個抽象類而不去繼承它等於是做了無用功。
DEMO
//實現...接口的抽象類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
}
//繼承GenericServlet抽象類的HttpServlet子類
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
}
兩者對比
參數
接口
抽象類
構造方法
不能有
可以有
方法
只能有抽象方法
可以包含普通方法
繼承
一個類可實現多個接口
只能繼承一個抽象類
成員變量
只能是public static final類型
可以是各種類型
接口和抽象類分別適用於何種場合?這裏搬運網上某大佬博客裏的一個例子。
門和警報的例子:門都有open( )和close( )兩個動作,此時我們可以定義通過抽象類和接口來定義這個抽象概念:
//抽象類
abstract class Door {
public abstract void open();
public abstract void close();
}
//接口
interface Door {
public abstract void open();
public abstract void close();
}
現在需要部分門具有報警alarm( )的功能,該如何實現?
1、將三個功能都放在抽象類中,但是有的門並不具備報警的功能 ×
2、將三個功能都放在接口中,有些類需要實現報警的功能但是並不具備open和close的功能(如火災報警器)×
3、從1和2中可以看出,open和close是門的固有屬性,而alarm則是特殊的附加屬性,因此最好的解決辦法是單獨將報警設計爲一個接口,包含alarm()行爲,Door設計爲單獨的一個抽象類,包含open和close兩種行爲。再設計一個報警門繼承Door類和實現Alarm接口。√
interface Alram {
void alarm();
}
abstract class Door {
void open();
void close();
}
class AlarmDoor extends Door implements Alarm {
void oepn() {
//....
}
void close() {
//....
}
void alarm() {
//....
}
}
文章來自:https://www.itjmd.com/news/show-5389.html