【JAVA】抽象類與接口:設計模式中的應用對比(16)

核心知識點詳細解釋

Java抽象類和接口的定義、特點和使用場景

抽象類

抽象類是使用 abstract 關鍵字修飾的類。它不能被實例化,主要用于作為其他類的基類,提供一些通用的屬性和方法。抽象類可以包含抽象方法和具體方法。抽象方法是使用 abstract 關鍵字修飾的方法,它只有方法聲明,沒有方法體,子類必須實現這些抽象方法。例如:

abstract class Shape {protected String color;public Shape(String color) {this.color = color;}public String getColor() {return color;}public abstract double area();
}

在這個例子中,Shape 是一個抽象類,包含一個具體方法 getColor 和一個抽象方法 area

接口

接口是一種完全抽象的類型,使用 interface 關鍵字定義。接口中只能包含常量和抽象方法,不能包含具體方法(Java 8 及以后版本支持默認方法和靜態方法)。接口中的方法默認是 public abstract 的,常量默認是 public static final 的。例如:

interface Drawable {void draw();
}

在這個例子中,Drawable 是一個接口,包含一個抽象方法 draw

抽象類和接口在設計模式中的應用對比

策略模式

策略模式是一種行為設計模式,它定義了一系列的算法,并將每個算法封裝起來,使它們可以相互替換。抽象類和接口都可以用于實現策略模式。

  • 使用抽象類實現
abstract class Strategy {public abstract void execute();
}class ConcreteStrategyA extends Strategy {@Overridepublic void execute() {System.out.println("Executing strategy A");}
}class ConcreteStrategyB extends Strategy {@Overridepublic void execute() {System.out.println("Executing strategy B");}
}class Context {private Strategy strategy;public Context(Strategy strategy) {this.strategy = strategy;}public void executeStrategy() {strategy.execute();}
}
  • 使用接口實現
interface Strategy {void execute();
}class ConcreteStrategyA implements Strategy {@Overridepublic void execute() {System.out.println("Executing strategy A");}
}class ConcreteStrategyB implements Strategy {@Overridepublic void execute() {System.out.println("Executing strategy B");}
}class Context {private Strategy strategy;public Context(Strategy strategy) {this.strategy = strategy;}public void executeStrategy() {strategy.execute();}
}

在策略模式中,使用抽象類和接口的區別不大,主要取決于具體的需求。如果需要提供一些通用的實現和屬性,使用抽象類更合適;如果只需要定義行為規范,使用接口更合適。

工廠模式

工廠模式是一種創建型設計模式,它提供了一種創建對象的方式,將對象的創建和使用分離。抽象類和接口都可以用于實現工廠模式。

  • 使用抽象類實現
abstract class Product {public abstract void use();
}class ConcreteProductA extends Product {@Overridepublic void use() {System.out.println("Using product A");}
}class ConcreteProductB extends Product {@Overridepublic void use() {System.out.println("Using product B");}
}abstract class Factory {public abstract Product createProduct();
}class ConcreteFactoryA extends Factory {@Overridepublic Product createProduct() {return new ConcreteProductA();}
}class ConcreteFactoryB extends Factory {@Overridepublic Product createProduct() {return new ConcreteProductB();}
}
  • 使用接口實現
interface Product {void use();
}class ConcreteProductA implements Product {@Overridepublic void use() {System.out.println("Using product A");}
}class ConcreteProductB implements Product {@Overridepublic void use() {System.out.println("Using product B");}
}interface Factory {Product createProduct();
}class ConcreteFactoryA implements Factory {@Overridepublic Product createProduct() {return new ConcreteProductA();}
}class ConcreteFactoryB implements Factory {@Overridepublic Product createProduct() {return new ConcreteProductB();}
}

在工廠模式中,使用抽象類和接口的選擇也取決于具體需求。如果需要提供一些通用的創建邏輯,使用抽象類更合適;如果只需要定義創建對象的規范,使用接口更合適。

根據具體需求選擇抽象類或接口

  • 需要提供通用實現:如果需要提供一些通用的屬性和方法實現,使用抽象類。抽象類可以包含具體方法,子類可以繼承這些方法,避免重復實現。
  • 只需要定義行為規范:如果只需要定義一組行為規范,不關心具體實現,使用接口。接口可以讓一個類實現多個接口,實現多重繼承的效果。
  • 單繼承限制:由于 Java 是單繼承的,一個類只能繼承一個抽象類。如果一個類已經繼承了某個類,但還需要實現其他行為規范,使用接口。

