大白带你侃JAVA——封装的概述及好处
封装概述:
封装是指隐藏对象的属性和实现细节,仅对外提供公共访问方式
这是什么意思呢?
简单的来说就是我将不想给别人看的数据,以及别人无需知道的内部细节, “锁起来” ,我们只留下一些入口,使其与外部发生联系。
我们如何给我们的数据 “上锁” 呢?
我们使用,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技术的公众号:理想二旬不止
最新文章
- h5 hdf5 文件转 tif 流程
- QGC 支付宝无法异步通知及异步通知常见问题注意事项
- CString转string
- C#序列化s实体类成Xml,去除空格、换行符以及命名空间
- 鸿雁电器oa系统中决策支持模块效果
- 在网页上添加QQ消息代码
- shell脚本编程-处理用户输入
- Thinkphp中路由Url获取的使用方法
- utf8_general_ci 、utf8_general_cs和utf8_bin的区别
- LeetCode:36. Valid Sudoku,数独是否有效
- C#中任意类型数据转成JSON格式
- 使用AES加密的勒索类软件分析报告
- python jquery初识
- PwniumCTF2014 - JJSN总结
- 【Python】【容器 | 迭代对象 | 迭代器 | 生成器 | 生成器表达式 | 协程 | 期物 | 任务】
- CentOS最小安装无法使用ifconfig命令
- 微信7.0以上版本fiddler、Charles抓包报HTTPS证书信任问题通报
- Spring Boot Maven Plugin打包异常及三种解决方法:Unable to find main class
- Oracle之表空间基于时间点的恢复
- [Win32]一个调试器的实现(五)调试符号
热门文章
- [Luogu] 家族
- Asia-Jakarata 2018
- [CQOI2016]手机号码 数位DP
- mysql 进程
- CF1208C
- 发现一个好的手机抓包工具Http Traffic
- GA算法及参数对结果的影响
- 组件 computed 与 vuex 中 getters 的使用,及 mapGetters 的使用,对象上追加属性,合并对象
- Java-基于 Instrument 的 Agent
- (main)贝叶斯统计 | 贝叶斯定理 | 贝叶斯推断 | 贝叶斯线性回归 | Bayes&#39; Theorem