Kaleldo

本来对博客持有一种如果别人写过那么再写就没有意义的想法,想看的时候看别人的写好的文章不就好了吗?最近明白了,写博客也是一种学习,哪怕与人雷同哪怕千篇一律,只要自己动手,有所收获就不亏。如果还能帮到其他小伙伴,那就更好。

  • 主页
  • 类别
所有文章 关于我 个人作品

Kaleldo

本来对博客持有一种如果别人写过那么再写就没有意义的想法,想看的时候看别人的写好的文章不就好了吗?最近明白了,写博客也是一种学习,哪怕与人雷同哪怕千篇一律,只要自己动手,有所收获就不亏。如果还能帮到其他小伙伴,那就更好。

  • 主页
  • 类别

java提高篇(一)—–理解java的三大特性之封装

2019-02-16

三大特性之—封装

封装从字面上来理解就是包装的意思,专业点就是信息隐藏,是指利用抽象数据类型将数据和基于数据的操作封装在一起,使其构成一个不可分割的独立实体,数据被保护在抽象数据类型的内部,尽可能地隐藏内部的细节,只保留一些对外接口使之与外部发生联系。系统的其他对象只能通过包裹在数据外面的已经授权的操作来与这个封装的对象进行交流和交互。也就是说用户是无需知道对象内部的细节(当然也无从知道),但可以通过该对象对外的提供的接口来访问该对象。

对于封装而言,一个对象它所封装的是自己的属性和方法,所以它是不需要依赖其他对象就可以完成自己的操作。

使用封装有三大好处:

   1、良好的封装能够减少耦合。

   2、类内部的结构可以自由修改。

   3、可以对成员进行更精确的控制。

   4、隐藏信息,实现细节。