實際業務場景中的應用案例

圖形繪制系統

在一個圖形繪制系統中,可以使用抽象類 Shape 來定義圖形的通用屬性和方法,如顏色、面積計算等。然后使用接口 Drawable 來定義圖形的繪制行為。不同的圖形類可以繼承 Shape 類并實現 Drawable 接口。例如:

abstract class Shape {protected String color;public Shape(String color) {this.color = color;}public String getColor() {return color;}public abstract double area();
}interface Drawable {void draw();
}class Circle extends Shape implements Drawable {private double radius;public Circle(String color, double radius) {super(color);this.radius = radius;}@Overridepublic double area() {return Math.PI * radius * radius;}@Overridepublic void draw() {System.out.println("Drawing a circle with color " + getColor());}
}

電商系統中的折扣策略

在電商系統中,可以使用接口來定義折扣策略。不同的折扣策略類實現該接口,提供不同的折扣計算方法。例如:

interface DiscountStrategy {double calculateDiscount(double price);
}class PercentageDiscount implements DiscountStrategy {private double percentage;public PercentageDiscount(double percentage) {this.percentage = percentage;}@Overridepublic double calculateDiscount(double price) {return price * percentage / 100;}
}class FixedAmountDiscount implements DiscountStrategy {private double amount;public FixedAmountDiscount(double amount) {this.amount = amount;}@Overridepublic double calculateDiscount(double price) {return amount;}
}

常見面試問題與解答思路

問題 1:抽象類和接口的區別是什么?

解答思路:抽象類可以包含具體方法和抽象方法,而接口在 Java 8 之前只能包含抽象方法(Java 8 及以后支持默認方法和靜態方法);抽象類使用 abstract 關鍵字定義,接口使用 interface 關鍵字定義;一個類只能繼承一個抽象類,但可以實現多個接口;抽象類可以有構造方法,接口沒有構造方法。

問題 2:在什么情況下應該使用抽象類,什么情況下應該使用接口?

解答思路:如果需要提供通用的實現和屬性,使用抽象類;如果只需要定義行為規范,使用接口;如果一個類已經繼承了某個類,但還需要實現其他行為規范,使用接口。

問題 3:如何在 Java 中實現多重繼承的效果?

解答思路:由于 Java 是單繼承的,一個類只能繼承一個父類。但可以通過實現多個接口來實現多重繼承的效果。一個類可以實現多個接口,從而擁有多個接口定義的行為。

相關技術點的性能優化建議

避免過度使用抽象類和接口

雖然抽象類和接口可以提高代碼的靈活性和可維護性,但過度使用會增加代碼的復雜度。在設計時,要根據實際需求合理使用抽象類和接口。

優化接口設計

接口的設計應該遵循單一職責原則,每個接口只負責一個特定的功能。避免設計過大的接口,導致實現類需要實現很多不必要的方法。

合理使用默認方法和靜態方法

在 Java 8 及以后版本中,接口支持默認方法和靜態方法。合理使用這些方法可以減少代碼的重復,但也要注意不要濫用,以免破壞接口的純粹性。

擴展學習資源推薦

官方文檔

  • Oracle Java Documentation:提供了 Java 語言和類庫的詳細文檔。
  • The Java Tutorials:適合初學者學習 Java 的基礎知識,包括抽象類和接口的內容。

書籍

  • 《Effective Java》:介紹了 Java 編程的最佳實踐和技巧,對抽象類和接口的使用有相關建議。
  • 《Java核心技術》:詳細講解了 Java 語言的基礎知識和高級特性,包含了抽象類和接口的核心概念。

思考題

  1. 抽象類可以有靜態方法嗎?如果可以,有什么作用?
  2. 接口中的默認方法和抽象方法有什么區別?
  3. 如何在一個類中同時繼承抽象類和實現接口?

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

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

相關文章

HTML 顏色全解析:從命名規則到 RGBA/HSL 值,附透明度設置與場景應用指南

