Java中抽象類和介面的區別

来源:https://www.cnblogs.com/codemcr/archive/2023/07/25/17578999.html
-Advertisement-
Play Games

### 一.抽象類 定義上來看,被abstract關鍵字修飾的類稱為抽象類。被abstract關鍵字修飾的方法稱為抽象方法。當父類的某些方法,需要聲明,但是又不確定如何實現時,可以將其聲明為抽象方法,那麼這個類就是抽象類.例: ``` [public|protected] abstract clas ...


一.抽象類

定義上來看,被abstract關鍵字修飾的類稱為抽象類。被abstract關鍵字修飾的方法稱為抽象方法。當父類的某些方法,需要聲明,但是又不確定如何實現時,可以將其聲明為抽象方法,那麼這個類就是抽象類.例:

[public|protected] abstract class T {
    String name;
    int age;
    abstract public void test();
}
特征:
  1. 抽象類不可以實例化,可以被繼承,可以看作是對類的進一步抽象,可以繼承普通類或者抽象類
  2. 抽象類是它的所有子類的公共屬性的集合,可包含多個抽象方法,也可以沒有抽象方法
  3. 抽象類多用於設計,讓子類繼承並實現抽象類,用來創建繼承層級裡子類的模板
  4. 抽象類可以包含屬性、方法、構造方法,但是構造方法不能用於實例化
  5. 子類繼承抽象類,必須實現抽象類的所有抽象方法,或者將子類設置成抽象類
  6. 只要包含一個抽象方法的類必須要定義成抽象類
  7. 抽象類中的抽象方法只有方法的聲明,只是起到一個限制的作用,並沒有提供實際的方法體,這也要求子類去實現自己的方法體
  8. abstract關鍵字只能修飾類和方法
  9. 抽象方法不可以用private、static、final來修飾,與重寫相違背

二.介面

定義上來看,介面使用interface關鍵字修飾。介面就是給出一些無法實現的方法,封裝在一起,到某個類要使用的時候,根據情況重新寫出來。如果一個類實現了某個介面,那麼它就繼承了這個介面的抽象方法。例:

interface IAI{
    String name="Jack";
    int age=12;
     default void iac(){
        System.out.println(1);
    };
     static void iab(){
         System.out.println(2);
     }
}
class TA implements IAI{
    public static void main(String[] args) {
        IAI iai=new TA();    
        iai.iac();         //1
        IAI.iab();         //2
    }
}
特征:
  1. 介面不可以實例化
  2. 介面中所有的方法都是public方法,介面的抽象方法可以不用abstract修飾
  3. 實現介面的子類必須實現所有的抽象方法,除非是抽象類
  4. 介面可以被介面繼承,或者被其他類實現
  5. 一個類可以實現多個介面,子類通過implements關鍵字來實現
  6. 介面中的屬性必須是final的,而且隱含的是public static final修飾符,必須顯示的初始化
  7. 介面屬性的訪問形式:介面名.屬性名,介面的static修飾的方法訪問形式:介面名.方法名
  8. 介面方法必須用static或者default修飾詞修飾

三.區別

相同:
  1. 都不能被實例化
  2. 介面的實現類或抽象類的子類都只有實現了介面或抽象類中的方法後才能實例化
  3. 抽象類和介面都是用來抽象具體對象的,要面向介面(抽象)編程,而不要面向具體編程。雖然都進行了不同程度的抽象,但是介面的抽象級別最高
不同:
  1. 抽象類是對類抽象,而介面是對行為的抽象。抽象類是對整個類整體進行抽象,包括屬性、行為,但是介面卻是對類局部(行為)進行抽象
  2. 抽象類是自底向上抽象而來的,介面是自頂向下設計出來的
  3. 抽象類要被子類繼承,而介面是用來被子類實現的
  4. 介面只能做方法聲明,不能有方法的實現,抽象類中不僅可以作方法聲明,也可以做方法實現
  5. 實現介面的關鍵字為implements,繼承抽象類的關鍵字為extends。一個類可以實現多個介面,但一個類只能繼承一個抽象類。對於java的單繼承的一種補充
  6. 抽象類有構造器,介面沒有構造器,只能重寫方法

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

-Advertisement-
Play Games
更多相關文章
  • 本專題寫作的目的其實是分享go語言編程的使用場景,介紹go語言編程的方方面面,讓大家能夠用好這個由google公司發明的強力工具,提升大家在這方面的生產力,畢竟**”君子善假與物也“**嘛。 這裡我先說明一下,我並不是一個對go語言的所有一切都認同的人,你會發現很多相關從業者也會吐槽go語言的“專制 ...
  • # **反射相關使用和暴破** ## **通過反射創建對象** 1. **方式一:**調用類中的public修飾的無參構造器; 2. **方式二:**調用類中的指定構造器; 3. **Class類相關方法:** - newInstance():調用類中的無參構造器,獲取對應類的對象; - getCo ...
  • 原文在[這裡](https://grpc.io/docs/languages/go/basics/)。 本教程為Go程式員提供了使用gRPC的基本介紹。 通過跟隨本示例,你將學會如何: - 在.proto文件中定義一個服務。 - 使用協議緩衝編譯器生成伺服器和客戶端代碼。 - 使用Go gRPC A ...
  • # 反射獲取類的結構信息 1. **關於Class的API** 1. getName:獲取全類名 2. getSimpleName:獲取簡單類名 3. getFields:獲取所有Public修飾的屬性,包含本類及其父類(不僅僅是直接父類) 4. getDeclaredFields:獲取本類中的所有 ...
  • 【不定期更新】本文主要介紹了Java學習前期的一些概念問題,包括“面向對象和麵向過程的區別”、“C++和Java的不同之處”等等,適合初學者學習。 ...
  • ![file](https://img2023.cnblogs.com/other/488581/202307/488581-20230725174651506-356208797.jpg) > > 這篇文章全面探討了Python作為數據科學領域首選語言的原因。從Python的歷史、特性,到在數據科 ...
  • # 類載入 ## **基本說明** 反射機制是Java實現動態語言的關鍵,也就是通過反射實現類動態載入。 1. **靜態載入:**編譯時載入相關的類,如果沒有則報錯,依賴性太強。 2. **動態載入:**運行時載入相關的類,如果運行時不用該類,即使不存在該類,也不會報錯,降低了依賴性。 - **代碼 ...
  • ## 前言 首先java語言的特性是不需像C和C++那樣自己手動釋放記憶體,因為java本身有垃圾回收機制(垃圾回收稱為GC),**顧名思義就是釋放垃圾占用的空間,防止記憶體泄露。JVM運行時占用記憶體最大的空間就是堆記憶體,另外棧區和方法區也會占用空間但是占用有限本章就不探究了。那麼堆中的空間又分為年輕代 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...