后端Java开发:第十二天
第十二天:封装 - 理解与应用
欢迎来到今天的学习内容!今天,我们将一起深入探讨 Java 中的 封装(Encapsulation)。封装是面向对象编程的四大基本特性之一,它的核心思想是把对象的状态(属性)和行为(方法)绑定在一起,并隐藏对象的实现细节,只暴露必要的接口给外部。这使得对象的内部状态不会被随意修改,同时保证了数据的安全性和代码的可维护性。
1. 什么是封装?
封装是一种将对象的状态和行为隐藏在对象内部的技术,外部无法直接访问对象的内部数据,只能通过 公开的接口(通常是方法)来操作数据。这种做法能够有效避免外部代码错误地修改对象的内部状态,并提供了一种更高层次的代码抽象。
封装主要包括以下几个方面:
- 属性私有化(private):将类的属性声明为私有,禁止外部直接访问。
- 提供公共的访问方法(getters 和 setters):通过方法(getters 和 setters)来访问和修改属性。
- 实现类的接口:通过公开的方法来提供给外部使用,而不直接暴露内部的实现细节。
2. 封装的好处
封装有很多好处,以下是几项关键优势:
- 数据保护:通过将数据设为私有,可以防止外部直接修改对象的属性,确保数据的安全性。
- 提高可维护性:如果需要更改属性的实现方式,只需要修改类内部的代码,而不需要修改外部的调用代码。
- 提高代码的复用性:通过提供接口方法,外部可以在不修改类的内部实现的情况下使用类的功能。
- 简化复杂性:通过封装内部实现,外部只需要关心接口的使用,而无需了解类的内部细节。
3. 如何实现封装?
在 Java 中实现封装通常通过以下步骤:
步骤 1:将类的属性设为私有(private)
私有化类的属性,避免外部直接访问或修改这些属性。
步骤 2:为每个属性提供公共的访问方法(getters 和 setters)
通过 get 和 set 方法允许外部读取和修改属性的值。get 方法用于获取属性的值,set 方法用于设置属性的值。
步骤 3:类的其他方法
提供其他功能性的方法,这些方法不直接暴露内部实现,但可以通过接口与外部交互。
代码示例:
public class Person {// 1. 将属性设为私有private String name;private int age;// 2. 提供公共的 getter 和 setter 方法public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {// 设置年龄时,可以添加验证逻辑if (age > 0) {this.age = age;} else {System.out.println("Age must be greater than 0");}}// 3. 提供其他公共方法public void introduce() {System.out.println("Hello, my name is " + name + " and I am " + age + " years old.");}public static void main(String[] args) {Person person = new Person();person.setName("Alice");person.setAge(30);person.introduce();}
}
输出:
Hello, my name is Alice and I am 30 years old.
4. 封装的实例分析
实例 1:银行账户类 - 提供存取款操作
我们用封装来设计一个银行账户类,这个类将拥有账户余额(balance)这个私有属性,并提供存款和取款的方法,同时加入一些验证逻辑,确保账户余额不能为负。
public class BankAccount {// 私有属性private double balance;// 公共的 getter 方法public double getBalance() {return balance;}// 公共的存款方法public void deposit(double amount) {if (amount > 0) {balance += amount;System.out.println("Deposited: " + amount);} else {System.out.println("Deposit amount must be greater than 0");}}// 公共的取款方法public void withdraw(double amount) {if (amount > 0 && amount <= balance) {balance -= amount;System.out.println("Withdrew: " + amount);} else {System.out.println("Insufficient balance or invalid amount");}}public static void main(String[] args) {BankAccount account = new BankAccount();account.deposit(1000);account.withdraw(500);account.withdraw(600); // 失败,余额不足System.out.println("Current Balance: " + account.getBalance());}
}
输出:
Deposited: 1000.0
Withdrew: 500.0
Insufficient balance or invalid amount
Current Balance: 500.0
实例 2:学生类 - 姓名和成绩的封装
在此示例中,封装用于保护学生的成绩数据,只允许通过 get 和 set 方法进行访问,同时加入了成绩验证的逻辑,确保成绩不超过 100 分。
public class Student {private String name;private double grade;// 设置姓名public void setName(String name) {this.name = name;}// 获取姓名public String getName() {return name;}// 设置成绩public void setGrade(double grade) {if (grade >= 0 && grade <= 100) {this.grade = grade;} else {System.out.println("Grade must be between 0 and 100.");}}// 获取成绩public double getGrade() {return grade;}// 打印学生信息public void printInfo() {System.out.println("Student: " + name + ", Grade: " + grade);}public static void main(String[] args) {Student student = new Student();student.setName("Bob");student.setGrade(85);student.printInfo();}
}
输出:
Student: Bob, Grade: 85.0
5. 常见的封装误区
误区 1:不使用 getter 和 setter 方法
有些开发者会直接将类的属性设为公共的,这样虽然方便访问,但却会暴露内部实现,破坏封装的原则。
public class WrongPerson {public String name;public int age;public static void main(String[] args) {WrongPerson person = new WrongPerson();person.name = "Alice"; // 直接修改属性person.age = 30;System.out.println("Name: " + person.name + ", Age: " + person.age);}
}
建议:将类的属性设为私有,提供 get 和 set 方法,增强数据的保护性。
误区 2:忽视封装的其他方面
封装不仅仅是将属性设为私有,还应注意:
- 封装业务逻辑:确保类的行为逻辑都封装在类内部,外部只暴露必要的接口。
- 数据验证:在
set方法中加入数据验证逻辑,确保数据的合理性。
6. 总结
通过今天的学习,我们了解了 封装(Encapsulation) 的基本概念和应用。封装是面向对象编程中的一个重要特性,它帮助我们隐藏对象的实现细节,保护数据安全,并提高代码的可维护性。通过将属性私有化,并提供公共的 get 和 set 方法,我们可以更好地控制数据的访问和修改。
封装让我们能够确保代码的安全性、可靠性和简洁性。在实际开发中,封装不仅仅是访问控制,它还包含了对数据的验证、业务逻辑的封装等多个方面。
明天我们将继续探讨面向对象编程中的另一个重要特性——继承。敬请期待!
相关文章:
后端Java开发:第十二天
第十二天:封装 - 理解与应用 欢迎来到今天的学习内容!今天,我们将一起深入探讨 Java 中的 封装(Encapsulation)。封装是面向对象编程的四大基本特性之一,它的核心思想是把对象的状态(属性&…...
记录一下Coding一直不能clone
配置 下载git客户端,进行配置 git config --list user.name姓名全称 user.emailIAM_xxxxxx.com ,这个就是你的邮箱地址 user.signingkey 注册coding平台的密码 一般不需要配置公钥私钥 下载TortoiseGit,配置这几个参数 配置凭据管理器 注意 这里用户名是…...
LLM加速方法,Adapter Tuning和Prompt Tuning的区别及原理举例
LLM加速方法 目录 LLM加速方法整体结构各分支内容Adapter Tuning和Prompt Tuning的区别及原理举例一、区别二、总结整体结构 基于模型微调、基于模型压缩、基于分布式并行处理。 各分支内容 基于模型微调: 包含Adapter Tuning、Prompt Tuning、LoRA三个子类别。这些技术主要…...
【SVN】版本发布快捷操作
摘要:因为每次发版都需要制作一份相同的文件夹,而大部分的包都不需要变更,但是文件又非常大,记录自己的操作经验。 首先在SVN Repository Browser 界面把上一次的版本复制一份,复制的时候重命名为新的版本号 右击要复…...
GitLab 创建项目、删除项目
1、创建项目 点击左上角图标,回到首页 点击 Create a project 点击 Create blank project 输入项目名称,点击Create Project 创建成功 2、删除项目 进入项目列表 点击对应项目,进入项目 进入Settings页面 拖到页面底部,展开Adva…...
STM32-笔记37-吸烟室管控系统项目
一、项目需求 1. 使用 mq-2 获取环境烟雾值,并显示在 LCD1602 上; 2. 按键修改阈值,并显示在 LCD1602 上; 3. 烟雾值超过阈值时,蜂鸣器长响,风扇打开;烟雾值小于阈值时,蜂鸣器不响…...
VisionPro软件Image Stitch拼接算法
2D图像拼接的3种情景 1.一只相机取像位置固定,或者多只相机固定位置拍图,硬拷贝拼图,采用CopyRegion工具实现 2.一只或多只相机在多个位置拍照,相机视野互相重叠,基于Patmax特征定位后,无缝 拼图ÿ…...
【从零开始入门unity游戏开发之——unity篇09】unity6基础入门——Unity游戏对象和组件的本质、Unity中的反射机制
文章目录 一、Unity游戏对象和组件的本质1、开发游戏的本质2、万物之根本——空对象2.1 什么是空对象?2.2 创建空对象 3、Unity游戏对象的本质4、 transform组件4.1 transform组件的重要性4.2 修改transform的值4.4 **Transform的作用**4.3 重置transform的值 5、总…...
【Linux】深入理解文件系统(超详细)
目录 一.磁盘 1-1 磁盘、服务器、机柜、机房 📌补充: 📌通常网络中用高低电平,磁盘中用磁化方向来表示。以下是具体说明: 📌如果有一块磁盘要进行销毁该怎么办? 1-2 磁盘存储结构 编辑…...
MoEs and Transformers 笔记
ref:https://huggingface.co/blog/zh/moe#%E7%94%A8router-z-loss%E7%A8%B3%E5%AE%9A%E6%A8%A1%E5%9E%8B%E8%AE%AD%E7%BB%83 MoEs and Transformers Transformer 类模型明确表明,增加参数数量可以提高性能,因此谷歌使用 GShard 尝试将 Transformer 模型…...
在Linux中,如何禁用root用户直接SSH登录?
在Linux中禁用root用户的直接SSH登录是为了增强系统的安全性,因为允许root用户通过SSH远程登录会增加服务器被暴力破解的风险。以下是在Linux系统中禁止root用户直接SSH登录的步骤: 编辑SSH配置文件: 打开/etc/ssh/sshd_config文件ÿ…...
用Python实现简单的任务自动化
目录 1. 自动发送邮件提醒 2. 自动备份文件 3. 自动下载网页内容 总结 在现代工作和生活中,任务自动化可以极大地提高效率和准确性。Python,作为一种功能强大且易于学习的编程语言,是实现任务自动化的理想选择。本文将通过几个简单而实用的案例,展示如何用Python实现任…...
为AI聊天工具添加一个知识系统 之26 资源存储库和资源管理器
本文要点 资源存储库 为了能完成本项目(“为AI聊天工具增加一个知识系统”,其核心能力是“语言处理” ,该能力的最大挑战 当仁不让的应该是自然语言处理)的设计,我们考虑一个问题:在自然语言处理中&#…...
Windows10环境下安装RabbitMq折腾记
最近有个老项目需要迁移到windows10环境,用的是比较老的rabbitmq安装包,如下所示。经过一番折腾,死活服务起不来,最终果断放弃老版本启用新版本。现在把折腾过程记录下: 一、安装erlang 安装完成后的目录结构ÿ…...
对快速由表及里说拜拜/如何正确运用由表及里
你是不是还:看到一男子拖走一女子就以为小情侣吵架而已(可能人贩子);看到男友对你好个几次就从此死心塌地(可能有手就行,细节装装而已)结果耽误终身;看到女同事对你微笑不排斥就以为…...
spring mvc源码学习笔记之八
本文说点儿简单的。 如果你想研究基于 XML 配置的 spring mvc 的话,可以简单扫一眼本文。 在基于 XML 配置的 spring mvc 开发中,我们主要就是通过 spring 提供的各种标签来配置。 但是,大家是不是都有个疑问,spring 到底给我们提…...
探秘5网口IIOT网关
在当今这个科技飞速发展的时代,工业领域正经历着一场深刻的变革,而工业物联网网关在其中扮演着至关重要的角色。 什么是IIOT网关 工业物联网网关,简单来说,就是连接工业现场设备与云端或者上层管理系统的关键桥梁。 而明达技术研…...
左神算法基础巩固--5
文章目录 前缀树生成前缀树查询前缀树查询字符串加入过几次查询所有加入的字符串中,有几个是以pre这个字符串作为前缀 删除前缀树中的某个字符串 贪心算法解题 前缀树 生成前缀树 要想生成一棵前缀树,需要先创建一个根节点,这个根节点有26条…...
Python的Matplotlib库应用(超详细教程)
目录 一、环境搭建 1.1 配置matplotlib库 1.2 配置seaborn库 1.3 配置Skimage库 二、二维图像 2.1 曲线(直线)可视化 2.2 曲线(虚线)可视化 2.3 直方图 2.4 阶梯图 三、三维图像 3.1 3D曲面图 3.2 3D散点图 3.3 3D散…...
负载均衡服务器要怎么配置?
目录 一、概述: 二、硬件配置: 三、操作系统配置: 四、负载均衡软件: 五、网络配置: 六、软件安装步骤: 6.1 安装 Nginx 6.2 安装 LVS 6.3 安装 HAProxy 6.4 安装 Keepalived 一、概述࿱…...
conda相比python好处
Conda 作为 Python 的环境和包管理工具,相比原生 Python 生态(如 pip 虚拟环境)有许多独特优势,尤其在多项目管理、依赖处理和跨平台兼容性等方面表现更优。以下是 Conda 的核心好处: 一、一站式环境管理:…...
AI Agent与Agentic AI:原理、应用、挑战与未来展望
文章目录 一、引言二、AI Agent与Agentic AI的兴起2.1 技术契机与生态成熟2.2 Agent的定义与特征2.3 Agent的发展历程 三、AI Agent的核心技术栈解密3.1 感知模块代码示例:使用Python和OpenCV进行图像识别 3.2 认知与决策模块代码示例:使用OpenAI GPT-3进…...
day52 ResNet18 CBAM
在深度学习的旅程中,我们不断探索如何提升模型的性能。今天,我将分享我在 ResNet18 模型中插入 CBAM(Convolutional Block Attention Module)模块,并采用分阶段微调策略的实践过程。通过这个过程,我不仅提升…...
【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器
——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的一体化测试平台,覆盖应用全生命周期测试需求,主要提供五大核心能力: 测试类型检测目标关键指标功能体验基…...
3403. 从盒子中找出字典序最大的字符串 I
3403. 从盒子中找出字典序最大的字符串 I 题目链接:3403. 从盒子中找出字典序最大的字符串 I 代码如下: class Solution { public:string answerString(string word, int numFriends) {if (numFriends 1) {return word;}string res;for (int i 0;i &…...
UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)
UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中,UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化…...
06 Deep learning神经网络编程基础 激活函数 --吴恩达
深度学习激活函数详解 一、核心作用 引入非线性:使神经网络可学习复杂模式控制输出范围:如Sigmoid将输出限制在(0,1)梯度传递:影响反向传播的稳定性二、常见类型及数学表达 Sigmoid σ ( x ) = 1 1 +...
【HTTP三个基础问题】
面试官您好!HTTP是超文本传输协议,是互联网上客户端和服务器之间传输超文本数据(比如文字、图片、音频、视频等)的核心协议,当前互联网应用最广泛的版本是HTTP1.1,它基于经典的C/S模型,也就是客…...
SQL慢可能是触发了ring buffer
简介 最近在进行 postgresql 性能排查的时候,发现 PG 在某一个时间并行执行的 SQL 变得特别慢。最后通过监控监观察到并行发起得时间 buffers_alloc 就急速上升,且低水位伴随在整个慢 SQL,一直是 buferIO 的等待事件,此时也没有其他会话的争抢。SQL 虽然不是高效 SQL ,但…...
GO协程(Goroutine)问题总结
在使用Go语言来编写代码时,遇到的一些问题总结一下 [参考文档]:https://www.topgoer.com/%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B/goroutine.html 1. main()函数默认的Goroutine 场景再现: 今天在看到这个教程的时候,在自己的电…...
