一、概述
谈起面向对面编程,我们都知道有三大特征【封装、继承、多态】,跟随我一起学习的小伙伴都知道,对于三大特征的后两种,我们在前两期已经讲过了,至于我为啥没有按照特征顺序来教学,是因为我常不按规律出牌啊,因为对于前者而言,后者更关键,要想把java基础学好,面向对象编程,这三种特性是必经之路。
而今天我就要把该三特性之一的封装也给大家讲掉,这样我们该三大特性就讲全啦。
好的,废话不多说,教学这就开讲。
二、本期教学目标
- 封装概念
- 封装优缺点
- 封装有何作用
- 实现封装的步骤
- 示例
三、正文
1️⃣概念
问大家个问题,何为封装(Encapsulation)?在程序里封装指的是一种将抽象性函式接口的实现细节部分包装、隐藏起来的方法。用通俗的话来讲就是把一个东西,关到一个密闭的房间里(没有任何出口,全密闭除了门),只留个门供外界通行。
如下,我给大家画个示意图,简单意思一下。
封装就可以被认为是一道屏障,为了防止该类的代码和数据被外界的方法或者类所随机访问,想要访问该类的方法或属性,就必须通过严格的接口控制。
其实封装,最主要的功能就是降低耦合,我们只需要修改自己实现的代码,而不用去修改那些调用的封装好的方法,这不仅减低了耦合而且也更易于维护,比如代码报错,我们可以压根不需要去定位封装方法是否有问题,而只需要去检查自己写的那部分是否有问题,毕竟封装的方法都是需要经过书写testcase进行一定测试的,否则怎么能够供所有人使用呢?就比如工具类。
2️⃣优缺点
说起封装,肯定会有它的优缺点,封装的缺点嘛?不利于开发测试,debug,没办法深入读每一个类,不利于调试。
说起优点。就相对比较多了,比如降低代码的耦合度,隐藏代码的实现细节,内部类可自由修改,也大大提升了其可运维性。
3️⃣作用
说起封装,我们可以来谈谈,封装可以做啥,为何这么推崇注重程序开发一定要有运用封装的思想,其实啊,这是有目的的,具体如下:
- 有效减少代码耦合度。
- 为了隐藏代码的实现细节(毕竟对于一个方法,我只想调用方法达到目的,而没必要在该调用逻辑里也一并实现它)。
- 类内部结构可自由修改。
- 提升系统的可维护性。
4️⃣实现步骤
在程序设置过程中,讲究“高内聚,低耦合”,一切都按此目的而为。而封装正式利于此目的的发展。如下我举两个例子,通过封装的思想来实现表述其的优点。
通常我们会禁止直接访问一个对象,而是通过操作接口的形式来访问来做到信息隐藏。比如设置属性私有,具体如何设置请看如下:
5️⃣示例
@Data
public class Animal {//父类
private String type;
private String name;
private String color;
public void eat() {
System.out.println("我是父类,吃东西!");
}
}
那我们要调用Animal类,我们就应该创建一个Animal对象,通过对象点(animal.xxx)来获取其属性或者方法,具体演示如下:
总而言之,我们就可以看到,在这段代码中,将 type、name、color三属性设置为私有的(private),也就只能Animal本类才能访问,其他类都访问不了,如此就对信息实现了很好的隐藏作用;然后外界想访问其Animal类的属性,也就得提供给调用者赋值取值的方法,用于对私有属性的访问。如上我是直接使用了@Data注解(自动添加构造方法和get/set等方法),如下我将手动给大家演示一下,手动创建get set方法(其实生成get set方法添加也是有快捷键,alt+insert 组合键,然后选择Getter and Setter即可):
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
如上对set方法采用 this 关键字,其实是为了解决实例变量(private String type)和局部变量(setType(String type)中的type变量)之间发生的同名冲突。