38从零开始学Java之封装到底是咋回事?

news2024/11/23 5:05:36

作者:孙玉昌,昵称【一一哥】,另外【壹壹哥】也是我哦

千锋教育高级教研员、CSDN博客专家、万粉博主、阿里云专家博主、掘金优质作者

前言

我们知道,Java是面向对象的编程语言。关于面向对象的概念,壹哥在之前的文章中就已经给大家详细地讲过了。但是关于面向对象,我们还有另一块不得不学的内容,那就是面向对象的特征!

可以说,面向对象的三大特征,是我们每个java程序员都必须掌握的基本功。在日常的开发中,每段java代码的编写实现,都应该体现出这些特征的基本要求。另外在我们面试的时候,面向对象的特征更是初级程序员的必考要点,面试官动不动就来一句:你给我说说面向对象的特征有哪些吧。

-------------------------------------------------前戏已做完,精彩即开始-----------------------------------------------

全文大约【2500】字,不说废话,只讲可以让你学到技术、明白原理的纯干货!本文带有丰富的案例及配图视频,让你更好地理解和运用文中的技术概念,并可以给你带来具有足够启迪的思考......

配套开源项目资料

Github:

GitHub - SunLtd/LearnJava

Gitee:

一一哥/从零开始学Java

一. 三大特征

我们知道,面向对象是一种以对象为核心的软件开发思想。在这种编程思想中,有着明显的几个特征,通常我们归纳为如下三个:

  • 封装(Encapsulation):将类或接口的实现细节部分包装、隐藏起来。
  • 继承(extends):子类继承父类的特征和行为,使得子类对象(实例)拥有父类的实例域和方法;或子类从父类继承方法,使得子类拥有父类相同的行为。
  • 多态(polymorphism):同一个行为具有多个不同表现形式或形态的能力,即同一个接口可以使用不同的实例执行不同的操作。

但也有的面试官会问我们面向对象有哪四大特征?这就让你很懵逼,不都是三大特征吗?如果非要有这种傻缺的问法,那我们就可以再多回答一个”抽象的概念即可。

关于继承、多态和抽象等的概念,壹哥会在后面的文章中单独讲解,本篇文章先只讲封装是怎么回事。

二. 封装

1. 概念

所谓的封装,其实就是尽可能地隐藏对象的内部实现细节,控制对象的修改及访问权限,将某些实现细节部分包装、隐藏起来,并对外提供公开的方法访问私有成员。一般我们是利用private访问修饰符来实现。

通俗地说,封装就是把一个Java类的部分实现进行“隐藏”、“包裹”,不让你完全看见它的“内部”是咋回事。就好比一个银行,有的地方(大厅)可以对外暴露,但有的地方(金库)就需要隐藏。我们在修建银行的时候,金库在设计之初就是要被隐藏的,但金库会预留一个渠道对外联通,让钱可以进出。

Java里的封装其实也是这样的。把一个类中不想让别人直接看到的内容封装隐藏起来,不让别人直接操作这部分内容,但又可以通过某种方法对外展示。这样,我们对java类的操作就可进可退,保证了类的安全性。

所以封装可以被认为是一种类的保护屏障,防止该类的代码和数据被外部类定义的代码随机访问。如果想要访问该类的代码和数据,必须通过严格的接口控制。通过适当的封装,让程式码更容易理解与维护,也加强了代码的安全性。

2. 必要性

那么Java里的类一定都要封装吗?我们来看一个场景,如下图所示:

比如上面的Student类,内部有4个非私有的属性。我们可以在对象的外部,为这几个属性直接赋值。在上面的代码中,我们给age赋值20000,学生的年龄是20000,这合理吗?得分是1000合理吗?这就出现了非法的数据录入,存在数据的安全问题。这种问题该怎么解决?如何对属性的赋值加以控制?

针对这种情况,我们就可以使用封装!将类内部的属性进行私有化,然后再提供对外的方法调用这些属性,并在方法内部对属性的赋值进行合理控制。别的地方只能通过规定的方法来访问数据,隐藏了类的实现细节,方便修改和实现,这样我们就不担心非法数据的录入问题!这也就是封装的意义所在!

