【后端】java 抽象類和接口的介紹和區別

文章目錄

      • 一、抽象類(Abstract Class)
      • 二、接口(Interface)
      • 三、核心區別總結
      • 四、使用場景對比
      • 五、從設計思想理解
      • 最佳實踐

在Java中,抽象類(Abstract Class)和接口(Interface)都是實現抽象和多態的核心機制,但它們在設計目的和使用場景上有顯著區別。以下是詳細解釋及對比:


一、抽象類(Abstract Class)

  1. 定義

    • 使用 abstract 關鍵字修飾,不能實例化(只能被繼承)。
    • 可以包含普通方法、抽象方法、成員變量、構造方法等。
    • 抽象方法使用 abstract 聲明,無方法體(需子類實現)。
  2. 核心特點

    public abstract class Animal {private String name; // 成員變量public Animal(String name) { this.name = name; // 構造方法}public abstract void eat(); // 抽象方法public void sleep() { // 普通方法System.out.println(name + " is sleeping.");}
    }
    
  3. 關鍵用途

    • 代碼復用:通過繼承共享基類的屬性和方法(如 sleep() 方法)。
    • 強制約束:要求子類必須實現抽象方法(如 eat())。
    • 模板模式:定義算法框架,子類填充細節。
  4. 繼承規則

    • 單繼承限制:一個子類只能繼承一個抽象類。

二、接口(Interface)

  1. 定義

    • Java 8 前:只能包含抽象方法常量public static final)。
    • Java 8+:支持 default 方法、static 方法、private 方法。
    • Java 9+:支持 private static 方法。
  2. 核心特點

    public interface Flyable {int MAX_HEIGHT = 10000; // 常量(默認為 public static final)void fly(); // 抽象方法(默認為 public abstract)// Java 8+ 默認方法(有實現)default void glide() {System.out.println("Gliding...");}// Java 8+ 靜態方法static boolean isFlyable(Object obj) {return obj instanceof Flyable;}
    }
    
  3. 關鍵用途

    • 行為契約:定義對象能做什么(如 Flyable 表示“可飛行”)。
    • 解耦設計:實現類只需關注方法邏輯,不綁定繼承關系。
    • 多繼承支持:一個類可實現多個接口(解決單繼承局限)。
  4. 實現規則

    • 類使用 implements 實現接口(可同時實現多個)。

三、核心區別總結

