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

【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:总结:

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

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


相关文章:

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

博主简介&#xff1a;努力学习的预备程序媛一枚~博主主页&#xff1a; 是瑶瑶子啦所属专栏: Java岛冒险记【从小白到大佬之路】 前言 write in the front: 如何理解封装&#xff1f; 试想&#xff1a;我们使用微波炉的时候&#xff0c;只用设置好时间&#xff0c;按下“开始”…...

使用MobaXterm ssh远程登录Ubuntu 20.04

使用MobaXterm 远程登录Ubuntu 20.04 首先需要到官网下载一个MobaXterm 准备一台Ubuntu20.04的虚拟机。使用ifconfig查看IP 我这里的虚拟机是新安装的&#xff0c;所以会提示命令不存在&#xff0c;只要按照提示输入&#xff1a; sudo apt install net-tools接着等待安装完成…...

蓝桥杯历年真题训练

2012年第四届全国电子专业人才设计与技能大赛“自动售水机”设计任务书1. 系统框图接下来我们将任务分块&#xff1a; 1. 按键控制单元 设定按键 S7 为出水控制按键&#xff0c;当 S7 按下后&#xff0c;售水机持续出水&#xff08;继电器接通&#xff0c;指示 灯 L10 点亮&…...

Spring事务报错: org.springframework.transaction.UnexpectedRollbackException

异常信息&#xff1a;支持当前事务&#xff0c;如果不存在则抛出异常。事务被回滚&#xff0c;因为它被标记为仅回滚 org.springframework.transaction.UnexpectedRollbackException: Transaction rolled back because it has been marked as rollback-onlyat org.springframe…...

Spring:IOC和AOP

Spring&#xff1a;IOC和AOP一. IOC(1) 引入(2) 定义(3) 作用(4) 实现(5) DI依赖注入二. AOP(1) 概念(2) Spring中的AOP(3) 入门案例0. 准备&#xff1a;1. 定义通知类和通知方法&#xff1b;2. 在通知类中描述和定义切入点 pointcut3. 用注释绑定切入点和通知方法4. 通知类&am…...

【笔记】效率之门——Python中的函数式编程技巧

文章目录Python函数式编程1. 数据2. 推导式3. 函数式编程3.1. Lambda函数3.2. python内置函数3.3. 高阶函数4. 函数式编程的应用Python函数式编程 我的AI Studio项目&#xff1a;【笔记】LearnDL第三课&#xff1a;Python高级编程——抽象与封装 - 飞桨AI Studio (baidu.com) p…...

Java【多线程基础2】 Thread类 及其常用方法

文章目录前言一、Thread类1, 构造方法2, 常用成员属性3, 常用成员方法3.1, start 启动线程3.2, interrupt 中断线程 (重点)3.2.1, 手动设置标记位3.2.2, 使用内置标记位3.3.3, interrupt 方法 的作用3.3 sleep 休眠线程3.4, jion 等待线程3.5 获取当前线程的引用总结前言 各位读…...

JVM调优实战及常量池详解

目录 阿里巴巴Arthas详解 Arthas使用场景 Arthas使用 GC日志详解 如何分析GC日志 CMS G1...

ChatGPT研究分析:GPT-4做了什么

前脚刚研究了一轮GPT3.5&#xff0c;OpenAI很快就升级了GPT-4&#xff0c;整体表现有进一步提升。追赶一下潮流&#xff0c;研究研究GPT-4干了啥。本文内容全部源于对OpenAI公开的技术报告的解读&#xff0c;通篇以PR效果为主&#xff0c;实际内容不多。主要强调的工作&#xf…...

我为什么要写博客,写博客的意义是什么??

曾经何时我也不知道&#xff0c;怎样才能变成我自己所羡慕的大佬&#xff01;&#xff01;在一次次的CSDN阅读的过程中&#xff0c;结实了许多志同道合的人&#xff01;&#xff01;包过凉哥&#xff0c;擦姐……大佬&#xff0c;但是&#xff0c;很遗憾&#xff0c;与这些人只…...

ssm框架之spring:浅聊AOP

AOP&#xff08;Aspect Oriented Programming&#xff09;&#xff0c;是一种设计思想。先看一下百度百科的解释&#xff1a; 在软件业&#xff0c;AOP为Aspect Oriented Programming的缩写&#xff0c;意为&#xff1a;面向切面编程&#xff0c;通过预编译方式和运行期间动态…...

k8s详解

一、k8s中的yaml文件 JSON格式&#xff1a;主要用于api接口之间信息的传递YAML格式&#xff1a;主要用于配置和管理&#xff0c;YAML是一种简洁的非标记性语言&#xff0c;内容格式人性化 YAML格式&#xff1a; 大小写敏感使用缩进代表层级关系&#xff0c;不支持TAB制表符缩…...

计算机操作系统(第四版)第一章操作系统引论 1.1操作系统的目标和作用

