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

面向对象三大特性---封装

面向对象三大特性—封装

什么是封装?

封装说白了就是把东西包起来,不让外人随便碰。就像你的手机,虽然内部有复杂的电路板、芯片,但厂商把这些都封装在外壳里,你只需要通过屏幕和按钮来操作,不需要直接接触内部零件。

为什么需要封装?

  1. 保护数据安全:想象一下,如果银行账户的余额可以被任何人随意修改,那会是什么后果?封装就是给数据加了一把锁。
  2. 隐藏实现细节:你开车的时候,只需要知道踩油门就能加速,不需要了解发动机是怎么工作的。同样,使用一个类的时候,只需要知道它提供了什么功能,不需要关心内部是怎么实现的。
  3. 提高代码的可维护性:如果内部实现需要修改,只要对外提供的接口不变,其他代码就不需要跟着改。。
public class BankAccount {// 私有属性,外部无法直接访问private String accountNumber;private String ownerName;private double balance;// 构造方法public BankAccount(String accountNumber, String ownerName, double initialBalance) {this.accountNumber = accountNumber;this.ownerName = ownerName;// 这里可以加入验证逻辑if (initialBalance >= 0) {this.balance = initialBalance;} else {this.balance = 0;}}// 公共方法:存钱public void deposit(double amount) {if (amount > 0) {balance += amount;System.out.println("存入 " + amount + " 元,当前余额:" + balance);} else {System.out.println("存款金额必须大于0");}}// 公共方法:取钱public boolean withdraw(double amount) {if (amount > 0 && amount <= balance) {balance -= amount;System.out.println("取出 " + amount + " 元,当前余额:" + balance);return true;} else {System.out.println("取款失败:金额不正确或余额不足");return false;}}// 公共方法:查询余额public double getBalance() {return balance;}}

访问修饰符详解

Java提供了四种访问修饰符来控制访问权限:

访问修饰符同一个类同一个包不同包的子类不同包的非子类使用场景
private类的内部数据,不希望外部访问
default(包私有)包内共享的工具方法或数据
protected希望子类能访问的属性或方法
public对外提供的公共接口

选择访问修饰符的原则:

  1. 最小权限原则:优先使用限制性最强的访问修饰符
  2. private优先:类的内部数据尽量使用private
  3. public谨慎:只有确实需要对外提供的接口才用public
  4. protected适中:主要用于继承体系中父类与子类的交互
  5. default罕见:现在很少单独使用,多数情况下要么private要么public

getter和setter方法

有时候我们需要让外部能够访问或修改私有属性,但又要加上一些控制逻辑,这时候就用getter和setter方法:

public class Person {private String name;private int age;// getter方法:获取姓名public String getName() {return name;}// setter方法:设置姓名public void setName(String name) {if (name != null && !name.trim().isEmpty()) {this.name = name;} else {System.out.println("姓名不能为空");}}// getter方法:获取年龄public int getAge() {return age;}// setter方法:设置年龄public void setAge(int age) {if (age >= 0 && age <= 150) {this.age = age;} else {System.out.println("年龄必须在0-150之间");}}
}

封装的好处

  1. 数据安全:private属性无法被外部直接修改,避免了数据被恶意篡改
  2. 数据验证:通过setter方法可以对输入的数据进行验证
  3. 代码维护:修改类的内部实现不会影响外部代码
  4. 接口清晰:外部只需要知道public方法,不需要了解内部细节

常见误区

误区1:所有属性都要private

不是的,要根据实际需求来决定。比如一些常量可以是public的。

误区2:每个private属性都要有getter和setter

也不是的,有些属性可能只需要getter,有些甚至都不需要。要根据业务逻辑来决定。

误区3:封装就是隐藏所有东西

封装的目的是合理地控制访问权限,该公开的要公开,该隐藏的要隐藏。

http://www.dtcms.com/a/310150.html

相关文章:

  • FileInputStream 和 FileOutputStream 简介
  • ubuntu22.04系统入门 linux入门(二) 简单命令 多实践以及相关文件管理命令
  • 便携式综合气象观测仪:随时随地 “捕捉” 天气变化
  • PaddleOcr转onnx和推理
  • python:前馈人工神经网络算法之实战篇,以示例带学,弄明白神经网络算法应用的思路、方法与注意事项等
  • 高斯透镜公式(调整镜头与感光元件之间的距离时,使得不同距离的物体在感光元件上形成清晰的影像)
  • 企业级LLM智能引擎 的完整解决方案,整合了 SpringAI框架、RAG技术、模型控制平台(MCP)和实时搜索,提供从架构设计到代码实现的全面指南:
  • 【iOS】retain/release底层实现原理
  • Java 日期时间格式化模式说明
  • PTE之路--01
  • vivado扫盲 out-of-context(腾讯元宝)
  • Baumer工业相机堡盟工业相机如何通过YoloV8深度学习模型实现围栏羊驼的检测识别(C#代码,UI界面版)
  • Android Material Components 全面解析:打造现代化 Material Design 应用
  • 数据处理四件套:NumPy/Pandas/Matplotlib/Seaborn速通指南
  • 如何在不依赖 Office 的情况下转换 PDF 为可编辑文档
  • lesson30:Python迭代三剑客:可迭代对象、迭代器与生成器深度解析
  • Redis 数据结构全景解析
  • Linux内核构建系统中的auto.conf与autoconf.h:原理与作用解析
  • 3D 管道如何实现流动的?
  • 基于SpringBoot+MyBatis+MySQL+VUE实现的疗养院管理系统(附源码+数据库+毕业论文+远程部署)
  • cesium FBO(三)渲染到Canvas(灰度图效果)
  • 【OneAPI】网页搜索API和网页正文提取API
  • Lombok常用注解及功能详解
  • oracle的安全加密有哪些?
  • Python文件对比利器:filecmp模块详解
  • 学习嵌入式第十七天
  • Vue项目使用ssh2-sftp-client实现打包自动上传到服务器(完整教程)
  • 10.Linux 用户和组的管理
  • 【HL7】.aECG与.hl7文件的关系和区别
  • Java滤波去除异常峰值方法(二)