既然封装有其存在的必要性,那么我们该如何实现封装呢?请继续往下看!

3. 实现要求

如果我们想实现类的封装,主要有以下两个步骤:

  1. 给成员变量添加private修饰符;
  2. 添加公开的get和set方法;
  3. 在赋值和取值方法中,加入属性控制语句,对属性值的合法性进行判断。

3.1 private关键词

private是一种访问权限修饰符,是一个表示“私有的“关键词,可以修饰类、方法和变量等。如果用来修饰成员变量,可以实现成员变量的私有化,限制该成员变量只能在类的内部直接访问,类外不能直接访问。

3.2 getter和setter方法

通常情况下,这些get和set方法被称为getter和setter方法。任何访问类中私有成员变量的操作都要通过这些getter和setter方法。

get方法是用来获取私有属性的方法,其语法结构为:

public 返回值类型 getXxx(){
    return 返回属性值; 
} 

set方法是用来修改私有属性值的方法,其语法结构为:

public void setXxx(属性类型 属性){ 
    this.xxx = 属性;
	//其他对属性进行操作的代码
} 

这里我们要注意,get方法一般没有参数,但有返回值;set方法一般没有返回值,但有参数!!!

4. 封装案例

为了让大家更好地理解如何实现封装,壹哥设计一个Person类,我们来看看代码:

/**
 * @author 一一哥Sun  
 * 属性:姓名、年龄、性别
 * 封装步骤:(1).把成员变量变成私有的;(2).添加公开的get和set方法
 */
public class Person {

	// 私有化属性
	private String name;
	private int age;
	private String sex;

	//设置公开方法
	// 获取name
	public String getName() {
		return name;
	}

	// 对name赋值
	public void setName(String name) {
        //this关键字解决了实例变量(private String name)和局部变量(String name)之间的同名冲突。
		this.name = name;
	}

	public int getAge() {
		return this.age;
	}

	public void setAge(int age) {
		// 限制年龄的范围
		if (age > 100 || age < 1) {
			// 设置一个默认值
			this.age = 18;
		} else {
			this.age = age;
		}
	}

	public String getSex() {
		return this.sex;
	}

	public void setSex(String sex) {
		// 设置性别
		if ("男".equals(sex) || "女".equals(sex)) {
			this.sex = sex;
		} else {
			this.sex = "男";
		}
	}

    //提供无参和有参的构造方法
	public Person() {
		super();
	}
	
	public Person(String name, int age, String sex) {
		super();
		this.name = name;
		this.age = age;
		this.sex = sex;
	}

}

从上述代码中,我们可以看出实现类的封装其实也很简单:

  1. 成员变量(属性)私有化(用private修饰);
  2. 添加公开的get和set方法,用public修饰;
  3. 添加有参和无参的若干构造方法。

一般我们把这样封装好的一个类成为Java Bean,Java Bean一般有两种:

  1. 负责数据承载的Bean;
  2. 负责业务逻辑的Bean。

我们上面的案例,就是一个数据承载的Bean。

------------------------------------------------​​​​​​​正片已结束,来根事后烟----------------------------------------------

三. 结语

至此,我们就把面向对象的第一个基本特征--封装 学习完了。现在你知道该如何正确地封装一个Java Bean了吗?在面试时,我们要把封装的概念及其优点讲清楚:

  • 良好的封装能够减少耦合;
  • 封装可以使得类内部的结构自由修改;
  • 封装可以对成员变量进行更精确的控制;
  • 封装隐藏了类的信息和实现细节。

如果你独自学习觉得有很多困难,可以加入壹哥的学习互助群,大家一起交流学习。

四. 配套视频

如果你不习惯阅读技术文章,或是对文中的技术概念不能很好地理解,可以来看看壹哥帮你筛选出的视频教程。与本文配套的Java学习视频,链接如下:

Bilibili External Player

五. 今日作业

1. 第一题

封装一个部门类,设计合理的属性及访问方法。

 

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

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

相关文章

【linux】进程: systemd、systemctl

