封装java
封装(Encapsulation)是指将对象的状态信息隐藏在对象内部,不容许外部程序直接访问对象内部信息,而是经过该类提供的方法来实现对内部信息的操做和访问。编程
封装是面向对象编程语言对客观世界的模拟,客观世界里的Field都是杯隐藏在对象内部的,外界没法直接操做和修改。(个人我的理解就是:比如一我的,这我的具备年龄,身高,体重等属性,年龄只能随着时间流逝增长,不能你说多少岁就是多少岁。)对一个类或对象实现良好的封装,能够实现如下目的:安全
》隐藏类的实现细节。编程语言
》让使用者只能经过事先预约的方法来访问数据,从而能够在该方法里加入控制逻辑,限制对Field的不合理访问。this
》可进行数据检查,从而有利于保证对象信息的完整性。code
》便于修改,提升代码的可维护性。对象
为了实现良好的封装,须要从两方面考虑。get
》将对象的Field和实现细节隐藏起来,不容许外部直接访问。io
》把方法暴露出来,让方法来控制对这些Field进行安全的访问和操做。编译
封装实际上有两个方面的含义:把该隐藏的隐藏起来,把该暴露出来的暴露出来。这就须要经过使用java提供的访问控制符来实现。
使用访问控制符
java提供了4种访问控制符:private,default,protected和public. 分别表明了4个访问级别。
private(当前类访问权限) ,default(包访问权限),protected(子类访问权限),public(公共访问权限)。注:我比较懒,不想写后面的,这方面看了知道就能够了。
public class Person { //将Field使用private修饰,将这些Field隐藏起来 private String name; private int age; //提供方法来操做name Field public void setName(String name) { //执行合理性校验,要求用户名必须在2~8位之间 if (name.length()>8||name.length()<2) { System.out.println("您设置的任命不符合要求"); return; } else { this.name = name; } } public String getName() { return this.name; } //提供方法来操做age Field public void setAge(int age) { //执行合理性校验,要求用户年龄必须在0~100之间 if (age>100||age<0) { System.out.println("您设置的年龄不合法"); return; } else { this.age = age; } } public int getAge() { return this.age; } }
下面程序在main方法中建立一个Person对象,并尝试操做和访问该对象的age和name两个Field。
public class PersonTest { public static void main(String[]args) { Person p = new Person(); //由于age Field已经被隐藏,因此下面的语句将出现编译错误 //p.age = 1000; //下面语句编译不会出现错误,但运行时将提示“您设置的年龄不合法” //程序不会修改p的age Field p.setAge(1000); //访问p的age Field也必须经过其对应的getting方法 //由于上面从未成功设置p的age Field,故此处输出0 System.out.println("未设置age Field时:"+ p.getAge()); //成功修改p的age Field p.setAge(30); System.out.println("成功设置age Field后:"+ p.getAge()); //设置名字的方法和年龄类似 p.setName("夏幸运"); System.out.println("成功设置name Field后:"+ p.getName()); } }
关于访问控制符的使用,存在几条基本原则。
》类里的绝大部分Field都应该使用private修饰,只有一些static修饰的,相似全局变量的Field,才可能考虑使用public修饰。
》若是某个类主要是用作其余类的父类,该类里包含的大部分方法可能仅但愿被其子类重写,而不想被外界直接调用,则应该使用protected修饰这些方法。
》但愿暴露出来给其余类自由调用的方法应该使用public修饰。