Java——封装(Encapsulation)

news2025/1/16 20:49:44

一、封装简介

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.coloradmin.cn/o/1853501.html

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

相关文章

YouTube API接口:一键获取Playlist视频合集信息

核心功能介绍 在视频内容日益繁荣的今天&#xff0c;YouTube作为全球领先的视频分享平台&#xff0c;为内容创作者、品牌商家以及数据分析师提供了丰富的视频资源。其中&#xff0c;Playlist视频合集作为YouTube上的一种特色内容形式&#xff0c;深受用户喜爱。为了更好地满足…

个性化光标和动态壁纸

光标 进入这个宝藏网页至美化 至美化 进入鼠标页面&#xff0c;选择自己喜欢的鼠标&#xff0c;进入相关页面 分为两种&#xff0c;那么热爱有钱的UU可以选择高清版 像我这种没钱的孩子或者觉得试用版够用的就使用上面的 点击下载 进入自己的文件夹&#xff0c;解压成功之…

idea添加文档注释

一、easy javadoc插件 在settings的plugins中下载easy javadoc插件。 安装完成后重启idea&#xff0c;再次打开settings界面。会出现easyDoc相关配置。 二、设置模版以及使用 类描述模版参考设置&#xff1a; /** * 类描述 -> * * Author: ywz * Date: $Date$ */ 方法描述…

人脸识别技术:前沿应用与业务场景探索

随着科技的飞速发展&#xff0c;人脸识别技术已经成为我们日常生活中不可或缺的一部分。这项技术以其独特的生物特征识别能力&#xff0c;在公共安全、金融、交通、教育等多个领域展现出巨大的潜力和价值。本文将深入探讨人脸识别技术的原理、业务场景以及相关的成功案例。 一、…

示例:推荐一个自定义的Ribbon皮肤

一、目的&#xff1a;WPF自带的Ribbon控件功能很强大&#xff0c;但使用过程中感觉显示的样式不是很好&#xff0c;或者不适合自己的项目&#xff0c;下面介绍一个基于自带Ribbon控件样式的修改&#xff0c;主要修改了些高度&#xff0c;间距&#xff0c;背景色&#xff0c;前景…

借助ChatGPT降低学术论文重复率,使用技巧全攻略,实用有效,快速上手

大家好&#xff0c;感谢关注。我是七哥&#xff0c;一个在高校里不务正业&#xff0c;折腾学术科研AI实操的学术人。可以&#xff08;yida985&#xff09;交流学术写作或ChatGPT等AI领域相关问题&#xff0c;多多交流&#xff0c;相互成就&#xff0c;共同进步。 经常有学术同…

文心智能体平台介绍和应用:制作你的智能体(运维小帮手)

这是我自己制作的智能体 大家可以了解一下&#xff01; 运维小帮手&#xff01;https://mbd.baidu.com/ma/s/tE19dqvr 文心智能体平台官网首页 点击跳转&#xff01;https://agents.baidu.com/ 什么是智能体平台&#xff1f; 文心智能体平台&#xff08;Wenxin Intelligen…

【Leetcode】520. 检测大写字母

文章目录 题目思路代码复杂度分析时间复杂度空间复杂度 结果总结 题目 题目链接&#x1f517;我们定义&#xff0c;在以下情况时&#xff0c;单词的大写用法是正确的&#xff1a; 全部字母都是大写&#xff0c;比如 “USA” 。单词中所有字母都不是大写&#xff0c;比如 “le…