一、HTML 顏色系統詳解 HTML 中的顏色可以通過多種方式定義,包括顏色名稱、RGB 值、十六進制值、HSL 值等,同時支持透明度調整。以下是詳細分類及應用場景: 1. 顏色名稱(預定義關鍵字) HTML 預定義了 140 個標準顏色名…

LVS負載均衡群集和keepalive

目錄 一. 集群概述 1.1 集群的定義 1.2 集群的分類 1. 高可用集群 HA 2. 高性能運輸群集 HPC 3.負載均衡群集 LB 4. 分布式存儲集群 二. LVS概述 2.1 LVS的定義 2.2 LVS的工作原理 2.3 LVS 的三種工作模式 2.4 LVS 三種工作模式的對比 2.5 LVS 調度算法 1. 靜態…

ZTE 7551N 中興小鮮60 遠航60 努比亞小牛 解鎖BL 刷機包 刷root 展訊 T760 bl

ZTE 7551N 中興小鮮60 遠航60 努比亞小牛 解鎖BL 刷機包 刷root 3款機型是一個型號,包通用, ro.product.system.modelZTE 7551N ro.product.system.nameCN_P720S15 #################################### # from generate-common-build-props # Th…

單片機-STM32部分:12、I2C

飛書文檔https://x509p6c8to.feishu.cn/wiki/MsB7wLebki07eUkAZ1ec12W3nsh 一、簡介 IIC協議,又稱I2C協議,是由PHILP公司在80年代開發的兩線式串行總線,用于連接微控制器及其外圍設備,IIC屬于半雙工同步通信方式。 IIC是一種同步…

Virtualized Table 虛擬化表格 el-table-v2 表頭分組 多級表頭的簡單示例

注意添加這個屬性,會影響到有多少個層級的表頭: :header-height“[50, 40]”,即后面的columnIndex 如果有fix的列CustomizedHeader會被調用多次,如果有多個層級的表頭,也會被調用多次, 實際被調用次數是(fix數 1 * 表頭層級數量) 以下代碼均刪除了JSX TS版本代碼 <templ…

防御保護-----第十二章:VPN概述

文章目錄 第二部分&#xff0c;數據安全第十二章&#xff1a;VPN概述VPN概述VPN分類VPN關鍵技術隧道技術身份認證技術加解密技術數據認證技術 數據的安全傳輸密碼學發展史 對稱加密算法 --- 傳統密碼算法密鑰解釋流加密分組加密 --- 塊加密算法填充算法PKCS7算法分組模式 公鑰密…

前端項目打包部署流程j

1.打包前端項目(運行build這個文件) 2.打包完成后&#xff0c;控制臺如下所示:(沒有報錯即代表成功) 3.左側出現dist文件夾 4.準備好我們下載的nginx(可以到官網下載一個),然后在一個沒有中文路徑下的文件夾里面解壓。 5.在繼承終端內打開我們的項目&#xff0c;找到前面打包好…

Go語言標識符

文章目錄 標識符的組成規則Go語言關鍵字預定義標識符標識符命名慣例 特殊標識符標識符訪問權限控制 在Go語言中&#xff0c;標識符(Identifier)是用來命名變量、函數、類型、常量等程序實體的名稱。 標識符的組成規則 1、必須以字母或下劃線(_)開頭&#xff1a; 字母包括Unico…

CST軟件對OPERACST軟件聯合仿真汽車無線充電站對人體的影響

上海又收緊了新能源車的免費上牌政策。所以年前一些伙伴和我探討過買新能源汽車的問題&#xff0c;小伙伴們基本糾結的點是買插電還是純電&#xff1f;我個人是很抗拒新能源車的&#xff0c;也開過坐過。個人有幾個觀點&#xff1a; 溢價過高&#xff0c;不保值。實際并不環保…

吳恩達機器學習筆記:多變量梯度下降

1.多維特征 之前我們探討了單變量/特征的回歸模型&#xff0c;現在我們對房價模型增加更多的特征&#xff0c;例如房間數樓層等&#xff0c;構成一個含有多個變量的模型&#xff0c;模型中的特征為 &#xff08; x 1 &#xff0c; x 2 &#xff0c; x 3... x n &#xff09; &…

【Linux Nano Vim快捷鍵大全】

