【Java】你真的懂封装吗?一文读懂封装-----建议收藏

在这里插入图片描述

  • 博主简介:努力学习的预备程序媛一枚~
  • 博主主页: @是瑶瑶子啦
  • 所属专栏: Java岛冒险记【从小白到大佬之路】

在这里插入图片描述

前言

write in the front:

  • 如何理解封装?
    试想:我们使用微波炉的时候,只用设置好时间,按下“开始”即可运作。作为一个产品的使用者,我们希望生产者能把最简单的接口暴露给我们,而至于微波炉按下开关后,内部是具体如何运作的,这些细节不用我们操心。“高内聚,低耦合”。节省使用者的学习成本和时间成本程序设计也是如此。同时,由于封装了内部细节,提供了对外的接口,作为使用者的我们无法直接随意对内部进行操作,保证了内部数据的安全.
    在这里插入图片描述

  • 封装是程序设计的第一原则,Java设计中有两种封装的体现:

    • 方法(函数):为了减少重复代码分解复杂操作,计算机引入了函数(子程序)的概念,Java中把这称为方法(Method).(【Java】保姆级讲解|从0到1学会方法及方法重载 ( 入门,包懂)).

接下来我们具体感受一下Java中的封装(主要是讲封装在上的体现):

目录

  • 前言
  • Part1:引入:
  • Part2:封装举例:
  • Part3:如何封装:
    • 3.1:private实现封装:
    • 3.2:getter&setter方法:
    • 3.3:总结:封装步骤:
    • 3.4:实际封装应用案例:
    • 3.5:补充:IDEA快速根据private生成getter()&setter
  • Part4:stetter()和构造器相结合
  • Part5:封装的意义/作用/好处
  • Part6:
    • 6.1:反思、深入
    • 6.2:补充:函数体现封装
    • 6.3:总结:

Part1:引入:

  • 我们用面向对象语言编程时会涉及到以下两个视角:

在这里插入图片描述

  • 类的实现者:实现类内部细节—微波炉内部设计者

  • 类的调用者:调用已有的类—微波炉的使用者

  • 封装的本质是不向类的调用者透露过多类的实现内容,只提供特定的接口,让类的调用者去使用类

我们在学习Java的时候经常会用到jdk-API文档,通过文档来查询某个类怎么使用:
在这里插入图片描述
此时我们的视角是:类的调用者,我们的目的是使用这个类,而不关注这个类的具体实现。这正是封装的体现。Java开发者实现了一些类,把这些类的具体实现内容(类的源码)封装,只向外提供一些(接口),方便类的调用者去直接使用(再不用看源码的情况下,能快速使用这个类)。

Part2:封装举例:

class Person{
    public String myName;
    public int age;
    public String sex;
}
public class TestDemo {
    public static void main(String[] args) {
        Person person1=new Person();
        person1.name=19;
    }
}

在这里插入图片描述

  • 假设类的实现者需要通过修改类的实现内容来升级功能:将name修改为myName:
class Person{
    private String myName = "yaoyao"//修改
    public int age;
    public String sex;
}
public class TestDemo {
    public static void main(String[] args) {
        Person person1=new Person();
        person1.myName=2000;//修改
    }
}

  • 结果/问题出现:
    • 由于类的实现者修改了类的实现,导致类的调用者不得也修改自己的代码-----高耦合、类的调用者使用类的成本增高–>程序复杂度过高,不便于维护(必须先学习源码,才可以使用)
    • 同时,直接公开属性,可能会由于类的调用者给属性赋值不合理的数据,导致属性错误/不合理–数据不安全
  • 解决—封装
    • 那么如何才能解决类的实现者在后期维护、修改的过程中,最大限度的不影响类的使用者呢(降低程序的复杂度)?以及保护属性数据的安全呢?----封装。

Part3:如何封装:

3.1:private实现封装:

  • java中利用private,public两个关键字搭配来实现封装
    • private:成员变量、成员方法被private修饰时,类的调用者无法访问&使用,只有在类内部可以访问&使用。(即,这些被封装起来的属性/行为,对于类的调用者来说是不可见的–无法直接访问&调用)。
    • private:成员变量、成员方法被public修饰时,类的调用者可以直接访问&使用。

🌇eg:

class Person{
    private String myName = "yaoyao"//修改
    private int age=19;
    private String sex="femal";
    public void show(){
    	System.out.println(myName+age+sex);
    }
}
public class TestDemo {
    public static void main(String[] args) {
        Person person1=new Person();
        person1.show();
    }
}
  • 这样形式是一个封装:将myName\age\sex封装起来了,无法通过对象直接访问,只可以通过一个公开的方法-show()来显示(只读不写)
  • 问题:属性被private修饰之后,调用者无法直接访问到属性,这样确实提高了可维护性、降低了耦合性,但是如何获取/修改被private修饰的属性呢?