第一章操作系统引论 1.1操作系统的目标和作用 什么是操作系统OS&#xff1f; 配置在计算机硬件上的第一层软件是对硬件的首次扩充。 是最重要的系统软件&#xff0c;其他系统软件应用软件都依赖于操作系统的支持。 操作系统主要作用&#xff1f; 管理计算机系统所有硬件设…...

git push解决办法: ! [remote rejected] master -> master (pre-receive hook declined)

项目经理远程创建了一个空项目&#xff0c;无任何内容&#xff0c;给我赋予的developer账号权限&#xff0c;本地改为后提交代码试了很多次都上传不上去&#xff0c;报错如下&#xff1a; ! [remote rejected] master -> master (pre-receive hook declined)先说结果&#x…...

jQuery 遍历方法总结

遍历方法有&#xff1a;1、add()&#xff0c;用于把元素添加到匹配元素的集合中&#xff1b;2、children()&#xff0c;用于返回被选元素的所有直接子元素&#xff1b;3、closest()&#xff0c;用于返回被选元素的第一个祖先元素&#xff1b;4、contents()&#xff0c;用于返回…...

OKHttp 源码解析(二)拦截器

游戏SDK架构设计之代码实现——网络框架 OKHttp 源码解析&#xff08;一&#xff09; OKHttp 源码解析&#xff08;二&#xff09;拦截器 前言 上一篇解读了OKHttp 的基本框架源码&#xff0c;其中 OKHttp 发送请求的核心是调用 getResponseWithInterceptorChain 构建拦截器链…...

如何修改设置浏览器内核模式

优先级&#xff1a; 强制锁定极速模式 >手动切换&#xff08;用户&#xff09;>meta指定&#xff08;开发者&#xff09;>浏览器兼容列表&#xff08;浏览器&#xff09; 需要用360安全浏览器14&#xff0c;chromium108内核&#xff0c;下载地址https://bbs.360.cn/t…...

30个Python常用小技巧

