当前位置: 首页 > news >正文

后端Java开发:第十二天

第十二天:封装 - 理解与应用

欢迎来到今天的学习内容!今天,我们将一起深入探讨 Java 中的 封装(Encapsulation)。封装是面向对象编程的四大基本特性之一,它的核心思想是把对象的状态(属性)和行为(方法)绑定在一起,并隐藏对象的实现细节,只暴露必要的接口给外部。这使得对象的内部状态不会被随意修改,同时保证了数据的安全性和代码的可维护性。

1. 什么是封装?

封装是一种将对象的状态和行为隐藏在对象内部的技术,外部无法直接访问对象的内部数据,只能通过 公开的接口(通常是方法)来操作数据。这种做法能够有效避免外部代码错误地修改对象的内部状态,并提供了一种更高层次的代码抽象。

封装主要包括以下几个方面:

  • 属性私有化(private):将类的属性声明为私有,禁止外部直接访问。
  • 提供公共的访问方法(getters 和 setters):通过方法(getters 和 setters)来访问和修改属性。
  • 实现类的接口:通过公开的方法来提供给外部使用,而不直接暴露内部的实现细节。

2. 封装的好处

封装有很多好处,以下是几项关键优势:

  • 数据保护:通过将数据设为私有,可以防止外部直接修改对象的属性,确保数据的安全性。
  • 提高可维护性:如果需要更改属性的实现方式,只需要修改类内部的代码,而不需要修改外部的调用代码。
  • 提高代码的复用性:通过提供接口方法,外部可以在不修改类的内部实现的情况下使用类的功能。
  • 简化复杂性:通过封装内部实现,外部只需要关心接口的使用,而无需了解类的内部细节。

3. 如何实现封装?

在 Java 中实现封装通常通过以下步骤:

步骤 1:将类的属性设为私有(private)

私有化类的属性,避免外部直接访问或修改这些属性。

步骤 2:为每个属性提供公共的访问方法(getters 和 setters)

通过 getset 方法允许外部读取和修改属性的值。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:学生类 - 姓名和成绩的封装

在此示例中,封装用于保护学生的成绩数据,只允许通过 getset 方法进行访问,同时加入了成绩验证的逻辑,确保成绩不超过 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:不使用 gettersetter 方法

有些开发者会直接将类的属性设为公共的,这样虽然方便访问,但却会暴露内部实现,破坏封装的原则。

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);}
}

建议:将类的属性设为私有,提供 getset 方法,增强数据的保护性。

误区 2:忽视封装的其他方面

封装不仅仅是将属性设为私有,还应注意:

  • 封装业务逻辑:确保类的行为逻辑都封装在类内部,外部只暴露必要的接口。
  • 数据验证:在 set 方法中加入数据验证逻辑,确保数据的合理性。

6. 总结

通过今天的学习,我们了解了 封装(Encapsulation) 的基本概念和应用。封装是面向对象编程中的一个重要特性,它帮助我们隐藏对象的实现细节,保护数据安全,并提高代码的可维护性。通过将属性私有化,并提供公共的 getset 方法,我们可以更好地控制数据的访问和修改。

封装让我们能够确保代码的安全性、可靠性和简洁性。在实际开发中,封装不仅仅是访问控制,它还包含了对数据的验证、业务逻辑的封装等多个方面。

明天我们将继续探讨面向对象编程中的另一个重要特性——继承。敬请期待!

相关文章:

后端Java开发:第十二天

第十二天&#xff1a;封装 - 理解与应用 欢迎来到今天的学习内容&#xff01;今天&#xff0c;我们将一起深入探讨 Java 中的 封装&#xff08;Encapsulation&#xff09;。封装是面向对象编程的四大基本特性之一&#xff0c;它的核心思想是把对象的状态&#xff08;属性&…...

记录一下Coding一直不能clone

配置 下载git客户端&#xff0c;进行配置 git config --list user.name姓名全称 user.emailIAM_xxxxxx.com ,这个就是你的邮箱地址 user.signingkey 注册coding平台的密码 一般不需要配置公钥私钥 下载TortoiseGit&#xff0c;配置这几个参数 配置凭据管理器 注意 这里用户名是…...

LLM加速方法,Adapter Tuning和Prompt Tuning的区别及原理举例

LLM加速方法 目录 LLM加速方法整体结构各分支内容Adapter Tuning和Prompt Tuning的区别及原理举例一、区别二、总结整体结构 基于模型微调、基于模型压缩、基于分布式并行处理。 各分支内容 基于模型微调: 包含Adapter Tuning、Prompt Tuning、LoRA三个子类别。这些技术主要…...

【SVN】版本发布快捷操作

摘要&#xff1a;因为每次发版都需要制作一份相同的文件夹&#xff0c;而大部分的包都不需要变更&#xff0c;但是文件又非常大&#xff0c;记录自己的操作经验。 首先在SVN Repository Browser 界面把上一次的版本复制一份&#xff0c;复制的时候重命名为新的版本号 右击要复…...

GitLab 创建项目、删除项目