3.2:getter&setter方法:

class Person{
    private String myName;
    public void setMyName(String name){//对外提供访问属性方法
    	this.myName = name;
    }
    public String getMyName(){//对外提供获取属性方法
    	return this.myName;
    }
}
public class TestDemo {
    public static void main(String[] args) {
        Person person1 = new Person();
        person1.setMyName("yaoyao");
        System.out.println(person1.getMyName());
    }
}
  • setter():设置公开setter方法,设置当前属性值
  • getter():设置公开getter方法,获取当前属性值.

📬Tips:

你可能会想,如果类的实现者修改了对外公开的属性/方法,这样不是同样会增加类的调用者的学习&使用成本嘛?
答: 一般类的设计都要求:类提供的 public 方法/属性能比较稳定–不频繁发生大的修改. 尤其是对于一些基础库中的类. 每次接口的变动都要仔细考虑兼容性问题

3.3:总结:封装步骤:

1. private修饰相应属性–属性私有化
2. 制作相对应公开的setter/getter方法

public void setXXX(参数列表){
	//验证传参是否合理
			...
	//合理即可赋值:
	属性 = 形参;
}
public void getXXX(){
	//权限判断
	return XXX;
}

3.4:实际封装应用案例:

public class Student(){
	private String name;//名字
	public static setName(String name){
		//对数据进行验证合理性
		if(name.length() >= 2 && name.length() <=10){
			this.name = name;
		}
		else{
			System.out.println("设置名字长度超过范围,未设置成功");
		}
	}
	public static getName(){
		return this.name;
	}
}
class Demo{
	public static void main (String[] args){
		Student student = new Student();
		//若传入这样不合理数据,则无法成功修改属性
		student.setName("hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh");
	}
}

3.5:补充:IDEA快速根据private生成getter()&setter

  • 鼠标右键选择generate(重构)/alt+insert
    在这里插入图片描述
  • 选择:
    在这里插入图片描述
    在这里插入图片描述
  • 即可生成:
    在这里插入图片描述

Part4:stetter()和构造器相结合

  • 【写法】:将setter写在构造器内部
  • 【作用】:保护属性数据安全
public class Student(){
	private String name;//名字
	public static setName(String name){
		//对数据进行验证合理性
		if(name.length() >= 2 && name.length() <=10){
			this.name = name;
		}
		else{
			System.out.println("设置名字长度超过范围,未设置成功");
		}
	}
	public static getName(){
		return this.name;
	}
	//构造器(本质:初始化数据)
	public Student(String name){
		setName(name);//直接在构造器内调用set方法
	}
}
class Demo{
	public static void main (String[] args){
		Student student = new Student("HHHHHHHHHHHHHHHhhhhhhhhhhhhhhhh");
	}

Part5:封装的意义/作用/好处

  • 安全性:用private隐藏内部细节(外部不能随意访问),对传入数据进行验证,保证安全合理。避免因为外部的无意修改,破坏内部数据—提高代码安全性
  • 复用性:这里是指使用类把属性、成员方法封装起来的封装。即,一旦类的实现者实现了一个类,下一次遇到同样的问题,不必再次写一遍,而是直接调用类实现者写好的代码即可—提高代码复用性。
  • 高内聚:隐藏类内部的实现细节,不允许外部干涉,便于后期维护------降低程序复杂度。
  • 低耦合:暴露少量接口供外部使用,且尽量方便。提高类使用者的学习成本、使用成本。便于协助、扩展。

Part6:

6.1:反思、深入

的确,我们谈到封装,可能最先想到的是类,并且封装在类上体现的学问、细节,确实很多。封装是一种思想,Java的函数本身是这种思想的明显体现。我的意思是,如果类中的属性都是public,我们仍然认为类是一种封装。但是如果只是单单的这样浅层次的封装,肯定会带来很多问题(如上文已经讲到的:安全性、使用成本…)

于是,我们需要更深层次的封装—上面Part所讲的,其实本质就是在类的基础上,再次封装(或许可以叫作套娃?)。