状态 R —— 运行S&#xff08;TASK_INTERRUPTIBLE&#xff09; —— 等待&#xff0c;可中断&#xff0c;IOD&#xff08;TASK_UNINTERRUPTIBLE&#xff09; —— 等待&#xff0c;不可中断K&#xff08;TASK_KILLABLE&#xff09; —— 等待&#xff0c;可删除&#xff0c;I…

chatgpt赋能python:Python内置函数大全表

Python 内置函数大全表 Python 是一种强大的编程语言&#xff0c;拥有许多有用的内置函数。这些函数可以在编写 Python 代码时大大简化开发人员的工作流程。本文提供了一张Python内置函数的大全表&#xff0c;以及每个函数的简要说明。 内置函数列表 以下是 Python 的内置函…

Elasticsearch:在 Elasticsearch 中使用 NLP 和矢量搜索增强聊天机器人功能

作者&#xff1a;Priscilla Parodi 会话界面已经存在了一段时间&#xff0c;并且作为协助各种任务&#xff08;例如客户服务、信息检索和任务自动化&#xff09;的一种方式而变得越来越流行。 通常通过语音助手或消息应用程序访问&#xff0c;这些界面模拟人类对话&#xff0c;…

众议院压倒性通过!

* * * 原创&#xff1a;刘教链 * * * 号外&#xff1a;今天在小号“刘教链Pro”发表了一篇《大V出货了》&#xff0c;欢迎关注“刘教链Pro”并阅读。 * * * 隔夜比特币回升至27k上方。 万众瞩目的美债危机到了千钧一发之际。继周日美国总统拜登和众议院议长麦卡锡初步达成口头…

618特辑 | 人到中年的品质生活,是我对自己的最大尊重

点击文末“阅读原文”即可参与节目互动 剪辑、音频 / 卷圈 运营 / SandLiu 卷圈 监制 / 姝琦 文案 / 粒粒 封面 / 姝琦midjourney 产品统筹 / bobo 场地支持 / 声湃轩北京录音间 不知从什么时候开始&#xff0c;我们开始高亮“实用主义”的生活态度&#xff0c;一切以…

FPGA PAL视频BT656解码Video Processing Subsystem去隔行 TW2867采集 提供工程源码和技术支持

目录 1、前言2、我这里已有的PAL视频解码方案3、模拟视频概述4、模拟视频颜色空间5、逐行与隔行6、BT656数据与解码BT656数据格式BT656数据解码 7、TW2867芯片解读与配置TW2867芯片解读TW2867芯片配置TW2867时序分析 8、设计思路与框架9、vivado工程详解Block Design设计SDK设计…

c++实现产品功能(简单基础功能)

通过c++实现公司产品功能,要求能在VS和CB上完美运行,实现的功能基础简单 #include <iostream> #include <string>// 摄像机类 class Camera { public:// 成员函数:拍摄照片void takePhoto() {std::cout << "Take a photo." << std::endl;…

六一儿童节,小灰给大家准备了特别的礼物!

大家好&#xff0c;我是程序员小灰。 熟悉小灰的朋友们都知道&#xff0c;小灰比较擅长写作&#xff0c;却并不善于口头表达。 但是&#xff0c;在2023年&#xff0c;小灰决定搞一件大事情&#xff0c;与我的团队成员共同组建《小灰AI共创汇》。我们这个共创汇的目标&#xff0…

鹅厂专家讲透AI文本生成解码策略与代码实现

&#x1f449;腾小云导读 本文以 huggingface-transformers 的文本生成解码代码为例&#xff0c;对文本生成常用的五种解码策略 greedy search、beam search、sample、sample and rank & beam sample、group beam search 进行逐行解读。每一小节首先会介绍对应解码策略的原…

JavaScript实现输入数字,通过数组方式将它们连接起来的代码

以下为实现输入数字&#xff0c;通过数组方式将它们连接起来的程序代码和运行截图 目录 前言 一、输入数字&#xff0c;通过数组方式将它们连接起来 1.1 运行流程及思想 1.2 代码段 1.3 JavaScript语句代码 1.4 运行截图 前言 1.若有选择&#xff0c;您可以在目录里进行…

JetBrains的.NET和ASP.NET集成开发环境Rider 2023版本在Win10系统的下载与安装配置教程

