Java——封装(Encapsulation)

一、封装简介

1、封装是什么

封装(Encapsulation)是面向对象编程(OOP)中的一个基本概念,它指的是将对象的状态(数据)和行为(方法)绑定在一起,并对外隐藏对象的内部细节。在Java中,封装通过使用访问修饰符(如 privateprotectedpublic)来实现,这些修饰符控制类的成员(变量和方法)的可见性和访问级别。封装在Java中确实涉及将类的部分实现细节(包括数据和方法)隐藏起来,只对外暴露必要的抽象接口。

封装可以被视为一种保护屏障,它通过限制外部代码对类内部数据和方法的直接访问,提供了对类的内部实现的保护。要访问该类的代码和数据,必须通过严格的接口控制。封装最主要的功能在于我们能修改自己的实现代码,而不用修改那些调用我们代码的程序片段。适当的封装可以让程式码更容易理解与维护,也加强了程式码的安全性。

打个比较生动的例子就是当我们使用手机时,我们不需要了解其内部电路、处理器、内存或其他硬件组件的具体工作原理。相反,我们只需要使用手机提供的各种功能和应用程序,如拨打电话、发送短信、浏览网页、拍照等。

2、封装的好处

  • 提高安全性:通过隐藏内部数据,可以防止外部代码直接操作数据,从而减少错误和提高安全性。
  • 简化代码的使用:使用者只需要知道类的公共接口,而不需要了解内部实现细节。
  • 易于修改和维护:类的内部实现可以自由修改,而不影响使用该类的其他代码。

二、封装的详细步骤

1. 将属性进行私有化(private)

class Person {private String name;private int age;
}

2. 提供一个公共的 set 方法,用于对属性判断并赋值

class Person {private String name;private int age;public void setName(String name) {if(name != null && name.length() >= 2 && name.length() <= 6) {this.name = name;} else {throw new IllegalArgumentException("名字长度应当在 2-6 个字");}}public void setAge(int age) {if(age >= 0 && age <= 200) {this.age = age;} else {throw new IllegalArgumentException("年龄应当在 0-200 之间");}}
}

3. 提供一个公共的 get 方法,用于获取属性的值

class Person {private String name;private int age;public void setName(String name) {if(name != null && name.length() >= 2 && name.length() <= 6) {this.name = name;} else {throw new IllegalArgumentException("名字长度应当在 2-6 个字");}}public void setAge(int age) {if(age >= 0 && age <= 200) {this.age = age;} else {throw new IllegalArgumentException("年龄应当在 0-200 之间");}}public int getAge() {return age;}public String getName() {return name;}
}

示例

package com.pack1;public class Encapsulation {public static void main(String[] args) {Person person = new Person();person.setName("张三");person.setAge(18);System.out.println("名字:" + person.getName() + "\n年龄:" + person.getAge());}
}class Person {private String name;private int age;public void setName(String name) {if(name != null && name.length() >= 2 && name.length() <= 6) {this.name = name;} else {throw new IllegalArgumentException("名字长度应当在 2-6 个字");}}public void setAge(int age) {if(age >= 0 && age <= 200) {this.age = age;} else {throw new IllegalArgumentException("年龄应当在 0-200 之间");}}public int getAge() {return age;}public String getName() {return name;}
}

运行结果:

可以发现这里我们可以使用 setter 对私有属性进行配置,可以使用 getter 对私有属性进行获取。而不是直接对属性进行访问。

三、补充

1、构造器与 setter 相结合

我们可以在构造器中使用 setter 已保留那些对属性设置的验证逻辑,也就是保留那些防护机制。

