Java中的接口和抽象類

Java 抽象類與接口:區別、應用與選擇

在 Java 編程的世界里,抽象類和接口是兩個極為重要的概念,它們在實現代碼抽象、提高代碼復用性和可維護性方面發揮著關鍵作用。然而,很多開發者在使用時容易混淆這兩個概念。本文將深入探討 Java 中抽象類和接口的區別、各自的應用場景,幫助你在實際開發中做出更合適的選擇。

語法層面的差異

定義方式

  • 抽象類:使用 abstract 關鍵字來定義。它是一種特殊的類,既可以包含抽象方法(僅有方法聲明,沒有方法體),也能包含具體方法(有完整的方法體)。
abstract class Shape {// 抽象方法public abstract double area();// 具體方法public void display() {System.out.println("This is a shape.");}
}
  • 接口:使用 interface 關鍵字定義。在 Java 8 之前,接口中的方法全部是抽象方法;Java 8 及以后,接口中可以包含默認方法(使用 default 關鍵字)和靜態方法。
interface Drawable {// 抽象方法void draw();// 默認方法default void fillColor() {System.out.println("Filling with default color.");}// 靜態方法static void info() {System.out.println("This is a drawable object.");}
}

注:不管是抽象類還是接口,其中的抽象方法必須在實現類中實現,否則會報錯,如下圖所示:接口中定義了run抽象方法,但在實現類中并沒有實現,所以會爆紅。運行會出現下下圖的報錯。
在這里插入圖片描述
在這里插入圖片描述

繼承和實現規則

  • 抽象類:遵循 Java 的單繼承機制,即一個類只能繼承一個抽象類。這是為了避免多重繼承帶來的菱形繼承問題(多個父類有相同方法時子類調用的歧義)。
class Circle extends Shape {private double radius;public Circle(double radius) {this.radius = radius;}@Overridepublic double area() {return Math.PI * radius * radius;}
}
  • 接口:一個類可以實現多個接口,通過這種方式可以為類添加多種不同的行為。這使得 Java 可以在一定程度上模擬多重繼承的效果。
interface Resizable {void resize();
}class Rectangle implements Drawable, Resizable {@Overridepublic void draw() {System.out.println("Drawing a rectangle.");}@Overridepublic void resize() {System.out.println("Resizing the rectangle.");}
}

成員特性的不同

成員變量

  • 抽象類:抽象類可以包含各種訪問修飾符(如 privateprotectedpublic)的成員變量,包括靜態變量和實例變量。這些變量可以在類的不同方法中使用和修改。
abstract class Vehicle {private int wheels;protected String brand;public static int vehicleCount;public Vehicle(int wheels, String brand) {this.wheels = wheels;this.brand = brand;vehicleCount++;}
}
  • 接口:接口中的變量默認是 public static final 類型的常量,必須在聲明時進行初始化,并且一旦初始化后就不能再修改。這是因為接口主要用于定義行為規范,而不是存儲狀態。
interface ElectricalDevice {int POWER_VOLTAGE = 220;
}

構造函數

  • 抽象類:抽象類可以有構造函數。當子類實例化時,會先調用抽象類的構造函數來完成一些初始化操作。構造函數可以用于初始化抽象類中的成員變量。
abstract class Animal {protected String name;public Animal(String name) {this.name = name;System.out.println("Animal constructor called for " + name);}
}class Dog extends Animal {public Dog(String name) {super(name);System.out.println("Dog constructor called");}
}
  • 接口:接口沒有構造函數。因為接口不能被實例化,它只是定義了一組方法的規范,不需要進行對象的初始化操作。如果在接口中想要實現構造函數就會獲得以下報錯。
    在這里插入圖片描述

設計理念與使用場景

設計理念

  • 抽象類:抽象類更側重于對一組具有相似特征和行為的類進行抽象,它體現的是一種“is - a”的關系,即子類是抽象類的一種具體實現。例如,“水果”抽象類可以作為“蘋果”“香蕉”等具體水果類的基類,因為蘋果和香蕉都是水果。
  • 接口:接口強調的是一種行為契約,體現的是“can - do”的關系,即一個類實現了某個接口,就表示它具備了該接口所定義的行為能力。比如,“可排序”接口表示實現該接口的類的對象可以進行排序操作。