1、创建项目 点击左上角图标&#xff0c;回到首页 点击 Create a project 点击 Create blank project 输入项目名称&#xff0c;点击Create Project 创建成功 2、删除项目 进入项目列表 点击对应项目&#xff0c;进入项目 进入Settings页面 拖到页面底部&#xff0c;展开Adva…...

STM32-笔记37-吸烟室管控系统项目

一、项目需求 1. 使用 mq-2 获取环境烟雾值&#xff0c;并显示在 LCD1602 上&#xff1b; 2. 按键修改阈值&#xff0c;并显示在 LCD1602 上&#xff1b; 3. 烟雾值超过阈值时&#xff0c;蜂鸣器长响&#xff0c;风扇打开&#xff1b;烟雾值小于阈值时&#xff0c;蜂鸣器不响…...

VisionPro软件Image Stitch拼接算法

2D图像拼接的3种情景 1.一只相机取像位置固定&#xff0c;或者多只相机固定位置拍图&#xff0c;硬拷贝拼图&#xff0c;采用CopyRegion工具实现 2.一只或多只相机在多个位置拍照&#xff0c;相机视野互相重叠&#xff0c;基于Patmax特征定位后&#xff0c;无缝 拼图&#xff…...

【从零开始入门unity游戏开发之——unity篇09】unity6基础入门——Unity游戏对象和组件的本质、Unity中的反射机制

文章目录 一、Unity游戏对象和组件的本质1、开发游戏的本质2、万物之根本——空对象2.1 什么是空对象&#xff1f;2.2 创建空对象 3、Unity游戏对象的本质4、 transform组件4.1 transform组件的重要性4.2 修改transform的值4.4 **Transform的作用**4.3 重置transform的值 5、总…...

【Linux】深入理解文件系统(超详细)

目录 一.磁盘 1-1 磁盘、服务器、机柜、机房 &#x1f4cc;补充&#xff1a; &#x1f4cc;通常网络中用高低电平&#xff0c;磁盘中用磁化方向来表示。以下是具体说明&#xff1a; &#x1f4cc;如果有一块磁盘要进行销毁该怎么办&#xff1f; 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 类模型明确表明&#xff0c;增加参数数量可以提高性能&#xff0c;因此谷歌使用 GShard 尝试将 Transformer 模型…...

在Linux中,如何禁用root用户直接SSH登录?

在Linux中禁用root用户的直接SSH登录是为了增强系统的安全性&#xff0c;因为允许root用户通过SSH远程登录会增加服务器被暴力破解的风险。以下是在Linux系统中禁止root用户直接SSH登录的步骤&#xff1a; 编辑SSH配置文件&#xff1a; 打开/etc/ssh/sshd_config文件&#xff…...

用Python实现简单的任务自动化

目录 1. 自动发送邮件提醒 2. 自动备份文件 3. 自动下载网页内容 总结 在现代工作和生活中,任务自动化可以极大地提高效率和准确性。Python,作为一种功能强大且易于学习的编程语言,是实现任务自动化的理想选择。本文将通过几个简单而实用的案例,展示如何用Python实现任…...

为AI聊天工具添加一个知识系统 之26 资源存储库和资源管理器

本文要点 资源存储库 为了能完成本项目&#xff08;“为AI聊天工具增加一个知识系统”&#xff0c;其核心能力是“语言处理” &#xff0c;该能力的最大挑战 当仁不让的应该是自然语言处理&#xff09;的设计&#xff0c;我们考虑一个问题&#xff1a;在自然语言处理中&#…...

Windows10环境下安装RabbitMq折腾记

最近有个老项目需要迁移到windows10环境&#xff0c;用的是比较老的rabbitmq安装包&#xff0c;如下所示。经过一番折腾&#xff0c;死活服务起不来&#xff0c;最终果断放弃老版本启用新版本。现在把折腾过程记录下&#xff1a; 一、安装erlang 安装完成后的目录结构&#xff…...

对快速由表及里说拜拜/如何正确运用由表及里

你是不是还&#xff1a;看到一男子拖走一女子就以为小情侣吵架而已&#xff08;可能人贩子&#xff09;&#xff1b;看到男友对你好个几次就从此死心塌地&#xff08;可能有手就行&#xff0c;细节装装而已&#xff09;结果耽误终身&#xff1b;看到女同事对你微笑不排斥就以为…...

spring mvc源码学习笔记之八

本文说点儿简单的。 如果你想研究基于 XML 配置的 spring mvc 的话&#xff0c;可以简单扫一眼本文。 在基于 XML 配置的 spring mvc 开发中&#xff0c;我们主要就是通过 spring 提供的各种标签来配置。 但是&#xff0c;大家是不是都有个疑问&#xff0c;spring 到底给我们提…...

探秘5网口IIOT网关

在当今这个科技飞速发展的时代&#xff0c;工业领域正经历着一场深刻的变革&#xff0c;而工业物联网网关在其中扮演着至关重要的角色。 什么是IIOT网关 工业物联网网关&#xff0c;简单来说&#xff0c;就是连接工业现场设备与云端或者上层管理系统的关键桥梁。 而明达技术研…...