1、原地交换两个数字 1 2 3 4 x, y 10, 20 print(x, y) y, x x, y print(x, y) 10 20 20 10 2、链状比较操作符 1 2 3 n 10 print(1 < n < 20) print(1 > n < 9) True False 3、使用三元操作符来实现条件赋值 [表达式为真的返回值] if [表达式] else [表达式…...

ubuntu解决中文乱码

1、查看当前系统使用的字符编码 ~$ locale LANGen_US LANGUAGEen_US: LC_CTYPE"en_US" LC_NUMERIC"en_US" LC_TIME"en_US" LC_COLLATE"en_US" LC_MONETARY"en_US" LC_MESSAGES"en_US" LC_PAPER"en_US" …...

2022年全国职业院校技能大赛(中职组)网络安全竞赛试题——MYSQL安全测试解析(详细)

B-3任务三:MYSQL安全测试 *任务说明:仅能获取Server3的IP地址 1.利用渗透机场景kali中的工具确定MySQL的端口,将MySQL端口作为Flag值提交; 2.管理者曾在web界面登陆数据库,并执行了select <?php echo \<pre>\;system($_GET[\cmd\]); echo \</pre>\; ?…...

C++ map和unordered_map的区别

unordered_map 类模板和 map 类模板都是描述了这么一个对象&#xff1a;它是由 std::pair<const Key, value> 组成的可变长容器&#xff1b; 这个容器中每个元素存储两个对象&#xff0c;也就是 key - value 对。 1. unordered_map 在头文件上&#xff0c;引入 <unor…...

BCSP-玄子JAVA开发之JAVA数据库编程CH-04_SQL高级(二)

BCSP-玄子JAVA开发之JAVA数据库编程CH-04_SQL高级&#xff08;二&#xff09; 4.1 IN 4.1.1 IN 子查询 如果子查询的结果为多个值&#xff0c;就会导致代码报错解决方案就是使用 IN 关键字&#xff0c;将 替换成 IN SELECT …… FROM 表名 WHERE 字段名 IN (子查询);4.1.…...

学习java——②面向对象的三大特征

目录 面向对象的三大基本特征 封装 封装demo 继承 继承demo 多态 面向对象的三大基本特征 我们说面向对象的开发范式&#xff0c;其实是对现实世界的理解和抽象的方法&#xff0c;那么&#xff0c;具体如何将现实世界抽象成代码呢&#xff1f;这就需要运用到面向对象的三大…...

初阶数据结构 - 【单链表】

目录 前言&#xff1a; 1.概念 链表定义 结点结构体定义 结点的创建 2.链表的头插法 动画演示 代码实现 3.链表的尾插 动画演示 代码实现 4.链表的头删 动画演示 代码实现 5.链表的尾删 动画演示 代码实现 6.链表从中间插入结点 动画演示 代码实现 7.从单…...

第五周作业、第一次作业(1.5个小时)、练习一

一、创建servlet的过程没有太多好说的&#xff0c;唯一需要注意的就是&#xff1a;旧版本的servlet确实需要手动配置web.xml文件&#xff0c;但是servlet2.5以后,servlet的配置直接在Java代码中进行注解配置。我用的版本就不再需要手动去配置web.xml文件了&#xff0c;所以我只…...

【正点原子FPGA连载】 第三十三章基于lwip的tftp server实验 摘自【正点原子】DFZU2EG_4EV MPSoC之嵌入式Vitis开发指南

第三十三章基于lwip的tftp server实验 文件传输是网络环境中的一项基本应用&#xff0c;其作用是将一台电子设备中的文件传输到另一台可能相距很远的电子设备中。TFTP作为TCP/IP协议族中的一个用来在客户机与服务器之间进行文件传输的协议&#xff0c;常用于无盘工作站、路由器…...

蓝桥冲刺31天之316

如果生活突然向你发难 躲不过那就迎面而战 所谓无坚不摧 是能享受最好的&#xff0c;也能承受最坏的 大不了逢山开路&#xff0c;遇水搭桥 若你决定灿烂&#xff0c;山无遮&#xff0c;海无拦 A&#xff1a;特殊日期 问题描述 对于一个日期&#xff0c;我们可以计算出年份的各个…...

说一个通俗易懂的PLC工程师岗位要求

你到了一家新的单位&#xff0c;人家接了一套新的设备&#xff0c;在了解设备工艺流程之后&#xff0c;你就能决定用什么电气元件&#xff0c;至少95%以上电气原件不论你用过没用过都有把握拍板使用&#xff0c;剩下5%&#xff0c;3%你可以先买来做实验&#xff0c;这次不能用&…...

今年还能学java么?

“Java很卷”、“大家不要再卷Java了”&#xff0c;经常听到同学这样抱怨。但同时&#xff0c;Java的高薪也在吸引越来越多的同学。不少同学开始疑惑&#xff1a;既然Java这么卷&#xff0c;还值得我入行吗&#xff1f; 首先先给你吃一颗定心丸&#xff1a;现在选择Java依然有…...

ajax学习1

不刷新页面的情况下&#xff0c;向服务端发送请求&#xff0c;异步的js和XMLajax不是新的编程语言&#xff0c;只是把现有标准组合到一起使用的新方式...

企业如何做网站收款/男生最喜欢的浏览器推荐

13301 - 星号等腰三角形&#xff08;重要题型&#xff09; 时间限制 : 1 秒 内存限制 : 128 MB 输入一个正整数n&#xff0c;输出高为n的由*组成的等腰三角形。 输入 输入一个正整数 输出 输出高为n的由*组成的等腰三角形 样例 输入 3 输出 **** ***** 答案&#xff1a; …...

做个网站哪里可以做/网站推广的途径有哪些

ORACLE中数据字典视图分为3大类&#xff0c;用前缀区别&#xff0c;分别为&#xff1a;USER&#xff0c;ALL 和 DBA&#xff0c;许多数据字典视图包含相似的信息。 USER_*:有关用户所拥有的对象信息&#xff0c;即用户自己创建的对象信息 ALL_*&#xff1a;有关用户可以访问的…...

中学生网站源码/媒体宣传推广方案

硬件工程师跟结构工程师交互的文件&#xff0c;就只有结构图了&#xff0c;也就是PCB板框&#xff0c;这类文件一般是由AutoCAD导出的DWG、DXF文件&#xff0c;当然&#xff0c;也有只给你3D图的&#xff08;如SolidWorks、Pro-E等&#xff09;&#xff0c;让你自己导。 这里以…...

做网站需要上门服务吗/表白网页制作免费网站制作

0x00 前言 为了练习python&#xff0c;强迫自己能用Python的题都用python解题还有各种密码 0x01 奇怪的字符串 实验吧题目&#xff1a;信息保密的需求和实际操作自古有之&#xff0c;与之相应的信息加密与解密也是历史悠久&#xff0c;现有一段经过古典密码理论&#xff08;不止…...

邢台网站建设服务周到/凡科建站

【2018.02】劳特利奇国防研究手册&#xff08;第一版&#xff09;Routledge Handbook of Defence Studies&#xff0c;共412页。 如果需要电子版&#xff0c;请联系QQ&#xff1a;3042075372。 Routledge是英国的一家跨国出版社&#xff0c;总部设在伦敦&#xff0c;主要在伦敦…...

龙岗区最新通告/提高seo关键词排名

goldengate for sqlserver 日志暴涨的解决办法 gg for sqlserver 2008 R2 开启后&#xff0c;sqlserver的日志会出现暴涨的情况&#xff0c;解决办法如下&#xff1a; 1.先确认是否数据库设置问题导致 如&#xff1a; 1)查看ggerror中&#xff0c;是否有报错&#xff01; 2)…...