目录 前言一、Rider 安装二、使用配置总结 前言 Rider是一款专为.NET和ASP.NET开发人员设计的集成开发环境&#xff08;IDE&#xff09;。它提供了丰富的功能和工具&#xff0c;可以帮助开发人员更高效地编写、调试和部署.NET和ASP.NET应用程序。 Rider的主要特点&#xff1a…

Linux---守护进程

window称为&#xff1a;服务 区分以下四点&#xff1a; 会话会话首进程进程组组长进程 不想让会话关闭&#xff0c;但是会话中的进程不想关闭&#xff0c;解决方法&#xff1a;把当前进程脱离出来&#xff0c;放到一个新会话中&#xff1b;在新会话中成为会话首进程 那么表示…

Change Buffer:提升InnoDB性能的关键技术

摘要&#xff1a; Change Buffer是一种特殊的数据结构&#xff0c;用于缓存二级索引页的更改操作&#xff0c;当这些页不在缓冲池中时。本文将介绍Change Buffer的工作原理、优势和配置&#xff0c;并提供了监控Change Buffer的方法。 Change Buffer是InnoDB存储引擎中的一个重…

小米基于 Flink 的实时数仓建设实践

摘要&#xff1a;本文整理自小米软件开发工程师周超&#xff0c;在 Flink Forward Asia 2022 平台建设专场的分享。本篇内容主要分为四个部分&#xff1a; 1. 小米数仓架构演变 2. FlinkIceberg 架构升级实践 3. 流批一体实时数仓探索 4. 未来展望 Tips&#xff1a;点击「阅读原…

每每聊到线程Thread

进程和线程 进程 所谓计算机程序 Program&#xff0c;其实就是通过执行一系列指令来完成某一个任务。当你启动一个程序时&#xff0c;操作系统(OS)会将其加载到内存中&#xff0c;并在内存中申请一块固定地址的命名空间(address space)&#xff0c;并在此命名空间内执行相关指令…

bert中文文本摘要代码(2)

bert中文文本摘要代码 写在最前面关于BERT使用transformers库进行微调 model.py自定义参数激活函数geluswish定义激活函数字典 BertConfig类参数配置vocab_size_or_config_json_filefrom_dict方法&#xff08;from_json_file时调用&#xff09;from_json_file方法一系列方法 Be…

Coursera自动驾驶2.1——最小二乘法和线性和非线性卡尔曼滤波

文章目录 一、最小二乘法1.最小二乘法2.加权最小二乘法3.递归最小二乘法4.最小二乘法与极大似然 二、卡尔曼滤波1.概述2.线性卡尔曼滤波3.扩展卡尔曼滤波Error State卡尔曼滤波 4.无迹卡尔曼滤波&#xff08;1&#xff09;无迹变换&#xff08;2&#xff09;无迹卡尔曼滤波 一、…

I.MX6ull 中断 一

一 I.MX6ull 中断介绍 1 中断类型 Cortex-A7内核有8个异常中断&#xff0c;这8个异常中断的中断向量表如下表所示&#xff1a; Cortex-A 内核 CPU 的所有外部中 断都属于这个 IRQ 中断&#xff0c;当任意一个外部中断发生的时候都会触发 IRQ 中断。在 IRQ 中断服 务函数里面就…

linux php8.2安装swoole扩展

下载swoole源码&#xff1a; wget https://wenda-1252906962.file.myqcloud.com/dist/swoole-src-5.0.2.tar.gz tar -zxvf swoole-src-5.0.2.tar.gz cd swoole-src-5.0.2/ 初始化&#xff1a; /www/server/php/82/bin/phpize 配置检查&#xff1a; ./configure --with-…

JDK17在Windows安装以及环境变量配置(超详细的教程)

目录 一、JDK17的安装包下载 二、安装JDK17 第一步&#xff1a;运行JDK的EXE文件 第二步&#xff1a;选择下一步 第三步&#xff1a;选择安装目录 第四步&#xff1a;安装完成 三、配置JDK17的环境变量 第一步&#xff1a;打开系统属性界面 第二步&#xff1a;打开高级…