Nano 快捷鍵大全 常用高頻操作 功能描述快捷鍵組合替代按鍵/備注使用頻率顯示幫助CtrlGF1高保存文件CtrlOF3高退出編輯器CtrlXF2高剪切當前行CtrlKF9高粘貼內容CtrlUF10高搜索文本CtrlWF6高替換文本Ctrl\AltR高撤銷操作AltU無中重做操作AltE無中跳轉到行號Ctrl_AltG中插入文件…

uniapp vue 沉浸式窗體如何獲取并排除外部手機瀏覽器底部菜單欄工具欄高度

這個問題可以簡稱為&#xff1a;uniapp vue 獲取可視窗口高度 第一種方案&#xff0c;只改變css樣式 /* 不考慮瀏覽器UI的最小視口高度 */ .element {height: 100svh; /* small viewport height */ }/* 考慮瀏覽器UI變化的動態視口高度 */ .element {height: 100dvh; /* dyna…

React Native告別圖標體積大手動更換慢的噩夢:讓圖標更新像修改文字一樣簡單

寫在前面:凌晨三點的圖標戰爭 “所有圖標都要換成圓角風格,明天上線!”——產品經理這條消息彈出時,我的保溫杯差點從手中滑落。掃了一眼項目中的347個圖標文件,我知道今晚又是個不眠夜。但就在絕望之際,同事發來一個GIF:他只是在終端輸入了iconfont-rn --update,所有…

自然語言處理與BI融合實戰:ChatBI動態語義解析技術架構剖析

在數字經濟時代&#xff0c;數據已成為企業核心競爭力的關鍵要素。如何高效挖掘數據價值、實現智能化決策&#xff0c;成為企業數字化轉型的核心命題。傳統商業智能&#xff08;BI&#xff09;工具雖具備強大的數據處理能力&#xff0c;但其技術門檻高、交互方式復雜等局限性日…

鴻蒙OSUniApp開發支持多語言的國際化組件#三方框架 #Uniapp

使用UniApp開發支持多語言的國際化組件 在全球化的今天&#xff0c;一個優秀的應用往往需要支持多種語言以滿足不同地區用戶的需求。本文將詳細講解如何在UniApp框架中實現一套完整的國際化解決方案&#xff0c;從而輕松實現多語言切換功能。 前言 去年接手了一個面向國際市場…

SpringBoot的外部化配置

一、什么是外部化配置 外部化配置是指把應用程序中各種可配置的參數、屬性等信息&#xff0c;從代碼內部提取出來&#xff0c;放置在外部的配置文件、數據庫或配置中心等地方&#xff08;比如使用.properties、.yml 或.xml 等格式的文件&#xff09;進行管理。提高應用程序的可…

SQL中聯表的運用

當出現要大量數據去查詢時&#xff0c;不要一個個去SQL查詢&#xff0c;應該要批量的去查詢。 def batch_cavity_query(self, fuseids): “”“批量查詢cavity信息”“” if not fuseids: return {} # 創建臨時表批量查詢 try:# 創建臨時表self.cursor.execute("CREATE …

React面試常問問題詳解

以下是30個React面試中常見的問題及簡要解析&#xff0c;涵蓋基礎概念、核心原理、性能優化、Hooks、狀態管理等方面&#xff0c;適用于初中高級開發者準備面試時參考&#xff1a; 一、React 基礎與核心概念 React 是什么&#xff1f; React 是由 Facebook 開發的用于構建用戶界…

【vite好用的配置】自動導入組件、vue中的hook、路徑解析、打包配置、本地運行反向代理配置

前言 之前出了一篇自己搭建 后臺管理系統的文章&#xff0c;今天順便把vite配置&#xff0c;涉及到的一些給大家分享吧。 按需食用哈。 文章目錄 前言一、 自動導入vue中的hook、ref等1. 安裝插件2. 配置 Vite&#xff08;vite.config.ts 或 vite.config.js&#xff09;1&…

思科(Cisco ASA/Firepower)、華三(H3C)、華為(Huawei USG)防火墻 的基礎配置

以下是針對 思科&#xff08;Cisco ASA/Firepower&#xff09;、華三&#xff08;H3C&#xff09;、華為&#xff08;Huawei USG&#xff09;防火墻 的基礎配置指南&#xff0c;涵蓋 區域劃分、安全策略、NAT、路由 等核心功能。配置示例基于通用場景&#xff0c;實際部署時需根…