java面對對象入門(8)-介面vs抽象類區別

来源:https://www.cnblogs.com/qingmiaokeji/archive/2020/03/08/12445221.html
-Advertisement-
Play Games

1.Java中的抽象類 用最簡單的話來說, 一個抽象類就是使用keyword聲明為abstract的 。它可能包含也可能不包含任何抽象方法。JVM將抽象類標識為 不完整類 , 該類 尚未定義其完整行為。聲明一個類 僅強制執行一件事:您不能創建此類的實例,僅此而已。那麼,為什麼還要費心創建一個根本無法 ...


1.Java中的抽象類

用最簡單的話來說,一個抽象類就是使用keyword聲明為abstract的abstract。它可能包含也可能不包含任何抽象方法。JVM將抽象類標識為不完整類該類尚未定義其完整行為。聲明一個類abstract僅強制執行一件事:您不能創建此類的實例,僅此而已。
那麼,為什麼還要費心創建一個根本無法實例化的類呢?答案在於解決某些關鍵設計問題的方法。我們將在本文後面介紹這一部分。

1.1抽象類的語法

abstract class TestAbstractClass
{
    public abstract void abstractMethod();
    public void normalMethod()
    {
        //method body
    }
}

在這裡,我們TestAbstractClass有兩種方法,一種是抽象方法,第二種是普通方法。抽象方法。在類中使用抽象方法將迫使您將類聲明為抽象本身。

1.2抽象方法

一個抽象方法,是未取代實施的方法。抽象方法給類增加了不完整性,因此編譯器希望將整個類聲明為抽象。
在應用程式中使用抽象類的唯一方法是擴展此類。如果不abstract再次聲明其子類,則可以實例化。子類繼承了超類的行為,並且超類可以保留對子類的引用的功能在很多方面增加了抽象類的重要性。

2.Java介面

介面是大多數Java API的另一個基本構建塊。您將其命名為collection,I / O或SWT,您可以在任何地方看到它們的運行情況。

介面定義合同,實現類需要遵守這些合同。

這些合同本質上是未實現的方法。Java已經有一個未實現方法的關鍵字,即_abstract_。Java規定任何類都可以實現任何介面,因此在介面中聲明的所有方法僅需是公共的。

2.1 介面語法

public interface TestInterface
{
    void implementMe();
}

對於上述介面,任何實現類都需要重寫implementMe()方法。

2.2抽象類實現介面

當實現一個介面並且不重寫該方法即聲明實現類本身時,只有一種情況abstract
抽象類

public abstract class TestMain implements TestInterface
{
    //No need to override implement Me
}

否則,您必須implementMe()在您的類中實現該方法,而沒有任何其他例外。
非抽象類

public class TestMain implements TestInterface
{
    @Override
    public void implementMe() {
        // TODO Auto-generated method stub
    }
}

3.抽象類與介面

讓我們記下抽象類和介面之間的差異以便快速查看:

  1. 介面具有固有的所有公共方法和_抽象_方法。您不能通過嘗試減少方法的可訪問性來覆蓋此行為。您甚至不能聲明靜態方法。僅公開和抽象。另一方面,抽象類可以靈活地聲明方法。您還可以定義受保護的可訪問性的抽象方法。此外,還可以定義靜態方法,只要它們不是抽象的即可。允許使用非抽象靜態方法。
  2. 介面不能具有完全定義的方法。根據定義,介面旨在提供唯一的合同。抽象類可以具有非抽象方法,沒有任何限制。您可以將任何關鍵字與非抽象方法一起使用,就像在其他任何類中一樣。
  3. 任何要使用抽象類的類都可以使用關鍵字擴展抽象類extends,而為了實現介面關鍵字是implements。一個類只能擴展一個類,但可以實現任何數量的介面。在Java中,此屬性通常稱為多重繼承的模擬。
  4. 介面是絕對的abstract,不能實例化;Java抽象類也無法實例化,但是如果存在main()則可以調用它。

接下來,如果我們既有抽象方法又有主類,可能會有一個問題,我們可以嘗試從中調用抽象方法main()。但是這種嘗試將失敗,因為main()方法始終是靜態的,而抽象方法永遠不會是靜態的,因此您永遠無法訪問靜態方法內部的任何非靜態方法。

4.何時使用抽象類以及何時使用介面

始終記住,在介面或抽象類之間進行選擇既不是/也不是方案,在這種情況下,選擇未經適當分析的任何人都會產生相同的結果。瞭解當前問題後,必須非常明智地做出選擇。讓我們嘗試在這裡添加一些智慧。

4.1抽象類的部分行為

抽象類使您可以定義一些行為。它使它們成為應用程式框架內的優秀候選人。
讓我們以HttpServlet為例。如果要使用Servlets技術開發Web應用程式,則必須繼承該類。眾所周知,每個servlet都有明確的生命周期階段,即初始化,服務和破壞。如果我們創建了每個servlet,我們必須一次又一次地編寫關於初始化和銷毀的同一段代碼。當然,這將是一個很大的痛苦。
JDK設計人員通過製作HttpServlet抽象類來解決此問題。它具有為初始化Servlet和銷毀Servlet而編寫的所有基本代碼。您只需要重寫某些方法即可在其中編寫與應用程式處理相關的代碼。有道理吧!
可以使用界面添加上述功能嗎?不,即使可以,對於大多數無辜的程式員來說,設計也將是一個地獄。

