美文网首页Java 杂谈
大白带你侃JAVA——封装的概述及好处

大白带你侃JAVA——封装的概述及好处

作者: 编程小世界 | 来源:发表于2019-05-29 19:55 被阅读0次

    封装概述:

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

    这是什么意思呢?

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

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

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

    封装的好处:

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

    ·提高了代码的复用性

    ·提高安全性

    封装好处的体现方式:

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

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

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

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

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

    我们先来看一段标准案例

    publicclassStudent{//定义成私有成员变量(private)privateString name;privateintage;//无参构造publicStudent(){super();    }//带参构造publicStudent(String name,intage){super();this.name = name;this.age = age;    }//成员变量的set和get方法(与外界联系的桥梁)publicvoidsetName(String name){this.name = name;    }publicStringgetName(){returnname;    }publicvoidsetAge(intage){this.age = age;    }publicintgetAge(){returnage;    }}

    publicclassStudentDemo{publicstaticvoidmain(String[] args){//创建学生类对象 sStudent s =newStudent();//对象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:关于代码复用问题,我会专篇讲解,今天还是着重讲解封装带来的主要好处

    (三)提高安全性

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

    publicclassStudent{privateString name;privateintage;publicStudent(){super();    }publicStudent(String name,intage){super();this.name = name;this.age = age;    }publicvoidsetName(String name){this.name = name;    }publicStringgetName(){returnname;    }//在setAge()方法中加入了校验的内容//不合法数据是不允许传递给成员变量的publicvoidsetAge(intage){if(age <0|| age >120) {            System.out.println("Error");        }else{this.age = age;        }        }publicintgetAge(){returnage;    }}

    publicclassStudentDemo{publicstaticvoidmain(String[] args){        Student s =newStudent();        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修饰成员变量的原因!

    结尾:

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

    我自己是一个从事了6年的Java全栈工程师,最近整理了一套适合2019年学习的Java\大数据资料,从基础的Java、大数据面向对象到进阶的框架知识都有整理哦,可以来我的主页免费领取哦。

    相关文章

      网友评论

        本文标题:大白带你侃JAVA——封装的概述及好处

        本文链接:https://www.haomeiwen.com/subject/rajutctx.html