解釋 Java 中的封裝、繼承和多態性,并舉例說明相關概念

在Java編程的世界里,封裝、繼承和多態是面向對象編程(OOP)的三大基石,它們支撐起整個Java程序設計的骨架,讓代碼更加靈活、可擴展和易于維護。

接下來,我會用一種輕松的方式,并通過一個貼近生活的例子來展示它們是如何協同工作的。

封裝(Encapsulation)

封裝,簡單來說,就是把對象的內部狀態(屬性)和行為(方法)包裝在一起,并對外界隱藏其內部實現細節的過程。

想象一下你正在使用一臺手機,你并不需要知道手機內部的電路板是如何布局的,也不必了解操作系統是如何管理各個應用的,你只需知道按哪個按鈕可以打電話、哪個圖標能打開相機。

手機的設計者通過按鈕、屏幕和菜單等界面,將復雜的內部結構封裝了起來,讓你可以方便地使用手機的各項功能,這就是封裝的思想。

在Java中,我們使用訪問修飾符(如private、protected、public)來控制類的成員(屬性和方法)的可見性,以此實現封裝。

通常,我們會將屬性設為私有(private),并通過公共(public)的方法來操作這些屬性,這些方法被稱為getter和setter。

例子:假設我們有一個簡單的BankAccount類,封裝了賬戶余額這一敏感信息。

1public class BankAccount {
2    private double balance; // 私有屬性,封裝了賬戶余額
3
4    // Getter方法,外部可以通過這個方法獲取余額
5    public double getBalance() {
6        return balance;
7    }
8
9    // Setter方法,外部可以通過這個方法設置余額,但這里可以加入余額校驗邏輯
10    public void setBalance(double amount) {
11        if(amount >= 0) {
12            balance = amount;
13        } else {
14            System.out.println("金額不能為負數!");
15        }
16    }
17}

繼承(Inheritance)

繼承,顧名思義,就是子類繼承父類的屬性和方法。這就好比你繼承了父母的基因,你可能擁有父親的藍眼睛,母親的卷發。

在Java中,使用extends關鍵字來實現繼承,子類可以復用父類的代碼,同時還能添加或修改父類的行為,以適應更具體的場景。

繼承不僅提高了代碼的復用性,還支持了“is-a”關系的建模,比如,貓(Cat)是一種動物(Animal),就可以用繼承來表達。

例子:在上面的BankAccount基礎上,我們創建一個更具體的儲蓄賬戶(SavingsAccount),它繼承了BankAccount,并添加了一個計算利息的方法。

1public class SavingsAccount extends BankAccount {
2    private double interestRate; // 儲蓄賬戶特有的屬性:利率
3
4    public SavingsAccount(double initialBalance, double interestRate) {
5        super(); // 調用父類構造器初始化balance
6        setBalance(initialBalance); // 設置初始余額
7        this.interestRate = interestRate; // 設置利率
8    }
9
10    // 添加計算利息的方法
11    public void calculateInterest() {
12        double interest = getBalance() * interestRate;
13        System.out.println("本次獲得利息:" + interest);
14        setBalance(getBalance() + interest); // 更新余額
15    }
16}

多態(Polymorphism)

多態意味著一個接口(可以是抽象類或接口)可以有多種不同的實現方式。

在日常生活中,我們接觸到的“多態”現象比比皆是,比如,按下電視遙控器的“音量+”鍵,不論是哪個品牌的電視,都會執行增大音量的操作,但具體實現方式各不相同。

在Java中,多態主要通過方法重寫(Override)和接口實現來體現。

例子:繼續我們的銀行賬戶例子,假設我們有一個withdraw(取款)方法,在不同的賬戶類型中可能有不同的實現(如普通賬戶可能直接扣除余額,而信用賬戶可能要考慮透支額度)。

1public abstract class Account {
2    protected double balance;
3
4    public abstract void withdraw(double amount); // 抽象方法,要求子類必須實現
5}
6
7public class CheckingAccount extends Account {
8    @Override
9    public void withdraw(double amount) {
10        if(balance >= amount) {
11            balance -= amount;
12            System.out.println("取款成功,當前余額:" + balance);
13        } else {
14            System.out.println("余額不足!");
15        }
16    }
17}
18
19public class CreditAccount extends Account {
20    private double creditLimit; // 信用額度
21
22    public CreditAccount(double initialBalance, double creditLimit) {
23        super();
24        this.creditLimit = creditLimit;
25        setBalance(initialBalance);
26    }
27
28    @Override
29    public void withdraw(double amount) {
30        if((balance + creditLimit) >= amount) {
31            balance -= amount;
32            System.out.println("信用取款成功,當前余額:" + balance);
33        } else {
34            System.out.println("超過信用額度,取款失敗!");
35        }
36    }
37}

