封装概述:

封装是指隐藏对象的属性和实现细节,仅对外提供公共访问方式

这是什么意思呢?

简单的来说就是我将不想给别人看的数据,以及别人无需知道的内部细节, “锁起来” ,我们只留下一些入口,使其与外部发生联系。

我们如何给我们的数据 “上锁” 呢?

我们使用,public、private、protected 等权限修饰符 在类的内部设定了边界,这些不同程度的 ”锁“ 决定了紧跟其后被定义的东西能够被谁使用。

封装的好处:

· 隐藏实现细节,提供公共的访问方式

· 提高了代码的复用性

· 提高安全性

封装好处的体现方式:

(一)隐藏实现细节,提供公共的访问方式

隐藏实现细节怎么理解呢?

我们将一些功能封装到类中,而客户端的程序员,不需要知道类中的这个方法的逻辑原理,类程序员只需要给他一个对外的接口,客户端程序员只需要能够调用这个方法即可,

例如:夏天宿舍很热,我们(用户)只需要操作遥控器即可使用空调,并不需要了解空调内部是如何运行的

提供公共的访问方式又怎么理解呢?

我们先来看一段标准案例

public class Student {
//定义成私有成员变量(private)
private String name;
private int age; //无参构造
public Student() {
super();
} //带参构造
public Student(String name, int age) {
super();
this.name = name;
this.age = age;
} //成员变量的set和get方法(与外界联系的桥梁)
public void setName(String name) {
this.name = name;
} public String getName() {
return name;
} public void setAge(int age) {
this.age = age;
} public int getAge() {
return age;
}
}
public class StudentDemo {
public static void main(String[] args) {
//创建学生类对象 s
Student s = new Student(); //对象s调用类中的公共方法setName()和setAge()
//set方法给成员变量赋值
s.setName("BWH_Steven");
s.setAge(20); //get方法获取成员变量
System.out.println(s.getName() + s.getAge());
}
}

我们可以看到在上面的案例中,成员变量都使用private修饰,而下面的get和set方法均使用了public修饰,其实被private修饰的属性就是我们想要锁起来的数据,而set、get方法就是我们打开这把锁的钥匙

被private所修饰的内容是,除类型创建者和类型的内部方法之外的任何人都不能访问的元素,所以我们这些数据就被我们通过private “锁” 了起来,而我们外界是可以通过创建对象来调用一个类中的公共方法的,所以被public修饰的 set和get方法外界所能访问的,而这两个方法又可以直接访问我们的私有成员变量,所以set和get方法就成为了私有成员与外界沟通的钥匙。

(二)提高了代码的复用性

功能被封装成了类,通过基类与派生类之间的一些机制(组合和继承),来提高代码的复用性

Ps:关于代码复用问题,我会专篇讲解,今天还是着重讲解封装带来的主要好处

(三)提高安全性

看完上面的代码,可能大家会有一点疑惑,这些属性、方法封装后我都还可以看得到,这哪里体现了安全呢?大家来一起看一看我们下面这个改进版的案例

public class Student {

    private String name;
private int age; public Student() {
super();
} public Student(String name, int age) {
super();
this.name = name;
this.age = age;
} public void setName(String name) {
this.name = name;
} public String getName() {
return name;
} //在setAge()方法中加入了校验的内容
//不合法数据是不允许传递给成员变量的
public void setAge(int age) {
if (age < 0 || age > 120) {
System.out.println("Error");
}else {
this.age = age;
}
} public int getAge() {
return age;
}
}
public class StudentDemo {
public static void main(String[] args) {
Student s = new Student();
System.out.println(s.getName() + s.getAge()); //错误的方式!!!
s.name = "BWH_Steven";
s.age = 20;
System.out.println(s.getName() + s.getAge()); //正确的方式!!!
s.setName("BWH_Steven");
s.setAge(20);
}
}

我们用private来修饰我们的成员变量不是没有任何依据的,如果我们的成员变量修饰符改为public,这句意味着外界可以使用对象直接访问,修改这个成员变量,这可能会造成一些重大的问题

例如:外界通过对象去给成员变量赋值,可以赋值一些非法的数据

这明显是不合理的。所以在赋值之前应该先对数据进行判断

StudenDemo是一个测试类,测试类一般只创建对象,调用方法

所以这个判断应该定义在Student类中。需要使用逻辑语句

逻辑语句应该定义在方法中。所以在Student类中提供一个方法来对数据进行校验

但是如果偏偏不调用方法来赋值,还是直接赋值,这样我们的方法就没有起作用

所以我们必须强制要求使用我的方法,而不能直接调用成员变量

这也正是我们使用private修饰成员变量的原因!

结尾:

如果内容中有什么不足,或者错误的地方,欢迎大家给我留言提出意见, 蟹蟹大家 !_

如果能帮到你的话,那就来关注我吧!

在这里的我们素不相识,却都在为了自己的梦而努力 ❤