使用場景

  • 抽象類:當多個類具有共同的屬性和行為,并且這些行為中有部分是需要根據具體情況進行不同實現時,適合使用抽象類。例如,不同類型的圖形(如圓形、矩形)都有面積的屬性和計算面積的行為,但計算方法不同,此時可以使用抽象類 Shape 來定義公共屬性和抽象的 area() 方法。
  • 接口:當需要為不同的類添加相同的行為,而這些類之間沒有明顯的繼承關系時,適合使用接口。例如,“打印機”類和“掃描儀”類本身沒有繼承關系,但它們都可以實現“可連接網絡”接口,以具備網絡連接的功能。

總結

抽象類和接口在 Java 編程中各有其獨特的作用和優勢。抽象類更適合對具有相似特征和行為的類進行抽象,強調“is - a”關系;而接口則更側重于定義行為契約,強調“can - do”關系。在實際開發中,我們需要根據具體的業務需求和代碼結構來合理選擇使用抽象類或接口,以達到代碼的高復用性、可維護性和可擴展性。

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

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

相關文章

Java讀Excel:解析阿里云easyExcel導入文件的行號

文章目錄 引言I 解析阿里云easyExcel導入文件的行號聲明解析對象的基類判斷Excel解析對象類型是否包含繼承某個類 isAssignableFromJava 轉換list類型并設置下標到元素對象屬性II 封裝excel 文件讀取excel 文件讀取用法文件導入上下文III 參數校驗工具類校驗參數是否合法 (jaka…

mmap核心原理和用途及其與內存映射段的關系

mmap 是 Linux/Unix 系統中的一個關鍵系統調用,全稱是 Memory Map(內存映射)。它的核心功能是將 文件、設備或匿名內存 直接映射到進程的虛擬地址空間,從而實現高效的內存訪問和操作。以下是其核心原理和用途的詳細說明&#xff1…

數據庫概論速成期中版

文章目錄 引論數據庫用戶Casual usersNaive usersApplication programmersDatabase administrators 關系模型CAP數據庫兩種描述關系數據庫的方式簡單總結 第一范式規則第二范式規則舉個例子符合第二規則的操作不符合第二規則的操作 第三范式規則key,superkey,null values,主鍵&…

解決調用Claude 3.7接口 403 Request not allowed問題

1. 遇到問題 Python 基于 Langchain 對接 Claude 3.7 大模型接口進行問答時,由于國內不在Claude支持的國家和地區,所以一直調不通,錯誤 anthropic.PermissionDeniedError: Error code: 403 - {error: {type: forbidden, message: Request…

Vue2+Vue3學習筆記

Vue基礎介紹 下載并安裝vue.js v2 https://v2.cn.vuejs.org/https://v2.cn.vuejs.org/ v3 https://v3.cn.vuejs.org/ 會重定向到Vue.js - 漸進式 JavaScript 框架 | Vue.jsVue.js - 漸進式的 JavaScript 框架https://cn.vuejs.org/ 從v2過渡到v3 在F盤創建v2v3學習筆記 并…

2025年KBS新算法 SCI1區TOP:長穎燕麥優化算法AOO,深度解析+性能實測

目錄 1.摘要2.算法原理3.結果展示4.參考文獻5.文章&代碼獲取 1.摘要 本文提出了一種新穎的元啟發式算法——長穎燕麥優化算法(AOO),該算法靈感來自動畫燕麥在環境中的自然行為。AOO模擬了長穎燕麥的三種獨特行為:(i) 通過自然…

CentosLinux系統crontab發現執行刪除命令失效解決方法

權限或安全策略限制 ??可能場景??: ??### ??目錄權限沖突??: 你的目錄權限為 drwxr-xr-x(屬主 mssql),但 cron 任務以 root 執行。 ??風險點??:若目錄內文件屬主為 mssql 且權限為 700&…

后驗概率最大化(MAP)估計算法原理以及相具體的應用實例附C++代碼示例

1. MAP估計基本原理 MAP(Maximum A Posteriori,最大后驗概率估計)是貝葉斯推斷中的重要概念,它的目標是: 給定觀測數據,找到使得后驗概率最大的參數值。 公式化表示: [ θ MAP arg ? max ?…

16、路由守衛:設置魔法結界——React 19 React Router

一、魔法結界的本質 "路由守衛是霍格沃茨城堡的隱身斗篷,在時空裂隙中精準控制維度躍遷!" 魔法部交通司官員揮舞魔杖,React Router 的嵌套路由在空中交織成星軌矩陣。 ——基于《國際魔法聯合會》第7號時空協議,路由守…

從車道檢測項目入門open cv

從車道檢測項目入門open cv 前提聲明:非常感謝b站up主 嘉然今天吃帶變,感謝其視頻的幫助。同時希望各位大佬積積極提出寶貴的意見。😊😊😊(???)(●’?’●)╰(▽)╯ github地址:https://github.com/liz…

【行業特化篇3】制造業簡歷優化指南:技術參數與標準化流程的關鍵詞植入藝術

寫在最前 作為一個中古程序猿,我有很多自己想做的事情,比如埋頭苦干手搓一個低代碼數據庫設計平臺(目前只針對寫java的朋友),比如很喜歡幫身邊的朋友看看簡歷,講講面試技巧,畢竟工作這么多年,也做到過高管,有很多面人經歷,意見還算有用,大家基本都能拿到想要的offe…

如何在本地部署小智服務器:從源碼到全模塊運行的詳細步驟

小智聊天機器人本地后臺服務器源碼全模塊部署 作者:林甲酸 -不是小女子也不是女漢子 是大女子 更新日期:2025年4月29日 🎯 前言:為什么要寫這篇教程? 上周按照蝦哥小智服務器的教程去部署本地后臺,我用的是…

github開源項目添加開源協議,使用很簡單

直接在 GitHub 網頁上創建 進入你的 GitHub 倉庫 打開你的項目倉庫頁面(如 https://github.com/用戶名/倉庫名)。 點擊 "Add file" → "Create new file" 在倉庫主頁,點擊右上角的 "Add file" 按鈕&#xff…

8.idea創建maven項目(使用Log4j日志記錄框架+Log4j 介紹)

8.idea創建maven項目(使用Log4j日志記錄框架Log4j 介紹) 在 IntelliJ IDEA 的 Maven 項目中引入了 Log4j,并配置了日志同時輸出到控制臺和文件。 Log4j 提供了靈活的日志配置選項,可以根據項目需求調整日志級別、輸出目標和格式。 1. 創建 Maven 項目 …

【和春筍一起學C++】函數——C++的編程模塊

目錄 1. 原型句法 2. 函數分類 3. 函數參數之按值傳遞 4. 數組作為函數參數 在C中,要使用函數,必須要有這三個方面: 函數原型,函數原型描述了函數到編譯器的接口,函數原型一般放在include文件中。函數原型告訴編譯…

深挖Java基礎之:認識Java(創立空間/先導:Java認識)

今天我要介紹的是在Java中對Java的一些基本語法的認識與他們的運用,以及擬舉例子說明和運用場景,優勢和劣勢, 注:本篇文章是對Java的一些基本的,簡單的代碼塊的一些內容,后續會講解在Java中的變量類型&…

Python+Selenium+Pytest+Allure PO模式UI自動化框架

一、框架結構 allure-report:測試報告base:定位元素封裝data:數據log:日志文件page:頁面封裝文件夾report:緩存報告testcases:測試用例層utils:工具類run.py:執行文件 二…

博物館除濕控濕保衛戰:M-5J1R 電解除濕科技如何重塑文物守護的未來

在盧浮宮幽深的長廊里,達芬奇的《蒙娜麗莎》正經歷著一場看不見的戰爭——不是來自時間的侵蝕,而是空氣中無形的水分子。每一件文物都在與濕度進行著無聲的抗爭,這場抗爭關乎人類文明的延續。濕度,這個看不見的文物殺手&#xff0…

【嘉立創EDA】如何找到曲線和直線的交點,或找到弧線和直線的交點

文章路標?? :one: 文章解決問題:two: 主題內容:three: 參考方法be end..1?? 文章解決問題 操作環境:嘉立創EDA專業版 V2.2.38 本文使用嘉立創EDA,描述如何快速找到曲線和直線交點的方法,這里的曲線包括了弧線等。本文將此過程記錄,以供有需要的讀者參考。 2?? 主題…

大語言模型能否替代心理治療師的深度拓展研究:fou

大語言模型能否替代心理治療師的深度拓展研究 在科技初創企業和研究領域,大型語言模型(LLMs)用于替代心理健康服務提供者的應用備受關注。但研究人員通過對主要醫療機構治療指南的梳理回顧,并對當前 LLMs(如 gpt-4o)進行實驗評估后發現,LLMs 存在對心理疾病患者表達污名…