Java接口與抽象類定義及用法

Java接口與抽象類定義及用法
前言

  新的一年開始了,學習的心態要有一個新的開始,所以複習整理一下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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章