特性抽象類接口
方法實現可包含普通方法和抽象方法Java 8 前只能有抽象方法;之后支持默認/靜態方法
成員變量可以是普通變量只能是常量(public static final
構造方法有構造方法(供子類調用)無構造方法
繼承/實現單繼承(子類 extends 一個抽象類)多繼承(類 implements 多個接口)
設計目的代碼復用 + 擴展約束(is-a 關系)行為抽象(has-a/can-do 能力)
訪問修飾符抽象方法可為 protected方法默認為 public(不可修改)
靜態/私有方法支持Java 8+ 支持靜態/默認方法;9+ 支持私有方法

四、使用場景對比

  • 用抽象類當
    多個子類有共享邏輯或狀態(如動物基類的 name 屬性和 sleep() 方法)。

  • 用接口當
    需定義跨類別的行為(如 FlyableRunnable),或需要多繼承時。

實際應用

  • InputStream 是抽象類(提供通用讀取方法,子類如 FileInputStream)。
  • List 是接口(ArrayListLinkedList 提供不同實現)。

五、從設計思想理解

  • 抽象類:描述對象的本質(“是什么”),如 Bird extends Animal
  • 接口:描述對象的能力(“能做什么”),如 Bird implements Flyable

最佳實踐

優先使用接口(靈活解耦),當需要復用代碼或共享狀態時再使用抽象類。
常見組合:接口定義行為,抽象類提供部分實現(如 AbstractList 實現 List 接口)。

通過理解二者差異,可以更精準地選擇工具,構建高擴展性的代碼結構。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/917882.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/917882.shtml
英文地址,請注明出處:http://en.pswp.cn/news/917882.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Apache OFBiz Scrum 組件命令注入漏洞

【嚴重】Apache OFBiz Scrum 組件命令注入漏洞 漏洞描述 Apache OFBiz 是一款知名的開源企業資源規劃(ERP)解決方案,它提供了一整套開箱即用的企業級應用。Scrum 是 OFBiz 的一個插件,旨在為敏捷開發團隊提供項目管理功能,其中包括與 SVN 版…

FastAPI入門:多個文件、后臺任務、元數據和文檔 URL

更大的應用 - 多個文件 假設文件結構如下:. ├── app # 「app」是一個 Python 包 │ ├── __init__.py # 這個文件使「app」成為一個 Python 包 │ ├── main.py # 「main」模塊,例如 import app.main │ ├…

一個示例mcp agent功能的交互式框架

https://github.com/whym3/Deepseek_MCPDeepseek_MCP https://github.com/whym3/Deepseek_MCP Deepseek_MCP是一個演示mcp agent的框架,基于Flask開發,支持在瀏覽器采用交互方式與deepseek及agent對話。需要注冊外部Deepseek api,不支持本地…

nodejs 基礎知識-2

模塊的暴露和導入 編寫date.js module.exports.echo 導出的名稱 module.exports.echo function echo(){ return Date.now(); } 編寫 index.js const echoDate require(‘./date.js’) 在index引入 console.log(echoDate.echo()); //調用 開發一個自定義模塊 exports.forma…

遞歸推理樹(RR-Tree)系統:構建認知推理的骨架結構

探索基于三維評估的動態推理系統如何實現智能決策與知識演化引言 在復雜問題求解領域(如戰略決策或科學探索),人類思維的遞歸本質為AI系統設計提供了重要啟發。我設計并實現的遞歸推理樹(Recursive Reasoning Tree, RR-Tree&#…

《動手學深度學習》讀書筆記—9.5機器翻譯與數據集

本文記錄了自己在閱讀《動手學深度學習》時的一些思考,僅用來作為作者本人的學習筆記,不存在商業用途。 語言模型是自然語言處理的關鍵, 而機器翻譯是語言模型最成功的基準測試。 因為機器翻譯正是將輸入序列轉換成輸出序列的 序列轉換模型&a…

Mysql進行操作時鎖的具體行為

場景一:單個事務更新一條存在的數據 假設有表 user (id PK, name, age),數據:[id1, nameAlice, age25] 你的 SQL: UPDATE user SET age 26 WHERE id 1; 底層動作: 事務 A (主動方) 發起更新請求。Lock Manager 介入&…

人工智能領域、圖歐科技、IMYAI智能助手2025年7月更新月報

IMYAI 平臺 2025 年 7 月重要功能更新與優化匯總 2025年07月31日更新 細節優化: 修復了移動端提交后自動彈出側邊欄的BUG。優化對話高級配置界面,增加滾動條并固定高度,避免內容超出屏幕。音樂生成界面的人聲選擇新增“合唱”選項&#xff…

HTTP 與 HTTPS 的區別深度解析:從原理到實踐

HTTP 和 HTTPS 是現代 Web 開發中不可或缺的協議,它們決定了瀏覽器與服務器之間數據傳輸的方式。HTTPS 作為 HTTP 的安全版本,在安全性、性能和用戶體驗上都有顯著提升。本文將通過萬字篇幅,結合圖表和代碼示例,詳細剖析 HTTP 與 …

STM32F407VET6學習筆記11:smallmodbus_(多從機)創建新的slave從機

今日記錄一些smallmodbus 創建新的slave 從機 的過程,以及使用的關鍵點. 目錄 創建新的從機對應操作函數與buffer 創建新的從機線程與操作代碼: slave使用的要點: 完整的slave代碼: 能正常通信: 創建新的從機對應操作函…

【論文閱讀】Transformer Feed-Forward Layers Are Key-Value Memories

Transformer Feed-Forward Layers Are Key-Value Memories 原文摘要 研究背景與問題: 前饋層占Transformer模型參數總量的2/3,但其功能機制尚未得到充分研究 核心發現:提出前饋層實質上是鍵值存儲系統 鍵:這里的鍵與訓練數據中出…

昇思+昇騰開發板:DeepSeek-R1-Distill-Qwen-1.5B 模型推理部署與 JIT 優化實踐

目錄 引言 模型推理部署 環境準備 安裝 MindSpore 查看當前 mindspore 版本 安裝 MindNLP 模型與分詞器加載 導入必要的庫 加載分詞器 加載模型 對話功能實現 設置系統提示詞 構建對話歷史輸入 推理函數實現 交互界面實現 推理JIT優化 基礎環境安裝 JIT 優化配置…

用phpstudy安裝php8.2后報錯:意思是找不到php_redis.dll拓展時

1.地址:https://pecl.php.net/package/redis/6.2.0/windows 2.下載3.解壓后復制php_redis.dll到phpstudy_pro\Extensions\php\php8.2.9nts\ext目錄 4.打開php.ini,加上 extension_dir “D:\software\phpstudy_pro\Extensions\php\php8.2.9nts\ext”

開源列式分布式數據庫clickhouse

這里寫自定義目錄標題開源列式OLAP數據庫clickhouseclickhouse使用 ClickHouse 的場景如何理解行式存儲和列式存儲clickhouse-go開源列式OLAP數據庫clickhouse OLAP (分析型):專為快速掃描、聚合、分析海量數據設計。OLTP (事務型):專為處理大量短事務&…

Java Stream API 詳解(Java 8+)

1. Stream 操作分類Stream 操作分為兩類:中間操作(Intermediate Operations)返回新的 Stream,可以鏈式調用(如 filter, map, sorted, distinct)。惰性求值:只有遇到終止操作時才會執行。終止操作…

「源力覺醒 創作者計劃」_文心大模型4.5系列開源模型, 從一行代碼到一個生態:聊聊開源戰略那些事兒,順便扯扯文心大模型 4.5 的使用心得

前言:哈嘍,大家好,今天給大家分享一篇文章!并提供具體代碼幫助大家深入理解,徹底掌握!創作不易,如果能幫助到大家或者給大家一些靈感和啟發,歡迎收藏關注哦 💕 目錄從一行…

算法專題(二)回文鏈表

1、源代碼class Solution {public boolean isPalindrome(ListNode head) {ListNode fasthead,slowhead; //快慢指針都在頭結點//快指針走2步,慢指針走一步。//雙數快指針最后是null,單數快指針下一位是nullwhile(fast!null && fast.next!null){f…

2025《艾諾提亞失落之歌》逆向工程解包嘗試

前言 想開發一下光明之魂,看能不能解包《艾諾提亞失落之歌》的模型。 之前寫了(https://blog.csdn.net/weixin_42875245/article/details/148616547?spm1001.2014.3001.5501) 沿用這個思路進行逆向工程解包。 文章目錄請添加圖片描述前言…

JVM 03 類加載機制

JVM 將字節碼二進制流加載到內存稱為類加載。 什么時候加載類 new 實例化對象。而對象所屬類還沒被加載。讀取/設置類的靜態非常量字段,常量字段在常量池。調用類的靜態方法。類初始化,優先初始化父類。虛擬機啟動時,先加載用戶指定的主類。 …

STM32H7+FreeRTOS+LwIP移植EtherCAT開源主站SOEM

代碼下載什么的就不多說了,直接看需要移植修改的代碼。 1、osal.c修改 /******************************************************************************* * *** **** *** *** …