【Java SE】抽象類/方法、模板設計模式

目錄

1.抽象類/方法

1.1 基本介紹

1.2 語法格式

1.3 使用細節

2. 模板設計模式(抽象類使用場景)

2.1 基本介紹

2.2 具體例子


1.抽象類/方法

1.1 基本介紹

①?當父類的某些方法,需要聲明,但是又不確定如何實現時,可以將其聲明為抽象方法

②?類中只要存在一個抽象方法,則該類必須為抽象類

?抽象類的價值更多作用在于設計,具體來說:設計者設計好后,讓子類繼承并實現父類的抽象方法

public class Test {public static void main(String[] args) {Dog dog = new Dog();dog.eat();}
}//抽象類
abstract class Animal{//抽象方法,只知道吃的動作,但不知道具體的動物吃什么東西public abstract void eat();
}class Dog extends Animal{public void eat(){System.out.println("狗吃骨頭");}
}

1.2 語法格式

  • 抽象類:被 abstract 修飾的類,一般會被繼承,由其子類來實現抽象的方法

[修飾符] abstract class 類名{}
  • 抽象方法:被 abstract 修飾而且沒有方法體的方法,也叫做沒有實現的方法

[修飾符] abstract 返回值類型 方法名([形參列表]);//不需要方法體{}

1.3 使用細節

①?abstract 只能修飾類和方法,不能用來修飾屬性和其他的

?使用 abstract?修飾類,只是表示該類為抽象類,類內部的屬性和方法不會自動具有 abstract?修飾符

?抽象類不能創建對象實例

?抽象類的本質還是類,可以有類的各種成員。比如:非抽象方法、構造器、非靜態方法/屬性、靜態方法/屬性等等,都可以繼承給子類

public class Test {public static void main(String[] args) {Dog dog = new Dog();System.out.println(Dog.num);System.out.println(dog.name);dog.eat();}
}//抽象類
abstract class Animal{public static int num = 1;public String name = "小馬";public abstract void eat();//抽象方法
}class Dog extends Animal{//實現父類的抽象方法public void eat(){System.out.println("狗吃骨頭");}
}
/*輸出結果
1
小馬
狗吃骨頭*/

⑤?如果一個類繼承了抽象類,則它必須實現抽象類的所有抽象方法,除非它自己也聲明為 abstract類,否則編譯不通過

?⑥?抽象方法不能使用 private、final、static 來修飾,因為這些關鍵字都是和重寫相違背的

????????private:如果父類的抽象方法用 private 修飾,那其子類沒有訪問權限,無法實現抽象方法

????????final:如果父類的抽象方法用 final 修飾,則該方法不能重寫,其子類無法實現抽象方法

? ? ? ? static:static 修飾的方法可以 "直接類.方法名" 調用,而 abstract 修飾的方法沒有方法體,因此兩者是相悖的【這樣理解不知道對不對】

2. 模板設計模式(抽象類使用場景)

2.1 基本介紹

抽象類體現的就是一種模板模式的設計,抽象類作為多個子類的通用模板,子類在抽象類的基礎上進行擴展、改造,但子類總體上會保留抽象類的行為方式

解決的問題

?當功能內部一部分實現是確定的,另一部分實現是不確定的,這時可以把不確定的部分暴露出去,讓子類去實現

?換句話說,在軟件開發中實現一個算法時,整體步驟很固定、通用,這些步驟已經在父類中寫好了。但是某些部分易變,則易變部分可以抽象出來,供不同子類實現。這就是一種模板模式

看上面的文字可能會覺得很抽象,可以結合具體的例子理解一下

2.2 具體例子

需求:計算不同類各自任務的執行時間

未使用模板設計模式之前