左神算法基础巩固--5

文章目录 前缀树生成前缀树查询前缀树查询字符串加入过几次查询所有加入的字符串中&#xff0c;有几个是以pre这个字符串作为前缀 删除前缀树中的某个字符串 贪心算法解题 前缀树 生成前缀树 要想生成一棵前缀树&#xff0c;需要先创建一个根节点&#xff0c;这个根节点有26条…...

Python的Matplotlib库应用(超详细教程)

目录 一、环境搭建 1.1 配置matplotlib库 1.2 配置seaborn库 1.3 配置Skimage库 二、二维图像 2.1 曲线&#xff08;直线&#xff09;可视化 2.2 曲线&#xff08;虚线&#xff09;可视化 2.3 直方图 2.4 阶梯图 三、三维图像 3.1 3D曲面图 3.2 3D散点图 3.3 3D散…...

负载均衡服务器要怎么配置?

目录 一、概述&#xff1a; 二、硬件配置&#xff1a; 三、操作系统配置&#xff1a; 四、负载均衡软件&#xff1a; 五、网络配置&#xff1a; 六、软件安装步骤&#xff1a; 6.1 安装 Nginx 6.2 安装 LVS 6.3 安装 HAProxy 6.4 安装 Keepalived 一、概述&#xff1…...

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...

以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:

一、属性动画概述NETX 作用&#xff1a;实现组件通用属性的渐变过渡效果&#xff0c;提升用户体验。支持属性&#xff1a;width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项&#xff1a; 布局类属性&#xff08;如宽高&#xff09;变化时&#…...

【项目实战】通过多模态+LangGraph实现PPT生成助手

PPT自动生成系统 基于LangGraph的PPT自动生成系统&#xff0c;可以将Markdown文档自动转换为PPT演示文稿。 功能特点 Markdown解析&#xff1a;自动解析Markdown文档结构PPT模板分析&#xff1a;分析PPT模板的布局和风格智能布局决策&#xff1a;匹配内容与合适的PPT布局自动…...

新能源汽车智慧充电桩管理方案:新能源充电桩散热问题及消防安全监管方案

随着新能源汽车的快速普及&#xff0c;充电桩作为核心配套设施&#xff0c;其安全性与可靠性备受关注。然而&#xff0c;在高温、高负荷运行环境下&#xff0c;充电桩的散热问题与消防安全隐患日益凸显&#xff0c;成为制约行业发展的关键瓶颈。 如何通过智慧化管理手段优化散…...

3-11单元格区域边界定位(End属性)学习笔记

返回一个Range 对象&#xff0c;只读。该对象代表包含源区域的区域上端下端左端右端的最后一个单元格。等同于按键 End 向上键(End(xlUp))、End向下键(End(xlDown))、End向左键(End(xlToLeft)End向右键(End(xlToRight)) 注意&#xff1a;它移动的位置必须是相连的有内容的单元格…...

laravel8+vue3.0+element-plus搭建方法

创建 laravel8 项目 composer create-project --prefer-dist laravel/laravel laravel8 8.* 安装 laravel/ui composer require laravel/ui 修改 package.json 文件 "devDependencies": {"vue/compiler-sfc": "^3.0.7","axios": …...

接口自动化测试:HttpRunner基础

相关文档 HttpRunner V3.x中文文档 HttpRunner 用户指南 使用HttpRunner 3.x实现接口自动化测试 HttpRunner介绍 HttpRunner 是一个开源的 API 测试工具&#xff0c;支持 HTTP(S)/HTTP2/WebSocket/RPC 等网络协议&#xff0c;涵盖接口测试、性能测试、数字体验监测等测试类型…...

适应性Java用于现代 API:REST、GraphQL 和事件驱动

在快速发展的软件开发领域&#xff0c;REST、GraphQL 和事件驱动架构等新的 API 标准对于构建可扩展、高效的系统至关重要。Java 在现代 API 方面以其在企业应用中的稳定性而闻名&#xff0c;不断适应这些现代范式的需求。随着不断发展的生态系统&#xff0c;Java 在现代 API 方…...

Kafka主题运维全指南:从基础配置到故障处理

#作者&#xff1a;张桐瑞 文章目录 主题日常管理1. 修改主题分区。2. 修改主题级别参数。3. 变更副本数。4. 修改主题限速。5.主题分区迁移。6. 常见主题错误处理常见错误1&#xff1a;主题删除失败。常见错误2&#xff1a;__consumer_offsets占用太多的磁盘。 主题日常管理 …...

基于鸿蒙(HarmonyOS5)的打车小程序

1. 开发环境准备 安装DevEco Studio (鸿蒙官方IDE)配置HarmonyOS SDK申请开发者账号和必要的API密钥 2. 项目结构设计 ├── entry │ ├── src │ │ ├── main │ │ │ ├── ets │ │ │ │ ├── pages │ │ │ │ │ ├── H…...