在這個例子中,Account類定義了一個抽象的withdraw方法,而CheckingAccountCreditAccount通過各自的方式實現了這個方法,這就是多態的體現。

當我們通過一個Account類型的引用指向這些子類的實例時,可以根據實際對象的類型調用到相應的實現,無需知道具體的子類類型,大大增強了代碼的靈活性和可擴展性。

封裝、繼承和多態是Java面向對象編程的三大特性,它們共同構建了面向對象設計的堅固基石。

通過封裝保護數據,通過繼承復用代碼,通過多態增強靈活性,這些原則指導我們編寫出更加清晰、靈活和易于維護的Java代碼。

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

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

相關文章

“核心期刊論文選題與寫作技巧分享”——郭順利

講師簡介: 郭順利博士,一位擁有管理學博士學位的副教授及碩士生導師,活躍在學術界,同時在多份CSSCI收錄期刊中擔任審稿專家。在近年的學術生涯中,他發表了超過50篇的核心期刊論文,并成功指導研究生在核心期…

充電寶買哪個牌子好?2024年十大口碑最好充電寶推薦

在如今快節奏的生活中,充電寶已然成為我們出行必備的物品之一。然而,面對市場上琳瑯滿目的充電寶品牌和型號,我們常常陷入選擇的困境:充電寶買哪個牌子好?2024 年,充電寶技術不斷革新,新品牌層出…

1、數據庫模型圖、er圖

關系 user和administarators是多對一的關系 user和order是一對多的關系 shipped和order是多對一的關系 order和books是多對多的關系 leavewords和order是一對一的關系 stock和books是一對多的關系 Chens 數據庫表示法——ER圖 Crows Foot數據庫表示法——數據庫模型圖 Navicat表…

python機器人編程——用pytorch實現六軸機械臂的正向和逆向數值解算,及python算法解析

目錄 一、前言二、實現原理2.1正向建模2.2張量化2.3繪制3D動畫及操作UI 三、結論四、python源碼PS.擴展閱讀ps1.六自由度機器人相關文章資源ps2.四軸機器相關文章資源ps3.移動小車相關文章資源 一、前言 前面對六軸(或多軸)機械臂進行了一些研究&#x…

hadoop分布式云筆記系統-計算機畢業設計源碼15725

摘 要 隨著信息技術的飛速發展,人們對于數據的存儲、管理和共享需求日益增長。傳統的集中式存儲系統在處理大規模數據時面臨著性能瓶頸和擴展性問題。而 Hadoop 作為一種分布式計算框架,為解決這些問題提供了有效的解決方案。 本研究旨在設計并實現一種…

c++裝飾器模式 和 多重繼承區別

在C中,裝飾器模式和多重繼承都可以用來在不修改現有對象結構的情況下增加額外的功能。但是,它們之間有一些關鍵的區別: 1.裝飾器模式通常用于向對象添加額外的職責,而不會影響其他用戶,它遵循“開放-封閉”原則。多重…

【數據結構與算法】堆排序算法原理與實現:基于堆實現的高效排序算法

💓 博客主頁:倔強的石頭的CSDN主頁 📝Gitee主頁:倔強的石頭的gitee主頁 ? 文章專欄:《數據結構與算法》 期待您的關注 ? 目錄 一、引言 堆排序的簡介 堆排序的特點 二、堆的概念 三、堆排序算法的原理 四、堆…

15kg級彈簧刀高速巡飛無人機技術詳解

彈簧刀高速巡飛無人機,作為一種先進的戰術導彈系統,融合了無人機與導彈的雙重特性,成為了現代戰爭中不可或缺的偵察與打擊利器。該無人機以其小巧的外形設計、優異的性能表現和廣泛的適用領域,受到了全球軍事領域的廣泛關注。彈簧…

【吊打面試官系列-MyBatis面試題】Mybatis 是如何進行分頁的?分頁插件的原理是什么?

大家好,我是鋒哥。今天分享關于 【Mybatis 是如何進行分頁的?分頁插件的原理是什么?】面試題,希望對大家有幫助; Mybatis 是如何進行分頁的?分頁插件的原理是什么? Mybatis 使用 RowBounds 對象…

怎么測試遠程服務器能否連通

遠程服務器連接測試的方法很多,下面簡單介紹下其中兩種方法。 ping命令 按WINR快截鍵,打開“運行”對話框,輸入cmd,回車,打開命令提示符。 輸入ping IP地址或ping 域名即可,如ping360服務器通不通&#xf…