腾讯云[HiFlow】| 自动化 -------HiFlow:还在复制粘贴?

文章目录 前言&#xff1a;一&#xff1a;HiFlow是什么二&#xff1a;功能介绍1.全连接2.自动化2.1定时处理特定任务2.2实时同步变更信息2.3及时获取通知提醒 3.零代码4.多场景5.可信赖 三&#xff1a;用户体验最后 前言&#xff1a; 随着网络时代的不断发展&#xff0c;自动化…

java内置线程池

线程池常见方法 如何获取线程池对象 缓存线程池 自定义任务对象 public class MyRunnable implements Runnable{private int id;public MyRunnable(int id) {this.id id;}Overridepublic void run() {String name Thread.currentThread().getName();System.out.println(&quo…

文心一言 VS 讯飞星火 VS chatgpt (287)-- 算法导论21.2 6题

六、假设对 UNION 过程做一个简单的改动&#xff0c;在采用链表表示中拿掉让集合对象的 tail 指针总指向每个表的最后一个对象的要求。无论是使用还是不使用加权合并启发式策略&#xff0c;这个修改不应该改变 UNION 过程的渐近运行时间。(提示:而不是把一个表链接到另一个表后…

VC++支持断点续下或续传的功能

VC使用多线程和Socket实现断点续下 一、断点续下的基本原理&#xff1a; 1.断点续传的理解可以分为两部分&#xff1a;一部分是断点&#xff0c;一部分是续传。断点的由来是在下载过程中&#xff0c;将一个下载文件分成了多个部分&#xff0c;同时进行多个部分一起的下载&…

智能优化算法改进策略之局部搜索算子(四)--梯度搜索法

2、仿真实验 以海洋捕食者算法&#xff08;MPA&#xff09;为基本算法。考察基于梯度搜索的改进海洋捕食者算法&#xff08;命名为GBSMPA&#xff09; vs. 海洋捕食者算法&#xff08;MPA&#xff09; 在Sphere函数上的比较 在Penalized1函数上的比较 在CEC2017-1上的比较 在C…

cuda与cudnn下载(tensorflow-gpu)

目录 前言 正文 前言 &#xff01;&#xff01;&#xff01;tensorflow-gpu的版本要与cuda与cudnn想对应。这点十分重要&#xff01;推荐下载较新的。即tensorflow-gpu2.60及以上&#xff0c;cuda11.x及以上&#xff0c;cudnn8.x及以上。 所以&#xff0c;下载之前先检查好…

朱啸虎:五年后大模型公司很难独立存在,核心不在技术,而是寻找尖刀式场景

人工智能时代&#xff0c;AI赛道如何投&#xff1f; 6月21日&#xff0c;金沙江创投合伙人朱啸虎在“创投十年”高峰论坛上&#xff0c;分享了以“扬鞭奋蹄正当时”为主题的演讲&#xff0c;聚焦创投行业当前的新形势和新变化作出分享。 要点如下&#xff1a; 1、今天一级市…

计算机网络之奇偶校验码和CRC冗余校验码

今天我们来看看有关于计算机网络的知识——奇偶校验码和CRC冗余校验码&#xff0c;这两种检测编码的方式相信大家在计算机组成原理当中也有所耳闻&#xff0c;所以今天我就来跟大家分享有关他们的知识。 奇偶校验码 奇偶校验码是通过增加冗余位使得码字中1的个数恒为奇数或偶数…

示例:推荐一个应用Adorner做的通知和提示消息对话框

一、目的&#xff1a;在开发过程中&#xff0c;增加一些提示消息可以很好的提高用户体验&#xff0c;下面介绍一个用于增加提示消息的库 二、效果如下 可以看到右侧顶端弹出提示消息&#xff0c;消息间隔3s自动退出 三、环境 VS2022 Net7 四、使用方式 安装nuget包&#xff…

什么是APP分发-了解APP分发的核心概念

APP分发的定义和意义 大家有没有过这样的经历&#xff1a;辛辛苦苦开发了一款APP&#xff0c;却不知道该怎么让更多人知道和使用&#xff1f;APP分发的重要性就凸显出来了。APP分发就是将你的应用推送到不同的应用市场和平台&#xff0c;让更多用户能够下载和使用。 小猪app封…

智能优化算法改进策略之局部搜索算子(七)--自适应模式搜索法

1、原理介绍 模式搜索法[1]是Hooke与Jeeves提出的一种直接搜索算法&#xff0c;其目的是通过比较目标函数在有限点集中的函数值来优化目标函数。更重要的是&#xff0c;它不仅不使用任何导数知识&#xff0c;而且不需要隐式地建立任何一种导数近似。 在这种直接搜索技术中&…

C++学习合集

#整理到一块&#xff0c;方便查东西&#xff0c;顺便补充一些之前没有学习到的东西# 变量 char--1字节 short--2字节 int-4字节 long--4字节 long long(int)--8字节&#xff1b;准确来说变量的大小取决于编译器&#xff0c;1字节8个二进制位&#xff0c;其中最高位为符号位…