面向对象编程有三大特性:封装、继承、多态。本文将介绍java的三大特性之封装javascript
封装
封装从字面上来理解就是包装的意思,专业点就是信息隐藏,是指利用抽象数据类型将数据和基于数据的操做封装在一块儿,使其构成一个不可分割的独立实体,数据被保护在抽象数据类型的内部,尽量地隐藏内部的细节,只保留一些对外接口使之与外部发生联系。系统的其余对象只能经过包裹在数据外面的已经受权的操做来与这个封装的对象进行交流和交互。也就是说用户是无需知道对象内部的细节(固然也无从知道),但能够经过该对象对外的提供的接口来访问该对象。java
对于封装而言,一个对象它所封装的是本身的属性和方法,因此它是不须要依赖其余对象就能够完成本身的操做。数据库
使用封装有几大好处:编程
一、良好的封装可以减小耦合。this
二、类内部的结构能够自由修改。spa
三、能够对成员进行更精确的控制。code
四、隐藏信息,实现细节。对象
首先咱们先来看两个类:Husband.java、Wife.javablog
1 public class Husband { 2 3 /* 4 * 对属性的封装 5 * 一我的的姓名、性别、年龄、妻子都是这我的的私有属性 6 */ 7 private String name ; 8 private String sex ; 9 private int age ; 10 private Wife wife; 11 12 /* 13 * setter()、getter()是该对象对外开发的接口 14 */ 15 public String getName() { 16 return name; 17 } 18 19 public void setName(String name) { 20 this.name = name; 21 } 22 23 public String getSex() { 24 return sex; 25 } 26 27 public void setSex(String sex) { 28 this.sex = sex; 29 } 30 31 public int getAge() { 32 return age; 33 } 34 35 public void setAge(int age) { 36 this.age = age; 37 } 38 39 public void setWife(Wife wife) { 40 this.wife = wife; 41 } 42 }
1 public class Wife { 2 private String name; 3 private int age; 4 private String sex; 5 private Husband husband; 6 7 public String getName() { 8 return name; 9 } 10 11 public void setName(String name) { 12 this.name = name; 13 } 14 15 public String getSex() { 16 return sex; 17 } 18 19 public void setSex(String sex) { 20 this.sex = sex; 21 } 22 23 public void setAge(int age) { 24 this.age = age; 25 } 26 27 public void setHusband(Husband husband) { 28 this.husband = husband; 29 } 30 31 public Husband getHusband() { 32 return husband; 33 } 34 35 }
从上面两个实例咱们能够看出Husband里面wife引用是没有getter()的,同时wife的age也是没有getter()方法的。至于理由我想各位都懂的,男人嘛深屋藏娇妻嘛,没有那个女人愿意别人知道她的年龄。继承
因此封装把一个对象的属性私有化,同时提供一些能够被外界访问的属性的方法,若是不想被外界方法,咱们大可没必要提供方法给外界访问。可是若是一个类没有提供给外界访问的方法,那么这个类也没有什么意义了。好比咱们将一个房子看作是一个对象,里面的漂亮的装饰,如沙发、电视剧、空调、茶桌等等都是该房子的私有属性,可是若是咱们没有那些墙遮挡,是否是别人就会尽收眼底呢?没有一点儿隐私!就是存在那个遮挡的墙,咱们既可以有本身的隐私并且咱们能够随意的更改里面的摆设而不会影响到其余的。可是若是没有门窗,一个包裹的严严实实的黑盒子,又有什么存在的意义呢?因此经过门窗别人也可以看到里面的风景。因此说门窗就是房子对象留给外界访问的接口。
经过这个咱们还不能真正体会封装的好处。如今咱们从程序的角度来分析封装带来的好处。若是咱们不使用封装,那么该对象就没有setter()和getter(),那么Husband类应该这样写:
1 public class Husband { 2 public String name ; 3 public String sex ; 4 public int age ; 5 public Wife wife; 6 }
咱们应该这样来使用它:
1 Husband husband = new Husband(); 2 husband.age = 30; 3 husband.name = "张三"; 4 husband.sex = "男"; //貌似有点儿多余
可是那天若是咱们须要修改Husband,例如将age修改成String类型的呢?你只有一处使用了这个类还好,若是你有几十个甚至上百个这样地方,你是否是要改到崩溃。若是使用了封装,咱们彻底能够不须要作任何修改,只须要稍微改变下Husband类的setAge()方法便可。
1 public class Husband { 2 3 /* 4 * 对属性的封装 5 * 一我的的姓名、性别、年龄、妻子都是这我的的私有属性 6 */ 7 private String name ; 8 private String sex ; 9 private String age ; /* 改为 String类型的*/ 10 private Wife wife; 11 12 public String getAge() { 13 return age; 14 } 15 16 public void setAge(int age) { 17 //转换便可 18 this.age = String.valueOf(age); 19 } 20 21 /** 省略其余属性的setter、getter **/
其余的地方依然那样引用(husband.setAge(22))保持不变。
其余的地方依然那样引用(husband.setAge(22))保持不变。
到了这里咱们确实能够看出,封装确实可使咱们容易地修改类的内部实现,而无需修改使用了该类的客户代码。
咱们在看这个好处:能够对成员变量进行更精确的控制。
仍是那个Husband,通常来讲咱们在引用这个对象的时候是不容易出错的,可是有时你迷糊了,写成了这样:
1 Husband husband = new Husband(); 2 husband.age = 300;
也许你是由于粗心写成了,你发现了还好,若是没有发现那就麻烦大了,逼近谁见过300岁的老妖怪啊!可是使用封装咱们就能够避免这个问题,咱们对age的访问入口作一些控制(setter)如:
1 public class Husband { 2 3 /* 4 * 对属性的封装 5 * 一我的的姓名、性别、年龄、妻子都是这我的的私有属性 6 */ 7 private String name ; 8 private String sex ; 9 private int age ; /* 改为 String类型的*/ 10 private Wife wife; 11 12 public int getAge() { 13 return age; 14 } 15 16 public void setAge(int age) { 17 if(age > 120){ 18 System.out.println("ERROR:error age input...."); //提示錯誤信息 19 }else{ 20 this.age = age; 21 } 22 23 } 24 25 /** 省略其余属性的setter、getter **/ 26 27 }
上面都是对setter方法的控制,其实经过使用封装咱们也可以对对象的出口作出很好的控制。例如性别咱们在数据库中通常都是已一、0方式来存储的,可是在前台咱们又不能展现一、0,这里咱们只须要在getter()方法里面作一些转换便可。
1 public String getSexName() { 2 if("0".equals(sex)){ 3 sexName = "女"; 4 } 5 else if("1".equals(sex)){ 6 sexName = "男"; 7 } 8 else{ 9 sexName = "人妖???"; 10 } 11 return sexName; 12 }
在使用的时候咱们只须要使用sexName便可实现正确的性别显示。同理也能够用于针对不一样的状态作出不一样的操做。
1 public String getCzHTML(){ 2 if("1".equals(zt)){ 3 czHTML = "<a href='javascript:void(0)' onclick='qy("+id+")'>启用</a>"; 4 } 5 else{ 6 czHTML = "<a href='javascript:void(0)' onclick='jy("+id+")'>禁用</a>"; 7 } 8 return czHTML; 9 }