专栏首页理想二旬不止封装的概述和好处(入门)

封装的概述和好处(入门)

01

封装概述

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

这是什么意思呢?

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

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

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

02

封装的好处

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

· 提高了代码的复用性

· 提高安全性

03

封装好处的体现方式

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

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

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

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

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

我们先来看一段标准案例

  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修饰成员变量的原因!

本文分享自微信公众号 - 理想二旬不止(ideal-20),作者:ideal20

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-05-30

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 第三阶段-Java常见对象:【第一章 Object类】

    在讲解Object类之前,我们不得不简单的提一下什么是API,先贴一组百度百科的解释:

    BWH_Steven
  • (三) SpringBoot起飞之路-YAML配置小结(入门必知必会)

    这是第三篇,关于YAML配置文件的小结篇,同样有兴趣的朋友可以去了解一下前两篇,感谢大家支持哈

    BWH_Steven
  • Spring 通过单表 CURD 认识配置IOC的两兄弟(XML&注解)

    前面一篇文章花大量内容,重点学习了 Spring入门 的一些思想,以及简单的学习了 IOC基础 以及基于基于 XML 的配置方式,大家应该清楚,XML与注解常常...

    BWH_Steven
  • java 代码转kotlin

    今天看见IDEA 有一个快捷键 Ctrl+Alt+shift+K。 选中一段代码直接就能将java 代码转化为kotlin 代码。

    地球流浪猫
  • Java基础-11总结Eclipse使用,API,Object类

    1:Eclipse的概述使用(掌握) 1:Eclipse的安装 2:用Eclipse写一个HelloWorld案例,最终在控制台输出你的名字 A:创建项目 ...

    Java帮帮
  • node获取图片保存本地

    用户1437675
  • Java基础-07(01).总结private,this,封装,static,成员方法变量,局部变量匿名对象

    1:成员变量和局部变量的区别(理解) (1)在类中的位置不同 成员变量:类中方法外 局部变量:方法定义中或者方法声明上 (2)在内存中的位置不同 成...

    Java帮帮
  • 用好Jackson,操作Json节省一半时间

    目前解析Json的工具包有,Gson,FastJson,Jackson,Json-lib。综合来看,Jackson的性能较优,稳定性也比较高,而且spring-...

    Java识堂
  • Spring-IOC(2)

    scope <!--Spring使用scope标签来制定bean的作用域(默认为Singleton)--> <bean id="singletonBean" c...

    Java帮帮
  • 用好Jackson,操作Json节省一半时间

    目前解析Json的工具包有,Gson,FastJson,Jackson,Json-lib。综合来看,Jackson的性能较优,稳定性也比较高,而且spring-...

    捡田螺的小男孩

扫码关注云+社区

领取腾讯云代金券