首先我们先来看两个类:Husband.java、Wife.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
public class Husband {

/*
* 对属性的封装
* 一个人的姓名、性别、年龄、妻子都是这个人的私有属性
*/
private String name ;
private String sex ;
private int age ;
private Wife wife;

/*
* setter()、getter()是该对象对外开发的接口
*/
public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public String getSex() {
return sex;
}

public void setSex(String sex) {
this.sex = sex;
}

public int getAge() {
return age;
}

public void setAge(int age) {
this.age = age;
}

public void setWife(Wife wife) {
this.wife = wife;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
public class Wife {
private String name;
private int age;
private String sex;
private Husband husband;

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public String getSex() {
return sex;
}

public void setSex(String sex) {
this.sex = sex;
}

public void setAge(int age) {
this.age = age;
}

public void setHusband(Husband husband) {
this.husband = husband;
}

public Husband getHusband() {
return husband;
}

}

从上面两个实例我们可以看出Husband里面wife引用是没有getter()的,同时wife的age也是没有getter()方法的。至于理由我想各位都懂的,男人嘛深屋藏娇妻嘛,没有那个女人愿意别人知道她的年龄。

所以封装把一个对象的属性私有化,同时提供一些可以被外界访问的属性的方法,如果不想被外界方法,我们大可不必提供方法给外界访问。但是如果一个类没有提供给外界访问的方法,那么这个类也没有什么意义了。比如我们将一个房子看做是一个对象,里面的漂亮的装饰,如沙发、电视剧、空调、茶桌等等都是该房子的私有属性,但是如果我们没有那些墙遮挡,是不是别人就会一览无余呢?没有一点儿隐私!就是存在那个遮挡的墙,我们既能够有自己的隐私而且我们可以随意的更改里面的摆设而不会影响到其他的。但是如果没有门窗,一个包裹的严严实实的黑盒子,又有什么存在的意义呢?所以通过门窗别人也能够看到里面的风景。所以说门窗就是房子对象留给外界访问的接口。

通过这个我们还不能真正体会封装的好处。现在我们从程序的角度来分析封装带来的好处。如果我们不使用封装,那么该对象就没有setter()和getter(),那么Husband类应该这样写:

1
2
3
4
5
6
public class Husband {
public String name ;
public String sex ;
public int age ;
public Wife wife;
}

我们应该这样来使用它:

1
2
3
4
Husband husband = new Husband();
husband.age = 30;
husband.name = "张三";
husband.sex = "男"; //貌似有点儿多余

但是那天如果我们需要修改Husband,例如将age修改为String类型的呢?你只有一处使用了这个类还好,如果你有几十个甚至上百个这样地方,你是不是要改到崩溃。如果使用了封装,我们完全可以不需要做任何修改,只需要稍微改变下Husband类的setAge()方法即可。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public class Husband {

/*
* 对属性的封装
* 一个人的姓名、性别、年龄、妻子都是这个人的私有属性
*/
private String name ;
private String sex ;
private String age ; /* 改成 String类型的*/
private Wife wife;

public String getAge() {
return age;
}

public void setAge(int age) {
//转换即可
this.age = String.valueOf(age);
}

/** 省略其他属性的setter、getter **/

}

其他的地方依然那样引用(husband.setAge(22))保持不变。

到了这里我们确实可以看出,封装确实可以使我们容易地修改类的内部实现,而无需修改使用了该类的客户代码。

我们在看这个好处:可以对成员变量进行更精确的控制。

还是那个Husband,一般来说我们在引用这个对象的时候是不容易出错的,但是有时你迷糊了,写成了这样:

1
2
Husband husband = new Husband();
husband.age = 300;

也许你是因为粗心写成了,你发现了还好,如果没有发现那就麻烦大了,逼近谁见过300岁的老妖怪啊!

但是使用封装我们就可以避免这个问题,我们对age的访问入口做一些控制(setter)如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
public class Husband {

/*
* 对属性的封装
* 一个人的姓名、性别、年龄、妻子都是这个人的私有属性
*/
private String name ;
private String sex ;
private int age ; /* 改成 String类型的*/
private Wife wife;

public int getAge() {
return age;
}

public void setAge(int age) {
if(age > 120){
System.out.println("ERROR:error age input...."); //提示錯誤信息
}else{
this.age = age;
}

}

/** 省略其他属性的setter、getter **/

}

上面都是对setter方法的控制,其实通过使用封装我们也能够对对象的出口做出很好的控制。例如性别我们在数据库中一般都是已1、0方式来存储的,但是在前台我们又不能展示1、0,这里我们只需要在getter()方法里面做一些转换即可。

1
2
3
4
5
6
7
8
9
10
11
12
public String getSexName() {
if("0".equals(sex)){
sexName = "女";
}
else if("1".equals(sex)){
sexName = "男";
}
else{
sexName = "人妖???";
}
return sexName;
}

在使用的时候我们只需要使用sexName即可实现正确的性别显示。同理也可以用于针对不同的状态做出不同的操作。

1
2
3
4
5
6
7
8
9
public String getCzHTML(){
if("1".equals(zt)){
czHTML = "<a href='javascript:void(0)' onclick='qy("+id+")'>启用</a>";
}
else{
czHTML = "<a href='javascript:void(0)' onclick='jy("+id+")'>禁用</a>";
}
return czHTML;
}
  • java提高
  • java提高

扫一扫,分享到微信

微信分享二维码
treegrid.js BootstrapTable进行封装
使用Ajax向服务端传送form表单数据 文件上传
  1. 1. 三大特性之—封装
© 2020 Kaleldo
Hexo Theme Yilia by aha
  • 所有文章
  • 关于我
  • 个人作品

tag:

  • 多线程
  • 多线程基础
  • springBoot
  • 过滤器和拦截器
  • vue
  • Java中的锁
  • Lock接口
  • 容器源码分析2
  • 队列同步器
  • 个人作品
  • iwiilsay后台前端
  • iwiilsay小程序
  • 数据结构与算法
  • 仿土巴兔小程序
  • 模运算优化
  • Java性能优化
  • Linux
  • spring 使用属性文件
  • Java基础
  • JSON
  • 错误解决
  • java提高
  • lambda
  • layui
  • 递归处理返回数据
  • AJAX
  • 文件上传
  • 事务
  • Mybatis
  • sql打印拦截器
  • 集成Swagger在线调试
  • 轻松搞定数据验证(一)
  • 轻松搞定数据验证(二)
  • 项目总结
  • 项目分析
  • mybatis
  • git
  • docker
  • linux
  • 虚拟机
  • 接口文档
  • yapi
  • Docker
  • IDEA
  • js
  • spring4
  • ActiveMQ
  • 延时队列
  • MAVEN
  • IM
  • 腾讯云
  • maven
  • Linux常用命令
  • Mysql常用命令
  • hexo
  • 开源项目
  • Java多线程
  • Java序列化
  • VUE
  • 网络基础
  • 前端
  • 安全
  • 平时积累
  • 进阶
  • 启动和终止线程
  • 线程应用实例
  • 线程间通信
  • 微课堂
  • 设计模式
  • SpringDataJpa
  • 使用Spring Cache集成Redis
  • 通用Mapper与分页插件的集成
  • 轻松搞定全局异常
  • 容器

    缺失模块。
    1、请确保node版本大于6.2
    2、在博客根目录(注意不是yilia根目录)执行以下命令:
    npm i hexo-generator-json-content --save

    3、在根目录_config.yml里添加配置:

      jsonContent:
        meta: false
        pages: false
        posts:
          title: true
          date: true
          path: true
          text: false
          raw: false
          content: false
          slug: false
          updated: false
          comments: false
          link: false
          permalink: false
          excerpt: false
          categories: false
          tags: true
    

  • 数据链路层

    2020-08-31

    #网络基础

  • 网络层

    2020-08-31

    #网络基础

  • java将秒值转换为日期格式,或转为日时分秒

    2020-06-08

    #项目总结

  • docker常用脚本

    2020-06-01

    #项目总结

  • 使用vue-video-player做H5直播播放

    2020-06-01

    #VUE

  • 花里胡哨的Java序列化机制

    2020-04-07

    #Java序列化

  • JUC之花里胡哨Exchanger

    2020-03-26

    #多线程

  • JUC之花里胡哨CyclicBarrier

    2020-03-25

    #Java多线程

  • JUC之花里胡哨CountDownLatch

    2020-03-24

    #Java多线程

  • Java花里胡哨的内存模型

    2020-03-24

    #多线程

  • SpringCloudDemo使用说明

    2020-03-12

    #开源项目

  • IDEA简单将hexo打包为可运行镜像

    2020-03-06

    #Docker#hexo

  • Mysql常用命令

    2020-02-25

    #项目总结#Mysql常用命令

  • Linux常用命令

    2020-02-25

    #项目总结#Linux常用命令

  • Docker入门手册

    2020-02-25

    #项目总结

  • IDEA花里胡哨地安全连接到Docker(CA认证方式防止挖矿程序xmrig入侵)

    2019-12-29

    #springBoot#Docker#IDEA

  • vue基础

    2019-12-27

    #vue

  • JSON.stringify()和JSON.parse()的作用

    2019-12-27

    #js

  • 腾讯云通信im服务端花里胡哨实战

    2019-12-27

    #IM#腾讯云

  • 花里胡哨操作maven私服

    2019-12-27

    #Docker#IDEA#maven

  • Spring 花里胡哨的@Import用法

    2019-12-27

    #springBoot#IDEA#spring4

  • spring boot 花里胡哨的热部署(DevTools)

    2019-12-27

    #springBoot#Docker#IDEA

  • Centos7部署yapi

    2019-12-27

    #虚拟机#接口文档#yapi

  • maven私服,花里胡哨的搭建

    2019-12-27

    #虚拟机#Docker#MAVEN

  • IDEA中花里胡哨地使用Docker

    2019-12-27

    #虚拟机#Docker#IDEA

  • docker花里胡哨搭建ActiveMQ及启用延时队列

    2019-12-27

    #Docker#ActiveMQ#延时队列

  • 花里胡哨地使用MQ定时推送消息到直播房间

    2019-12-27

    #Docker#ActiveMQ#延时队列

  • docker花里胡哨的网络配置

    2019-10-16

    #docker

  • 工作中一些docker花里胡哨使用总结

    2019-10-15

    #docker

  • 工作中常用的cat命令

    2019-10-15

    #linux

  • git工作中常用命令

    2019-10-15

    #git

  • mybatis where 中遇到传入集合参数问题

    2019-10-14

    #mybatis

  • 编程提升

    2019-10-08

    #项目总结

  • 项目需求分析(付费会员,超级领主)

    2019-10-08

    #项目分析

  • Centos7部署yapi

    2019-10-08

    #项目总结

  • Ajax跨域请求,同时保证session一致

    2019-04-17

    #springBoot

  • 轻松搞定数据验证(二)

    2019-02-19

    #springBoot#轻松搞定数据验证(二)

  • 轻松搞定数据验证(一)

    2019-02-19

    #springBoot#轻松搞定数据验证(一)

  • 轻松搞定全局异常

    2019-02-19

    #springBoot#轻松搞定全局异常

  • 定时任务详解

    2019-02-19

    #springBoot

  • 集成Swagger在线调试

    2019-02-18

    #springBoot#集成Swagger在线调试

  • 使用Spring Cache集成Redis

    2019-02-18

    #springBoot#使用Spring Cache集成Redis

  • 整合Lettuce Redis

    2019-02-18

    #springBoot

  • 通用Mapper与分页插件的集成

    2019-02-18

    #springBoot#通用Mapper与分页插件的集成

  • 整合SpringDataJpa

    2019-02-17

    #springBoot#SpringDataJpa

  • JSON.stringify出现Converting circular structure to JSON

    2019-02-16

    #JSON#错误解决

  • 菜单管理 解决表单回显

    2019-02-16

    #springBoot

  • layui 使用弹窗功能及树控件

    2019-02-16

    #layui

  • layui 引入插件

    2019-02-16

    #layui

  • layui 使用layui 扩展组件 dtree

    2019-02-16

    #layui

  • layui dtree 树形组件 elem和obj的区别 目的解决了弹窗关闭后再打开出现空白树

    2019-02-16

    #layui

  • layui dtree 树形组件使用递归处理返回数据

    2019-02-16

    #layui#递归处理返回数据

  • JAVA中分为基本数据类型及引用数据类型

    2019-02-16

    #Java基础

  • layui 弹出层复选框反选数据

    2019-02-16

    #layui

  • treegrid.js BootstrapTable进行封装

    2019-02-16

    #前端

  • java提高篇(一)—–理解java的三大特性之封装

    2019-02-16

    #java提高

  • 使用Ajax向服务端传送form表单数据 文件上传

    2019-02-16

    #AJAX#文件上传

  • layero是什么意思 虚拟dom 解决弹出框虚拟dom找不到,树无法加载

    2019-02-16

    #错误解决

  • 使用Bootstrap modal(模态窗)关闭后layui无法渲染表单

    2019-02-16

    #错误解决

  • 记录自己理解的一些设计模式

    2019-02-16

    #设计模式

  • 配置 sql打印拦截器

    2019-02-16

    #Mybatis#sql打印拦截器

  • layui 表单验证

    2019-02-16

    #layui

  • layui 表单验证 2 验证判重

    2019-02-16

    #springBoot#layui

  • lambda表达式 解决ids删除

    2019-02-16

    #springBoot#lambda

  • 对事务进行开启

    2019-02-16

    #springBoot#事务

  • 使用属性文件

    2019-01-31

    #spring 使用属性文件

  • 【Linux 从入门到精通】

    2019-01-31

    #Linux

  • 微课堂网页在线编程助手

    2019-01-30

    #个人作品#微课堂

  • iwiilsay后台前端

    2019-01-30

    #个人作品#iwiilsay后台前端

  • iwiilsay小程序

    2019-01-30

    #个人作品#iwiilsay小程序

  • 仿土巴兔小程序

    2019-01-30

    #个人作品#仿土巴兔小程序

  • 『数据结构与算法』—— 复杂度

    2019-01-30

    #数据结构与算法

  • 模运算优化

    2019-01-30

    #模运算优化#Java性能优化

  • 容器源码分析2

    2019-01-29

    #容器源码分析2

  • 容器源码分析

    2019-01-29

    #容器

  • 队列同步器

    2019-01-29

    #Java中的锁#队列同步器

  • Lock接口

    2019-01-29

    #Java中的锁#Lock接口

  • 线程应用实例

    2019-01-29

    #多线程#线程应用实例

  • 线程间通信

    2019-01-29

    #多线程#线程间通信

  • 启动和终止线程

    2019-01-28

    #多线程#启动和终止线程

  • Daemon线程

    2019-01-28

    #多线程#多线程基础

  • 线程的状态

    2019-01-28

    #多线程#多线程基础

  • 线程优先级

    2019-01-28

    #多线程#多线程基础

  • 双重检查锁定与延迟初始化

    2019-01-28

    #多线程

  • 初始化vue项目指令

    2019-01-28

    #vue

  • mybatis使用拦截器打印sql

    2019-01-28

    #springBoot

  • springBoot整合mybatis及poi注解导出控制台输出sql语句

    2019-01-28

    #springBoot

  • Spring Boot中使用过滤器和拦截器

    2019-01-28

    #springBoot#过滤器和拦截器

  • 反击爬虫,前端工程师的脑洞可以有多大?

    2019-01-25

    #前端#安全

  • 『数据结构与算法』—— 排序-冒泡&选择&插入

    2018-12-01

    #数据结构与算法#平时积累#进阶

  • 『数据结构与算法』—— 递归

    2018-11-21

    #数据结构与算法#平时积累#进阶

  • 『数据结构与算法』—— 队列

    2018-11-06

    #数据结构与算法#平时积累#进阶

  • 『数据结构与算法』—— 栈

    2018-10-15

    #数据结构与算法#平时积累#进阶

  • 『数据结构与算法』—— 链表

    2018-10-03

    #数据结构与算法#平时积累#进阶

  • 『数据结构与算法』—— 数组

    2018-09-25

    #数据结构与算法#平时积累#进阶

  • 『数据结构与算法』—— 复杂度

    2018-09-01

    #数据结构与算法#平时积累#进阶

  • 反击爬虫,前端工程师的脑洞可以有多大?

    2017-07-09

    #前端#安全

  • SpringCloud学习过程
  • SpringBoot日常总结
  • 码云地址
  • 仿土巴兔小程序
  • iwiilsay
  • iwiilsay后台前端(基于vue,vue-router,element-ui)
  • 微课堂
  • to8to后台前端
  • to8toJavaDev(java后台代码)
  • 京西商城
  • java多线程知识冲顶(基于thinkphp5,包含微信小程序,后台)
  • mybatis-puls生成工具
Kaleldo

热爱生活

本来对博客持有一种如果别人写过那么再写就没有意义的想法,想看的时候看别人的写好的文章不就好了吗?最近明白了,写博客也是一种学习,哪怕与人雷同哪怕千篇一律,只要自己动手,有所收获就不亏。如果还能帮到其他小伙伴,那就更好!
年轻无为,卖马为生。