32 lambda表達式

c11 c98例子 在c98中&#xff0c;如果想要對一個數據集合中的元素進行排序&#xff0c;可以適用std::sort方法 #include <algorithm>#include <functional>int main(){int array[] {4,1,8,5,3,7,0,9,2,6};// 默認按照小于比較&#xff0c;排出來結果是升序 std…

Django + Vue 實現圖片上傳功能的全流程配置與詳細操作指南

文章目錄 前言圖片上傳步驟1. urls 配置2. settings 配置3. models 配置4. 安裝Pillow 前言 在現代Web應用中&#xff0c;圖片上傳是一個常見且重要的功能。Django作為強大的Python Web框架&#xff0c;結合Vue.js這樣的現代前端框架&#xff0c;能夠高效地實現這一功能。本文將…

【Arduino】小飛魚通達二開實驗ESP32使用紅外尋跡傳感器 (圖文)

在智能小車項目中都會有一個功能就是自動巡線&#xff0c;今天小飛魚通達來實驗的就是這個紅外尋跡傳感器。 紅外尋跡傳感器的原理就是有一個小燈發出紅外光&#xff0c;光線照到物體后進行反射&#xff0c;有一個接收器進行接收&#xff0c;當在一定距離內會導通電路&#xf…

網安加·百家講壇 | 肖文棣:鑄盾護企——面對勒索病毒產業鏈的企業防護之道

作者簡介&#xff1a;肖文棣&#xff0c;OWASP中國廣東分會負責人、網安加社區特聘專家&#xff0c;現任某外企安全架構師&#xff0c;負責應用安全設計、管理和評審等工作。 引言 隨著信息技術的飛速發展&#xff0c;網絡安全問題愈發凸顯&#xff0c;企業面臨的網絡安全威脅…

HarmonyOS NEXT Beta 版開發者及先鋒用戶招募(第一期)報名答題題庫(持續更新中,僅供學習分享使用)

判斷題 All True. 單選題 關于容器組件Row和Column&#xff0c;下面說法錯誤的是&#xff1a; A A. justifyContent用于設置子組件在交叉軸方向上的對齊格式。 B. Row容器主軸為水平方向&#xff0c;Column容器主軸為垂直方向。 C. justifyContent用于設置子組件在主軸方向上的…

瞎談指令集和寄存器讀寫來驅動硬件

文章目錄 前言一、到底什么是指令集&#xff1f;二、為什么現代CPU需要指令集&#xff1f;三、開發完指令集究竟有什么缺點&#xff1f;四、寄存器讀寫怎么驗證&#xff1f;總結 前言 其實很早以前就想對這個話題展開來聊聊&#xff0c;但是對體系結構的理解也僅僅限于《量化體…

應急響應:應急響應流程,常見應急事件及處置思路

「作者簡介」&#xff1a;冬奧會網絡安全中國代表隊&#xff0c;CSDN Top100&#xff0c;就職奇安信多年&#xff0c;以實戰工作為基礎著作 《網絡安全自學教程》&#xff0c;適合基礎薄弱的同學系統化的學習網絡安全&#xff0c;用最短的時間掌握最核心的技術。 這一章節我們需…

交通氣象站:保障道路暢通的守護者

隨著現代社會的飛速發展&#xff0c;交通網絡日益密集&#xff0c;人們的出行越來越依賴于公路、鐵路和航空等交通方式。然而&#xff0c;多變的天氣條件常常給交通安全帶來隱患&#xff0c;如大霧、雨雪、強風等惡劣天氣不僅影響行車視線&#xff0c;還可能造成路面濕滑、結冰…

在我們實際使用中,線程池的大小配置多少合適?

線程池的大小配置是一個需要根據具體應用場景和資源情況來決定的問題。沒有一個固定的數字適用于所有情況&#xff0c;但是可以遵循一些通用的原則和方法來確定合適的線程池大小&#xff0c;我們來看一下通用原則和方法都有哪幾個維度。 通用原則和方法 1. CPU密集型任務&…

第十四屆藍橋杯省賽C++B組D題【飛機降落】題解(AC)

解題思路 這道題目要求我們判斷給定的飛機是否都能在它們的油料耗盡之前降落。為了尋找是否存在合法的降落序列&#xff0c;我們可以使用深度優先搜索&#xff08;DFS&#xff09;的方法&#xff0c;嘗試所有可能的降落順序。 首先&#xff0c;我們需要理解題目中的條件。每架…