  • 可以这样理解:类是一个书包,封装了各种各样的文具、书(数据、对数据的操作)。—类的外层封装
  • 在书包中放个铅笔盒,专门用来放🖊,这个铅笔盒,我们叫作—封装在类中体现。本文大篇幅讲解的,其实是此封装!
  • public和private干嘛?
    • public修饰类:表示这个书包别人可以拿到(别人可以打开这个书包拉链)
    • public&private修饰方法/属性:封装类内部细节!private修饰属性,就相当于把数据封在铅笔盒中了,就算你拿到了书包并且打开,并不代表你可以打开铅笔盒获取铅笔!但是public修饰getter(),说明打开铅笔盒的操作是可以使用的。
      在这里插入图片描述

6.2:补充:函数体现封装

虽然类体现封装的确占大头,但是,函数(就是Java中的方法),也体现了封装,既然此文是讲封装,怎么能少的了我们的函数老爷呢?

  • 程序的构成
    程序由数据指令构成。大程序可以分为小程序,小程序可以再次细分—>子程序分而治之)。

    所有我们看到有些地方把函数也称为子程序。程序是数据,指令的集合。所以:函数也是封装的体现

6.3:总结:

通过上面,可以看到,其实程序本身就是封装,类、函数是封装中的封装…

总之,请记住:
封装是程序设计的第一原则, 类&方法是封装的不唯二体现。通过封装,我们才能站在更高层次思考问题


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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

[C++]反向迭代器

目录 前言&#xff1a; 1 对反向迭代器的构造思想 2 实现反向迭代器 3 完整代码 前言&#xff1a; 本篇文章主要介绍了STL容器当中的反向迭代器&#xff0c;可能有朋友会说&#xff1a;“反向迭代器有什么好学的&#xff1f;不一样还是迭代器吗&#xff0c;我正向能写出来&…

【js逆向】hook大全

▒ 目录 ▒&#x1f6eb; 导读需求1️⃣ 普通函数2️⃣ 对象方法&#xff08;Class.prototype&#xff09;3️⃣ 对象属性&#xff08;Object.defineProperty&#xff09;4️⃣ Proxy5️⃣ 批量hook示例&#x1f6ec; 文章小结&#x1f4d6; 参考资料&#x1f6eb; 导读 需求 …

【面试题系列】K8S常见面试题

目录 序言 问题 1. 简单说一下k8s集群内外网络如何互通的吧 2.描述一下pod的创建过程 3. 描述一下k8s pod的终止过程 4.Kubernetes 中的自动伸缩有哪些方式&#xff1f; 5.Kubernetes 中的故障检测有哪些方式&#xff1f; 6.Kubernetes 中的资源调度有哪些方式&#xff…

如何优雅的用POI导入Excel文件

在企业级项目开发中&#xff0c;要经常涉及excel文件和程序之间导入导出的业务要求&#xff0c;那么今天来讲一讲excel文件导入的实现。java实现对excel的操作有很多种方式&#xff0c;例如EasyExcel等&#xff0c;今天我们使用的是POI技术实现excel文件的导入。POI技术简介1.P…

全连接神经网络

