7.8 封装详解

7.8 封装详解

就是把东西装进箱子里,只留一个口,比如我们看电视的时候我们只用遥控器换一个台就行了,不需要知道电视里面是怎么构造的,电视机使用的厂家为了使用方便就把电视机内部的组件全部封装在了壳子里,只给我们暴露出一个开关和换台。

  • 该露的露,该藏得藏:
    • 我们程序设计要追求高内聚,低耦合。高内聚就是类的内部数据操作细节自己完成,不允许外部干涉,比如银行里面的总钱数是由银行人员操作的不需要每个人都去操作,而每个个人都只操作自己的账户即可;低耦合:仅暴露少量的方法给外部使用,比如都是去取钱,能取钱的都是银行的一些普通用户就可以,而这些人是不能去操作那些钱的,不能把银行的钱借给别人,只能操作自己卡上的钱,也就是说方法是有限的。
  • 封装(数据的隐藏)
    • 通常,应禁止直接访问一个对象中的数据的实际表示,而应通过操作接口来访问,这称为信息隐藏
  • 记住这句话就够了:属性私有,get/set

封装大多数是针对属性的,对于方法用的比较少

封装的核心就是私有,也就是关键字Private

get,set方法就是提供一些可以操作这个属性的方法,由于这些属性变得私有了,外部的人即使是new了这个对象,也不能去用这些属性。所以就需要提供一些public的get或者set方法。

get:就是获得这个数据或者属性

set:就是给这个属性设置值

这里不直接操作属性,而是通过一些外部可以调用的方法进行操作。

注意:

  1. 属性私有的时候一般都是用Private关键字进行修饰。

  2. 在IDEA中使用alt+insert可以自动生成get/set方法

    快捷键

  3. 属性私有的意义在于

    1. **提高程序的安全性,**可以对属性进行数据赋值合法性进行安全性检查,可以利用封装的set方法进行一些安全性的检查,也就是可以通过内部的封装让我们的程序变得更安全。可以避免有些人破坏程序系统
    2. 可以隐藏代码的实现细节,如示例中用户只能设置年龄,而里面的合法性判断实现用户是看不到的,作为一个调用者,根本不知道类里面是如何实现的。
    3. 可以统一接口
    4. 提高了系统的可维护性,良好的封装便于我们修改内部代码,提高程序的可维护性
  4. 也就是只用记住封装就是属性私有、get/set方法,我们可以在set方法中增加安全性判断。

  5. 一般情况下get/set很少用重载,大部分的重载都是在构造器中使用的

  6. 在平时看源码的时候,可以多看一些重载的方法,在Java中判断一个类的两个方法是否相同,主要就参考1.方法名,2.参数列表

封装实例

package com.baidu.www.oop.demo04;
public class Student {//属性私有,也就是加上一个private关键字//名字private String name;//学号private int id;//性别private char sex;//年龄private int age;//get,set方法就是提供一些可以操作这个属性的方法//get:就是获得这个数据或者属性public String getName(){return this.name;}//set:就是给这个属性设置值,而设置值的方法返回值可以为空public void setName(String name){this.name = name;}public int getId() {return id;}public void setId(int id) {this.id = id;}public int getAge() {return age;}//属性私有的意义在于可以对属性进行数据赋值合法性进行安全性检查,可以利用封装的set方法进行一些安全性的检查public void setAge(int age) {if(age>120 || age <0){this.age=3;}else {this.age = age;}}//学习()//睡觉()
}

主程序实例

package com.baidu.www.oop;import com.baidu.www.oop.demo04.Student;public class Application {public static void main(String[] args) {Student s1 = new Student();String name = s1.getName();System.out.println(name);System.out.println(s1.getName());s1.setName("肆悟先生");System.out.println(name);System.out.println(s1.getName());s1.setAge(35);System.out.println(s1.getAge());}
}

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

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

相关文章

今天学前端,还能高薪就业吗?

大学毕业3年后&#xff0c;我坚定的选择来黑马转行学前端&#xff0c;实现我的高起点就业&#xff01;希望我的一些学习和工作感悟能对学弟学妹们有所帮助。 学科 | HTML&JS前端 校区 | 武汉 薪资 | 12k 黑马程序员的学弟、学妹们大家好&#xff01;我是张同学。 选择黑…

【前端 | CSS】5种经典布局

