解释 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.mzph.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;我们需要理解题目中的条件。每架…