封装封装,见名知意,就是把东西包装隐藏起来,不被外界所看见,安全
而Java特性封装:是指利用抽象数据类型将数据和基于数据的操做封装在一块儿,使其构成一个不可分割的独立实体,数据被保护在抽象数据类型的内部,尽量地隐藏内部的细节,只保留一些对外接口使之与外部发生联系。系统的其余对象只能经过包裹在数据外面的已经受权的操做来与这个封装的对象进行交流和交互。也就是说用户是无需知道对象内部的细节(固然也无从知道),但能够经过该对象对外的提供的接口来访问该对象。模块化
类的某些信息隐藏在类的内部,不容许外部程序直接访问,而是经过该类提供的方法来对隐藏的信息向外暴露来进行操做和访问。this
封装的好处(优势):spa
提到Java的封装,那么确定离不开四种权限修饰:code
修饰符 | 同类中 | 同一个包中(子类和无关类) | 不一样包(子类) | 不一样包(无关类) |
public | √ | √ | √ | √ |
protected | √ | √ | √ | |
default | √ | √ | ||
private | √ |
首先咱们先来看一下下面的这个Person类。对象
public class Person { public String name;//姓名 public int age;//年龄 public String sex;//性别 public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } }
从上面的Person类能够看到,他的全部属性都是用public修饰的,这就好像你的姓名,年龄,性别都是写在脸上的,都暴露了出来,要是这个类有更多的属性,如身份证、电话号码、家庭住址这种比较私密的属性暴露在外面那就不安全了,这就是没有封装的弊端。blog
咱们建立一个Person实例给他赋值:接口
Person person=new Person(); person.name="菜徐坤"; person.age=21; person.sex="woman";
若是咱们哪天要修改属性的类型了,例如将age的类型修改成String类型的,若是你只有一处使用了这个还好,若是你有几十个甚至上百个这样地方,你是否是要改到崩溃。若是使用了封装,咱们彻底能够不须要作任何修改,只须要稍微改变下Person类的setAge()方法便可。ci
若是使用了封装,咱们来看应该怎么操做。get
public class Person { private String name;//姓名 private String age;//年龄,age数据类型改为String了 private String sex;//性别 public String getAge() { return age; } public void setAge(String age) { this.age = age; } /**省略其余getter和setter方法**/ }
使用封装以后,就不能再用Person类的实例来调用其属性了,会提示该属性是私有化的,不能调用,这样就保证了属性的隐蔽性。咱们会提供属性public的getter和setter方法来对属性进行操做。
前面讲到修改age的数据类型,若是使用的封装,其余类使用的person.setAge(21)都不须要改变,只需修改Person类中数据类型和getter、setter方法便可。
若是你将年龄设置成 person.setAge(500),你会发现也能够,可是这就不和常理了,人怎么可能活500岁,使用封装咱们可以轻松解决这样的问题。咱们只需在setAge方法里面添加一些条件便可,以下所示。
public class Person { private String name;//姓名 private int age;//年龄 private String sex;//性别 public int getAge() { return age; } public void setAge(int age) { if (age>256){ System.out.println("你输入的年龄有误!"); }else{ this.age = age; } } /** 省略其余属性的setter、getter **/ }