页面布局是样式开发的第一步&#xff0c;也是 CSS 最重要的功能之一。 常用的页面布局&#xff0c;其实就那么几个。下面我会介绍5个经典布局&#xff0c;只要掌握了它们&#xff0c;就能应对绝大多数常规页面。 这几个布局都是自适应的&#xff0c;自动适配桌面设备和移动设备…

java版直播商城平台规划及常见的营销模式 电商源码/小程序/三级分销+商城免费搭建 bbcbbc

​ Java版工程项目管理系统 Spring CloudSpring BootMybatisVueElementUI前后端分离 1. 涉及平台 平台管理、商家端&#xff08;PC端、手机端&#xff09;、买家平台&#xff08;H5/公众号、小程序、APP端&#xff08;IOS/Android&#xff09;、微服务平台&#xff08;业务服务…

备忘录模式(C++)

定义 在不破坏封装性的前提下&#xff0c;捕获一-个对象的内部状态&#xff0c;并在该对象之外保存这个状态。这样以后就可以将该对象恢复到原先保存的状态。 应用场景 ➢在软件构建过程中&#xff0c;某些对象的状态在转换过程中&#xff0c;可能由于某种需要&#xff0c;要…

Win10的日历软件中怎么新增日程安排及提醒?

在经济发展加速的时代&#xff0c;职场中做好时间管理的重要性不言而喻&#xff0c;而想要在工作中做好时间管理&#xff0c;关键在于按时完成每项日程安排。所以每天在使用win10电脑办公时新增日程安排并设置提醒不仅是非常有必要的&#xff0c;而且是提高效率和生活质量的重要…

我开源的 c#+wpf 模仿网易云音乐播放器

MusicApp 介绍 gitee地址&#xff1a;https://gitee.com/liu_guo_feng/music-app 我开源的 c#wpf 模仿网易云音乐播放器 项目页面功能完成列表 首页(待完善) 每日推荐音乐 歌单详情 带播放列表 歌词页(待完善) 换肤功能(待完善) 系统托盘 … 预览 仅供学习使用 不作任何商业用…

4.6 Dropout(暂退法)缓解过拟合详解

一.什么是Dropout(暂退法)? 在前向传播过程中&#xff0c;计算每⼀内部层的同时注⼊噪声&#xff0c;这种方法被称为暂退法(dropout)。特点 • 暂退法在前向传播过程中&#xff0c;计算每⼀内部层的同时丢弃⼀些神经元。 • 暂退法可以避免过拟合&#xff0c;它通常与控制权…

机器学习笔记:李宏毅ChatGPT:生成式学习的两种策略

1 策略1 “各个击破”——autoregressive model “各个击破”——一个一个生成出来 2 策略2 &#xff1a; “一次到位”——non-autoregressve model 一步到位&#xff0c;全部生成出来 2.1 non-autoregressive model 如何确定长度&#xff1f; 两种策略 策略1&#xff1a;始…

Swagger技术-自动生成测试接口

简介 前端资源和后端资源分开&#xff0c;前端通过nginx运行&#xff0c;后端通过tomcat运行 前端技术框架&#xff1a; Swagger 作用&#xff1a;生成各种样式的接口文档&#xff0c;以及在线接口调试页面等 kinfe4j是基于mvc框架继承swagger生成api文档的增强解决方案 …

YOLO相关原理(文件结构、视频检测等)

超参数进化(hyperparameter evolution) 超参数进化是一种使用了genetic algorithm&#xff08;GA&#xff09;遗传算法进行超参数优化的一种方法。 YOLOv5的文件结构 images文件夹内的文件和labels中的文件存在一一对应关系 激活函数&#xff1a;非线性处理单元 activation f…

添加@Transactional事务

1. 在启动类上新增开启注解功能 EnableTransactionManagement EnableTransactionManagement //开启事务注解功能 SpringBootApplication public class Application {public static void main(String[] args) {SpringApplication.run(Application.class, args);} } 2. 方法上…

python优雅地爬虫

申明&#xff1a;仅用作学习用途&#xff0c;不提供任何的商业价值。 背景 我需要获得新闻&#xff0c;然后tts&#xff0c;在每天上班的路上可以听一下。具体的方案后期我也会做一次分享。先看我喜欢的万能的老路&#xff1a;获得html内容-> python的工具库解析&#xff0…