目录 1.全连接神经网络简介 2.MLP分类模型 2.1 数据准备与探索 2.2 搭建网络并可视化 2.3 使用未预处理的数据训练模型 2.4 使用预处理后的数据进行模型训练 3. MLP回归模型 3.1 数据准备 3.2 搭建回归预测网络 1.全连接神经网络简介 全连接神经网络(Multi-Layer Percep…

基于Vue3和element-plus实现一个完整的登录功能

先看一下最终要实现的效果:登录页面:注册页面:(1)引入element-plus组件库引入组件库的方式有好多种,在这里我就在main.js全局引入了.npm i element-plus -Smain.js中代码:import { createApp } from "vue"; //element-plus import ElementPlus from "element-pl…

双指针 -876. 链表的中间结点-leetcode

开始一个专栏&#xff0c;写自己的博客 双指针&#xff0c;也算是作为自己的笔记吧&#xff01; 双指针从广义上来说&#xff0c;是指用两个变量在线性结构上遍历而解决的问题。狭义上说&#xff0c; 对于数组&#xff0c;指两个变量在数组上相向移动解决的问题&#xff1b;对…

「SAP ABAP」OPEN SQL(四)【FROM语句】

&#x1f482;作者简介&#xff1a; THUNDER王&#xff0c;一名热爱财税和SAP ABAP编程以及热爱分享的博主。目前于江西师范大学会计学专业大二本科在读&#xff0c;同时任汉硕云&#xff08;广东&#xff09;科技有限公司ABAP开发顾问。在学习工作中&#xff0c;我通常使用偏后…

女子举重问题

一、问题的描述 问题及要求 1、搜集各个级别世界女子举重比赛的实际数据。分别建立女子举重比赛总成绩的线性模型、幂函数模型、幂函数改进模型&#xff0c;并最终建立总冠军评选模型。 应用以上模型对最近举行的一届奥运会女子举重比赛总成绩进行排名&#xff0c;并对模型及…

【2023-03-10】JS逆向之美团滑块

提示&#xff1a;文章仅供参考&#xff0c;禁止用于非法途径 前言 目标网站:aHR0cHM6Ly9wYXNzcG9ydC5tZWl0dWFuLmNvbS9hY2NvdW50L3VuaXRpdmVsb2dpbg 页面分析 接口流程 1.https://passport.meituan.com/account/unitivelogin主页接口&#xff1a;需获取下面的参数&#xff0…

力扣刷题---初始链表1

&#x1f388;个人主页:&#x1f388; :✨✨✨初阶牛✨✨✨ &#x1f43b;推荐专栏: &#x1f354;&#x1f35f;&#x1f32f; c语言初阶 &#x1f511;个人信条: &#x1f335;知行合一 &#x1f349;本篇简介:>:讲解初始数据结构链表的三个力扣题 1.移除链表元素. 2.反转…

Visual Studio Code 1.76 发布

欢迎使用 Visual Studio Code 2023 年 2 月版&#xff0c;其中一些亮点包括&#xff1a; 配置文件 - 活动配置文件徽章&#xff0c;通过命令面板快速切换配置文件。辅助功能改进 - 新的音频提示&#xff0c;改进的终端屏幕阅读器模式。可移动的 Explorer 视图- 将资源管理器放…

JavaWeb——Request(请求)和Response(响应)介绍

在写servlet时需要实现5个方法&#xff0c;在一个service方法里面有两个参数request和response。 浏览器向服务器发送请求会发送HTTP的请求数据——字符串&#xff0c;这些字符串会被Tomcat所解析&#xff0c;然后这些请求数据会被放到一个对象(request)里面保存。 相应的Tom…

有图解有案例,我终于把 Condition 的原理讲透彻了

哈喽大家好&#xff0c;我是阿Q&#xff01; 20张图图解ReentrantLock加锁解锁原理文章一发&#xff0c;便引发了大家激烈的讨论&#xff0c;更有小伙伴前来弹窗&#xff1a;平时加解锁都是直接使用Synchronized关键字来实现的&#xff0c;简单好用&#xff0c;为啥还要引用Re…

React面向组件编程(理解与使用+state+props+refs与事件处理)

1 基本理解与使用 函数式组件 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"…

开发板与ubantu文件传送

接下来的所以实验都通过下面这种方式发送APP文件到开发板运行 目录 1、在ubantu配置 ①在虚拟机上添加一个桥接模式的虚拟网卡 ②设定网卡 ③在网卡上配置静态地址 2、开发板设置 ①查看网卡 ②配置网卡静态ip 3、 测试 ①ping ②文件传送 传送报错情况 配置环境&#…

Java Web 实战 14 - 计算机网络之初识计算机网络

初识计算机网络一 . 网络发展史二 . 局域网 VS 广域网2.1 交换机与路由器2.2 集线器三 . 网络通信基础3.1 协议3.1.1 OSI 七层模型3.1.2 TCP / IP 五层模型3.2 交换机和路由器的区别3.3 封装和分用大家好 , 这篇文章给大家分享的是计算机网络的一些基础知识 , 我们会给大家分享…

钉钉,下沉进农田

在这个古老的产业里&#xff0c;数字化没有被放到更高的位置&#xff0c;但难点依旧存在。钉钉恰是基于它足够柔性的产品特性和普惠的服务模式&#xff0c;真正帮助农食产业中的人和企业解决着过去一直没有解决的问题&#xff0c;让这个产业中的人和环节都向数字化潮水迈进了一…

linux目录——文件管理

个人简介&#xff1a;云计算网络运维专业人员&#xff0c;了解运维知识&#xff0c;掌握TCP/IP协议&#xff0c;每天分享网络运维知识与技能。座右铭&#xff1a;海不辞水&#xff0c;故能成其大&#xff1b;山不辞石&#xff0c;故能成其高。个人主页&#xff1a;小李会科技的…

CGAL 点云上采样

目录一、算法原理1、主要函数2、参数解析二、代码实现三、结果展示一、算法原理 该方法对点集进行逐步上采样&#xff0c;同时根据法向量信息来检测边缘点&#xff0c;需要输入点云具有法线信息。在点云空洞填充和稀疏表面重建中具有较好的应用。 1、主要函数 头文件 #inclu…