后端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 一、概述࿱…...
铭豹扩展坞 USB转网口 突然无法识别解决方法
当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…...
反向工程与模型迁移:打造未来商品详情API的可持续创新体系
在电商行业蓬勃发展的当下,商品详情API作为连接电商平台与开发者、商家及用户的关键纽带,其重要性日益凸显。传统商品详情API主要聚焦于商品基本信息(如名称、价格、库存等)的获取与展示,已难以满足市场对个性化、智能…...
为什么需要建设工程项目管理?工程项目管理有哪些亮点功能?
在建筑行业,项目管理的重要性不言而喻。随着工程规模的扩大、技术复杂度的提升,传统的管理模式已经难以满足现代工程的需求。过去,许多企业依赖手工记录、口头沟通和分散的信息管理,导致效率低下、成本失控、风险频发。例如&#…...
P3 QT项目----记事本(3.8)
3.8 记事本项目总结 项目源码 1.main.cpp #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); } 2.widget.cpp #include "widget.h" #include &q…...
python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)
更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...
【决胜公务员考试】求职OMG——见面课测验1
2025最新版!!!6.8截至答题,大家注意呀! 博主码字不易点个关注吧,祝期末顺利~~ 1.单选题(2分) 下列说法错误的是:( B ) A.选调生属于公务员系统 B.公务员属于事业编 C.选调生有基层锻炼的要求 D…...
【论文阅读28】-CNN-BiLSTM-Attention-(2024)
本文把滑坡位移序列拆开、筛优质因子,再用 CNN-BiLSTM-Attention 来动态预测每个子序列,最后重构出总位移,预测效果超越传统模型。 文章目录 1 引言2 方法2.1 位移时间序列加性模型2.2 变分模态分解 (VMD) 具体步骤2.3.1 样本熵(S…...
OPenCV CUDA模块图像处理-----对图像执行 均值漂移滤波(Mean Shift Filtering)函数meanShiftFiltering()
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 在 GPU 上对图像执行 均值漂移滤波(Mean Shift Filtering),用于图像分割或平滑处理。 该函数将输入图像中的…...
比较数据迁移后MySQL数据库和OceanBase数据仓库中的表
设计一个MySQL数据库和OceanBase数据仓库的表数据比较的详细程序流程,两张表是相同的结构,都有整型主键id字段,需要每次从数据库分批取得2000条数据,用于比较,比较操作的同时可以再取2000条数据,等上一次比较完成之后,开始比较,直到比较完所有的数据。比较操作需要比较…...
作为测试我们应该关注redis哪些方面
1、功能测试 数据结构操作:验证字符串、列表、哈希、集合和有序的基本操作是否正确 持久化:测试aof和aof持久化机制,确保数据在开启后正确恢复。 事务:检查事务的原子性和回滚机制。 发布订阅:确保消息正确传递。 2、性…...