4.2僅合約介面

現在,讓我們看一下介面的用法。介面僅提供合同,實現類的責任是實現提供給它的每個合同
如果只想定義class的特征,並且要強制所有實現實體實現這些特征,那麼介面是最合適的。

4.3demo

我想以Map集合框架中的介面為例。它僅提供規則,以及map在實踐中應如何表現。例如,它應存儲鍵值對,應使用鍵等訪問該值。這些規則在介面中採用抽象方法的形式。
所有實現類(例如HashMap,HashTable,TreeMap或WeakHashMap)均以不同方式實現所有方法,因此與其他方法相比具有不同的功能。
同樣,介面可用於定義職責分離。例如,HashMap實現3個介面:MapSerializableCloneable。每個介面定義了各自的職責,因此實現類選擇要實現的對象,因此將提供有限的功能。

5.介面中的Java 8預設方法

使用Java 8,您現在可以在介面中定義方法。這些稱為預設方法。預設方法使您可以向庫的介面添加新功能,並確保與為這些介面的較早版本編寫的代碼二進位相容。
顧名思義,Java 8中的預設方法就是預設的。如果不重寫它們,則它們是調用方類將調用的方法。
預設方法

public interface Moveable {
    default void move(){
        System.out.println("I am moving");
    }
}

在上面的示例中,Moveable介面定義了一種方法,move()並且還提供了預設實現。如果有任何類實現此介面,則無需實現它自己的move()方法版本。它可以直接調用instance.move()

public class Animal implements Moveable{
    public static void main(String[] args){
        Animal tiger = new Animal();
        tiger.move();       //I am moving
    }
}

並且,如果類願意定製行為,那麼它可以提供自己的定製實現並重寫該方法。現在將調用它自己的自定義方法。

public class Animal implements Moveable{
      
    public void move(){
        System.out.println("I am running");
    }
      
    public static void main(String[] args){
        Animal tiger = new Animal();
        tiger.move();       //I am running
    }

5.1Java 8中抽象類和介面之間的區別

如果您看到了,我們現在也可以提供帶有介面的部分實現,就像抽象類一樣。因此,從本質上說,介面與抽象類之間的界限變得非常狹窄。它們現在提供幾乎相同的功能。
現在,只有一個很大的不同,即您不能擴展多個類,而可以實現多個介面。除了這種差異之外,您還可以通過介面實現任何可能的功能,這些介面可以使抽象類成為可能,反之亦然。
希望您在Java中找到有關介面和抽象類的足夠信息。
學習愉快!
更多精彩請關註公眾號【lovepythoncn】


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 緣由 這個起因是昨晚群里有人在討論怎麼把字元串轉成 方法最佳,討論到最後變成哪種方法效率最優了。畢竟這代碼是要在MCU上面跑的,要同時考慮到時間和空間的最優解。 當然討論的是有結果的,具體實現的方法和代碼在下麵展示。 char數組轉16進位HEX串 例子: 將如下的量 轉成 這樣的結果 這個其實很簡 ...
  • 只要有一輪沒有發生交換,說明數據的順序已經排好,沒有必要繼續進行迴圈下去了。 public static void main(String[] args) { int[] arr = {1,3,5,7,9,2,4,6,8,0}; sort(arr); } public static void sor ...
  • 1,什麼是字元串? 所謂字元串本質上就是以'\0作為'結尾的特殊字元數組; 2,定義字元串的過程中有哪些註意點 由於字元串本質上其實就是以'\0作為'結尾的特殊字元數組,所以定義字元串時,必須保證字元串存儲的最後一個元素為'\0'。 當我們沒有給定字元串具體長度時,我們通過這種方式:char 字元串 ...
  • 如果元素已經在該在的位置上就不需要再交換位置了。 public static void main(String[] args) { int[] arr = {1,3,5,7,9,2,4,6,8,0}; sort(arr); } public static void sort(int[] arr){ ...
  • 本文主要介紹了JVM—GC垃圾回收器,並對其進行了總結。主要包含了Serial收集器、ParNew收集器、Parallel Scavenge收集器、Servial Old收集器、Parallel Old收集器、CMS收集器、G1收集器。 ...
  • 學習Socket時, 想實現一個讀寫分離,能夠實時接收和發送消息的socket,卻一直發送消息出去卻不能列印出來。 客戶端發送消息出去後。 客戶端卻不能列印出消息,客戶端也不能列印出消息。 一直冥思苦想,一直到不到問題所在。 直到 發現 PrintWriter將 write 方法 改為 printl ...
  • 基於SSM開發餐飲業點餐系統 開發環境: Windows操作系統開發工具: MyEclipse+Jdk+Tomcat+MySql資料庫運行效果圖 @ResponseBody @RequestMapping(value = "/checkUsername") public String checkUs ...
  • 本文主要介紹Java—System類和Runtime類的概念及使用。 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...