一个坚持推送原创Java技术的公众号:理想二旬不止

大白带你侃JAVA——封装的概述及好处的更多相关文章

  1. Notes 20180506 : Java程序设计语言概述

    2.Java程序设计语言概述 如果对于开发语言的排行榜有所关注的话,那么会发现很长一段时间以来Java都是位居榜首的高级开发语言,作为一个Java开发者,为此感到骄傲的同时也深感忧虑,骄傲的是自己接触 ...

  2. Java Reference简要概述

    @(Java)[Reference] Java Reference简要概述 Reference对象封装了其它对象的引用,可以和普通的对象一样操作. Java提供了四种不同类型的引用,引用级别从高到低分 ...

  3. 【原创】中文分词系统 ICTCLAS2015 的JAVA封装和多线程执行(附代码)

    本文针对的问题是 ICTCLAS2015 的多线程分词,为了实现多线程做了简单的JAVA封装.如果有需要可以自行进一步封装其它接口. 首先ICTCLAS2015的传送门(http://ictclas. ...

  4. (转)Hibernate框架基础——Java对象持久化概述

    http://blog.csdn.net/yerenyuan_pku/article/details/52732990 Java对象持久化概述 应用程序的分层体系结构 基于B/S的典型三层架构  说明 ...

  5. Java 封装 继承 多态

    Java 继承 继承的概念 继承是java面向对象编程技术的一块基石,因为它允许创建分等级层次的类. 继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法 ...

  6. Java:多线程概述与创建方式

    目录 Java:多线程概述与创建方式 进程和线程 并发与并行 多线程的优势 线程的创建和启动 继承Thread类 start()和run() 实现Runnable接口 实现Callable接口 创建方 ...

  7. java 封装与this关键字

    一 封装 1.封装的概述 封装,它也是面向对象思想的特征之一.面向对象共有三个特征:封装,继承,多态. 封装表现: 1.方法就是一个最基本封装体. 2.类其实也是一个封装体. 从以上两点得出结论,封装 ...

  8. java封装的方法

    java封装是由Java是面向对象程序设计语言的性质决定的,面向对象程序设计语言的三大特性之一就是封装.封装其实就是包装的意思,从专业的角度来看,就是把对象的所有组成部分组合在一起,保护私有属性. 如 ...

  9. (转)面试大总结之一:Java搞定面试中的链表题目

    面试大总结之一:Java搞定面试中的链表题目 分类: Algorithm Interview2013-11-16 05:53 11628人阅读 评论(40) 收藏 举报 链表是面试中常出现的一类题目, ...

随机推荐

  1. js中错误处理机制

    1.基本知识 1. 错误对象 Error,SyntaxError,RangeError, ReferenceError,TypeError,URIError 上面的都是构造函数: new 命令可以生成 ...

  2. js特殊字符的验证

    // 特殊字符的验证 // 包含特殊字符返回true,不包含特殊字符返回false function checkEspcial(s) { var str=trim(s); //var reg=/< ...

  3. mysql自增id的下一个值

    SELECT AUTO_INCREMENT FROM information_schema.tables WHERE table_name='nst_t_department' AND table_s ...

  4. vue 内容增加滚动条自动定位至底部

    this.$nextTick(() => { document.body.scrollTop = document.body.scrollHeight; console.log(document ...

  5. bzoj 1996

    区间 dp $f[i][j][1/0]$ 表示将理想数列的 $[i,j]$ 区间排好的方案数 $f[i][j][1]$ 表示最后进去的是第 $i$ 个人 $f[i][j][0]$ 表示最后进去的是第 ...

  6. 1633:【例 3】Sumdiv

    #include<bits/stdc++.h> #define ll long long using namespace std; ; ll a,b,ans=,cnt; ll p[],c[ ...

  7. legend3---13、vue是真的好用

    legend3---13.vue是真的好用 一.总结 一句话总结: 下次前端所有的交互页面都可以用vue 1.chrome查看post请求携带的参数? 请求的Headers里面的Form Data里面 ...

  8. Python 数据库的Connection、Cursor两大对象

    Python 数据库的Connection.Cursor两大对象 pymysql是Python中操作MySQL的模块,其使用方法和py2的MySQLdb几乎相同. Python 数据库图解流程 Con ...

  9. Qt编写数据可视化大屏界面电子看板12-数据库采集

    一.前言 数据采集是整个数据可视化大屏界面电子看板系统核心功能,没有数据源,这仅仅是个玩具UI,没啥用,当然默认做了定时器模拟数据,产生随机数据,这个可以直接配置文件修改来选择采用何种数据采集方法,总 ...

  10. Vue打包文件放在服务器后,浏览器存在缓存问题

    每次打包更新版本发到服务器上,导致偶尔会出现不能即使更新最新代码,浏览器存在缓存的问题. 解决方法:找到webpack .prod.conf.js 1.定义版本变量: const  Version = ...