public class demo {public static void main(String[] args) {new JobA().job();new JobB().job();}
}class JobA{public void job(){int result = 0;long startTime = System.currentTimeMillis();//開始時間for(int i=0;i<100000;i++){result += i;}long endTime = System.currentTimeMillis();//結束時間long duration = endTime - startTime;System.out.println("任務執行時間: " + duration + "毫秒");}
}class JobB{public void job(){int result = 1;long startTime = System.currentTimeMillis();//開始時間for(int i=0;i<8000;i++){result *= i;}long endTime = System.currentTimeMillis();//結束時間long duration = endTime - startTime;System.out.println("任務執行時間: " + duration + "毫秒");}
}

缺點:代碼冗余,復用性差,可以看到代碼整體的步驟是很固定的,如下:

①? 記錄任務開始時間

②? 執行任務

③? 記錄任務結束時間

④? 打印任務執行時間

其中,① ③ ④?是固定不變的,變的只有?②?,這就有了改進的空間

引入模板設計模式

優點:利用抽象類+動態綁定機制使得模板類中的 job() 可以動態調用執行方法,代碼復用性高 ?

public class demo {public static void main(String[] args) {new JobA().calculateJobTime();new JobB().calculateJobTime();}
}//模板類
abstract class Template{public abstract void job();//抽象方法//計算任務執行時間public void calculateJobTime(){long startTime = System.currentTimeMillis();//開始時間job();//動態綁定機制long endTime = System.currentTimeMillis();//結束時間long duration = endTime - startTime;System.out.println("任務執行時間: " + duration + "毫秒");}
}class JobA extends Template{//重寫抽象方法public void job(){int result = 0;for(int i=0;i<100000;i++){result += i;}}
}class JobB extends Template{//重寫抽象方法public void job(){int result = 1;for(int i=0;i<8000;i++){result *= i;}}
}

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

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

相關文章

【人工智能】LM Studio 的 GPU 加速:釋放大模型推理潛能的極致優化

《Python OpenCV從菜鳥到高手》帶你進入圖像處理與計算機視覺的大門! 解鎖Python編程的無限可能:《奇妙的Python》帶你漫游代碼世界 隨著大語言模型(LLM)的廣泛應用,其推理效率成為限制性能的關鍵瓶頸。LM Studio 作為一個輕量級機器學習框架,通過 GPU 加速顯著提升了大…

深度學習:從零開始的DeepSeek-R1-Distill有監督微調訓練實戰(SFT)

原文鏈接&#xff1a;從零開始的DeepSeek微調訓練實戰&#xff08;SFT&#xff09; 微調參考示例&#xff1a;由unsloth官方提供https://colab.research.google.com/github/unslothai/notebooks/blob/main/nb/Qwen2.5_(7B)-Alpaca.ipynbhttps://colab.research.google.com/git…

流暢如絲:利用requestAnimationFrame優化你的Web動畫體驗

requestAnimationFrame 是前端開發中用于優化動畫性能的 API。它允許瀏覽器在下一次重繪之前執行指定的回調函數&#xff0c;通常用于實現平滑的動畫效果。 1.作用 優化性能&#xff1a;requestAnimationFrame 會根據瀏覽器的刷新率&#xff08;通常是 60Hz&#xff0c;即每秒…

【pytest框架源碼分析五】pytest插件的注冊流程

前文介紹到pytest整體是運用插件來實現其運行流程的。這里仔細介紹下具體過程。 首先進入main方法 def main(args: list[str] | os.PathLike[str] | None None,plugins: Sequence[str | _PluggyPlugin] | None None, ) -> int | ExitCode:"""Perform an i…

IoTDB日志提示Too many open files

問題 時序數據庫 IoTDB 1.3.3 版本 IoTDB 執行查詢操作失敗&#xff0c;日志打印提示 Too many open files。通過命令查看打開文件數&#xff0c;結果如下&#xff1a; [root0002 DataReceiver]# lsof|grep 28347|wc -l DataNode 55444 [root0002 DataReceiver]# lsof|g…

prometheus 添加alertmanager添加dingtalk機器人告警

1、dingtalk創建機器人,目前我們采用加白名單的方式校驗 2、定位到如下圖 test結果如下

C 語 言 --- 操 作 符 2

C 語 言 --- 操 作 符 2 移 位 操 作 符定 義原 碼 補 碼 和 反 碼左 移&#xff08;<<&#xff09;右 移&#xff08;>>&#xff09;算 術 右 移邏 輯 右 移 按 位 與、按 位 或、和 按 位 異 或按 位 與按 位 或按 位 異 或 邏 輯 反 操 作負 值 操 作按 位 取 反…

基于Spring Boot的公司資產網站的設計與實現(LW+源碼+講解)

專注于大學生項目實戰開發,講解,畢業答疑輔導&#xff0c;歡迎高校老師/同行前輩交流合作?。 技術范圍&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬蟲、數據可視化、安卓app、大數據、物聯網、機器學習等設計與開發。 主要內容&#xff1a;…

零碳工廠能源管理系統的核心技術與應用實踐

零碳工廠能源管理系統是一種高效的解決方案&#xff0c;旨在優化能源使用并減少碳排放&#xff0c;以幫助工廠實現低碳或零碳的生產目標。以下是該系統的詳細構成和功能&#xff1a; 1. 核心組件 傳感器和監測設備&#xff1a;用于實時監測工廠內的能源使用情況&#xff0c;包…

美攝接入DeepSeek等大模型,用多模態融合重構視頻創作新邊界!

今年以來&#xff0c;DeepSeek憑借其強大的深度推理分析能力&#xff0c;在AI領域掀起新的熱潮。美攝科技快速響應市場需求&#xff0c;迅速接入以DeepSeek、通義千問、商湯、文心一言為代表的大模型&#xff0c;為企業視頻創作生產帶來全新體驗。 傳統視頻創作面臨著同質化、…

JAVA————十五萬字匯總

JAVA語言概述 JAVA語句結構 JAVA面向對象程序設計&#xff08;一&#xff09; JAVA面向對象程序設計&#xff08;二&#xff09; JAVA面向對象程序設計&#xff08;三&#xff09;工具類的實現 JAVA面向對象程序設計&#xff08;四&#xff09;錄入異常處理 JAVA圖形用戶界面設…

力扣熱題100(方便自己復習,自用)

力扣熱題100 1. 兩數之和 - 力扣&#xff08;LeetCode&#xff09; 查找兩數之和是不是等于target也就是我們找到一個數之后&#xff0c;用target將其減掉&#xff0c;再尋找應當對應的元素是什么每找到一個數&#xff0c;我們就將其放在集合中&#xff0c;因為集合中可以去重…

【yolo】yolo訓練報錯,以及解決方案

背景&#xff1a; 剛剛&#xff0c;寫了《【yolo】yolo推理報錯&#xff0c;以及解決方案》&#xff0c;馬上訓練就遇到類似的報錯。 我對我標注的圖像進行了300輪的訓練&#xff0c;但是訓練完300輪后&#xff0c;報錯了。。。 報錯信息 300 epochs completed in 0.085 hou…

vscode/cursor中python運行路徑設置 模塊導入問題

vscode/cursor中python運行路徑設置 ## 文件路徑設置 問題描述 pycharm的項目用cursor運行&#xff0c;出現目錄找不到 后來利用 os.getcwd()&#xff0c;經過打印調試發現是IDE的本身配置問題 pycharm中&#xff0c;os.getcwd()默認打開當前腳本所在目錄 vscode/cursor中…

理解線性動力學中的模態疊加法

線性動力學中的模態疊加方法 模態疊加法是線性動力學中一種有價值的工具&#xff0c;可以有效地確定頻域或時域中的系統響應。對于某些類型的線性動力學分析&#xff0c;有必要使用此方法&#xff0c;因此了解該過程對于獲得準確的結果至關重要。在本博客中&#xff0c;我們將…

報錯 - redis - Unit redis.service could not be found.

報錯&#xff1a; Unit redis.service could not be found.Could not connect to Redis at 127.0.0.1:6379: Connection refused解決方法&#xff1a; 檢查狀態、有必要的話 重新安裝 Linux 上查看狀態 systemctl status redis顯示以下內容&#xff0c;代表正常服務 出現下面…

CMS網站模板定制設計與安全評估

內容概要 現代CMS&#xff08;內容管理系統&#xff09;作為網站建設的核心載體&#xff0c;其模板架構與安全防護體系的協同設計已成為企業數字化轉型的關鍵環節。隨著網絡攻擊向量日益復雜化&#xff0c;基于HTTPS協議的端到端加密部署不僅成為基礎安全配置&#xff0c;更直…

【React】useEffect、useLayoutEffect底層機制

目錄 useEffect不設置依賴設置空數組&#xff0c;無依賴設置多個依賴返回值是一個函數總結useEffect的使用環境useEffect 中發送請求錯誤示例用.then獲取數據在useEffect創建一個函數 總結 useLayoutEffectuseLayoutEffect 和useEffect區別執行時機&#xff1a;瀏覽器渲染的關系…

深度解析學術論文成果評估(Artifact Evaluation):從歷史到現狀

深度解析學術論文成果評估(Artifact Evaluation)&#xff1a;從歷史到現狀 引言 在計算機科學和工程領域的學術研究中&#xff0c;可重復性和可驗證性越來越受到重視。隨著實驗性研究的復雜性不斷增加&#xff0c;確保研究成果可以被其他研究者驗證和構建變得尤為重要。這一需…

VSCode創建VUE項目(四)增加用戶Session管理

將用戶信息存儲或者更新到Session sessionStorage.setItem("userID",loginform.value.username); sessionStorage.setItem(loginTime, Date.now()); 獲取Session信息 const storedUserInfo sessionStorage.getItem(userID); const loginTime sessionStorage.get…