package com.pack1;public class Encapsulation {public static void main(String[] args) {try {Person person = new Person("张三",18); // 合法姓名和年龄System.out.println("姓名: " + person.getName() + "\n年龄" + person.getAge());// 非法姓名,将引发异常Person person2 = new Person("",18);} catch (IllegalArgumentException e) {System.out.println(e.getMessage());}}
}class Person {private String name;private int age;//使用 setter 的构造器public Person(String name, int age) {setName(name);setAge(age);}public void setName(String name) {if(name != null && name.length() >= 2 && name.length() <= 6) {this.name = name;} else {throw new IllegalArgumentException("名字长度应当在 2-6 个字");}}public void setAge(int age) {if(age >= 0 && age <= 200) {this.age = age;} else {throw new IllegalArgumentException("年龄应当在 0-200 之间");}}public int getAge() {return age;}public String getName() {return name;}
}

运行结果:

可以发现这里使用构造器传入错误的参数依旧会抛出异常,可以发现将构造器与 setter 相结合使用可以保留对参数的验证。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/33112.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

websocket 安全通信

WebSocket 协议 WebSocket&#xff1a;在 2008 年诞生&#xff0c;2011 年成为国际标准。它允许服务器主动向客户端推送信息&#xff0c;客户端也可以主动向服务器发送信息&#xff0c;实现了真正的双向平等对话。它是一种在单个 TCP 连接上进行全双工通讯的协议&#xff0c;能…

【Python如何输入升高和体重判断你是偏胖还是偏瘦】

1、求体质指数得Python代码如下&#xff1a; # BMI&#xff08;Body Mass Index&#xff09;指数:简称体质指数&#xff0c; # 是国际上常用的衡量人体胖瘦程度以及是否健康的一个标准。 # 常用指标:BMI<18.5 偏瘦 18.5<MBI<24 正常 MBI>24 偏胖 # 计算公式:BMI…

express+vue 在线五子棋(一)

示例 在线体验地址五子棋&#xff0c;记得一定要再拉个人才能对战 本期难点 1、完成了五子棋的布局&#xff0c;判断游戏结束 2、基本的在线对战 3、游戏配套im(这个im的实现&#xff0c;请移步在线im) 下期安排 1、每步的倒计时设置 2、黑白棋分配由玩家自定义 3、新增旁观…

学习面向对象前--Java基础练习题2

买飞机票 需求 机票价格按照淡季旺季、头等舱和经济舱收费、输入机票原价、月份和头等舱或经济舱。 按照如下规则计算机票价格:旺季(5-18月)头等舱9折&#xff0c;经济舱8.5折&#xff0c;淡季(11月到来年4月)头等舱7折&#xff0c;经济舱6.5折。 逻辑 首先输入票价&#xff…

java spring注解的使用

Java Spring框架中的注解用于简化代码的编写和配置工作。它们提供了一种简洁、强大和灵活的方式来定义和配置Spring应用程序。 下面是一些常用的Java Spring注解的使用示例&#xff1a; Component: 标记一个类为Spring容器管理的Bean&#xff0c;可用于任何类。 Component p…

C++标准模板库STL介绍

STL的六大组成部分 STL&#xff08;Standard Template Library&#xff09;是 C 标准库中的一个重要组成部分&#xff0c;提供了丰富的通用数据结构和算法&#xff0c;使得 C 编程变得更加高效和方便。STL 包括了 6 大类组件&#xff0c;分别是算法&#xff08;Algorithm&…

# Kafka_深入探秘者(3):kafka 消费者

Kafka_深入探秘者&#xff08;3&#xff09;&#xff1a;kafka 消费者 一、kafka 消费者、消费组 1、Kafka 消费者是消费组的一部分&#xff0c;当多个消费者形成一个消费组来消费主题时&#xff0c;每个消费者会收到不同分区的消息。假设有一个 T1 主题&#xff0c;该主题有…

Web应用防火墙(WAF)(上:基础概念篇)

运维专题 Web应用防火墙&#xff08;WAF&#xff09;&#xff08;上&#xff1a;基础概念篇&#xff09; - 文章信息 - Author: 李俊才 (jcLee95) Visit me at CSDN: https://jclee95.blog.csdn.netMy WebSite&#xff1a;http://thispage.tech/Email: 291148484163.com. She…

pgAdmin后台命令执行漏洞(CVE-2023-5002)

​ 我们可以看到针对于漏洞 CVE-2022-4223&#xff0c;官方做了一定的修复措施。 web\pgadmin\misc_init_.py#validate_binary_path ​ 首先是添加了 login_required​ 进行权限校验。在 Flask 框架中&#xff0c;login_required​ 装饰器通常与 Flask-Login 扩展一起使用。…

LED恒流调光电路

LED等在工作的时候发热较大&#xff0c;所以通常选用铝基板作为底板&#xff1b;常用白色油墨。 LED必须在恒流源电路下工作&#xff0c;下图为最简单的恒流源&#xff1a;B极电压3.3V不变左下侧蓝色的为稳压二极管&#xff0c;由于BE极可以看做二极管&#xff0c;压降为0.7V&…

WDF驱动开发-WDF总线枚举(一)

支持在总线驱动程序中进行 PnP 和电源管理 某些设备永久插入系统&#xff0c;而其他设备可以在系统运行时插入和拔出电源。 总线驱动 必须识别并报告连接到其总线的设备&#xff0c;并且他们必须发现并报告系统中设备的到达和离开情况。 总线驱动程序标识和报告的设备称为总线…

OpenCV颜色检测

OpenCV颜色检测 前言策略分析根据颜色检测目标对象相关链接 前言 绿幕技术是一种经典的视频编辑技术&#xff0c;可以用于将人物置于不同的背景中。例如在电影制作中&#xff0c;技术的关键在于演员不能身着特定颜色的衣服(比如绿色)&#xff0c;站在只有绿色的背景前。然后&a…

异地组网如何OEM?

在现代信息社会中&#xff0c;企业越来越需要跨地域进行数据传输与共享。面临的挑战却是如何在不暴露在公网的情况下&#xff0c;实现异地组网并保障数据的安全性。本文将介绍一种名为“异地组网OEM”的解决方案&#xff0c;该方案能够通过私有通道传输数据并对数据进行安全加密…

大数据平台之Flink

Apache Flink是一款开源的流处理框架&#xff0c;用于处理实时数据流和批处理数据。它由Apache Software Foundation开发和维护&#xff0c;提供了丰富的功能和特性&#xff0c;适用于各种复杂的数据处理任务。下面是对Flink的详细介绍&#xff1a; 1. 基本概念 流处理&#…

我的大学生活-人面不知何处去(大三篇)

我的大学生活&#xff08;大三篇&#xff09; 前言推荐大三&#xff08;人面不知何处去&#xff09;2022年8月2022年9月2022年10月2022年11月2022年12月 寒假2023年1月 大三&#xff08;人面不知何处去&#xff09;2023年2月2023年3月2023年4月2023年5月2023年6月 暑假2023年7月…

(十三)、MQTT3.1.1-MQTT服务端数据结构设计

为进一步实现一个简易的MQTT服务端&#xff0c;做如下服务端数据结构设计。 1、服务端协议相关的函数 连接 rx_connect() 接收连接请求 Socket中监听&#xff0c;通过第一个字节switch&#xff0c;根据数据创建client对象 tx_connectack() 回复连接响应 处理完成rx_conn…

【LeedCode】二分查找算法(一)

二分查找算法的时间复杂度是O(logN) &#xff0c;更优于传统的遍历数组算法值得我们学习。 注意二分查找一般使用的前提是&#xff1a;待操作的数组的元素有某种规律也就是要有二阶性&#xff0c;二段性就是在数组中选取一点根据该数组元素某种规律可以把数组分为两部分&#x…

国企:2024年6月中国移动相关招聘信息 三

中国移动卓望公司-卓望信息 卓望公司成立于2000年6月,是中国移动的控股子公司,积极拓展互联网、IT、ICT领域,提供平台及应用开发、运营运维等服务。  成立二十余年来,卓望公司逐渐形成包括业务合作管理、内容渠道运营、网络集中运维、企业服务、安全服务、行业DICT服务等…

笔记-python的with用法

一、With语句是什么&#xff1f; 在编程中&#xff0c;有些任务需要在执行前进行设置&#xff0c;并在完成后进行清理。针对这种情况&#xff0c;Python的with语句提供了一种非常方便的处理方式。一个典型的例子是文件处理&#xff1a;需要打开一个文件句柄&#xff0c;从中读…