在理解封装之前,必须要先了解“权限修饰符”。
权限修饰符是用来控制访问权限的。Java语言中的访问权限修饰符有4种,但是仅有3个关键字,因为不写访问权限,在Java中被称为默认权限,或同包权限,本文(default)代替。下面按照权限从小到大的顺序对4中访问权限分别介绍。
1.私有权限(private)
private可以修饰数据成员,构造方法,方法成员,不能修饰类(此处指外部类,不考虑内部类)。被private修饰的成员,只能在定义它们的类中使用,在其他类中不能调用。
2.默认权限(default)
类,数据成员,构造方法,方法成员,都能够使用默认权限,即不写任何关键字。默认权限即同包权限,同包权限的元素只能在定义它们的类中,以及同包的类中被调用。
3.受保护权限(protected)
protected可以修饰数据成员,构造方法,方法成员,不能修饰类(此处指外部类,不考虑内部类)。被protected修饰的成员,能在定义它们的类中,同包的类中被调用。如果有不同包的类想调用它们,那么这个类必须是定义它们的类的子类。
4.公共权限(public)
public可以修饰类,数据成员,构造方法,方法成员。被public修饰的成员,可以在任何一个类中被调用,不管同包或不同包,是权限最大的一个修饰符。
有关Java语言的修饰符,需要注意的问题有如下几个:
1.并不是每个修饰符都可以修饰类(指外部类),只有public和default可以。
2.所有修饰符都可以修饰数据成员,方法成员,构造方法。
3.为了代码安全起见,修饰符不要尽量使用权限大的,而是适用即可。比如,数据成员,如果没有特殊需要,尽可能用private。
4.修饰符修饰的是“被访问”的权限。
了解完权限修饰符,接下来看一下封装。
封装从字面上来理解就是包装的意思,专业点就是信息隐藏,是指利用抽象数据类型将数据和基于数据的操作封装在一起,使其构成一个不可分割的独立实体,数据被保护在抽象数据类型的内部,尽可能地隐藏内部的细节,只保留一些对外接口使之与外部发生联系。系统的其他对象只能通过包裹在数据外面的已经授权的操作来与这个封装的对象进行交流和交互。也就是说用户是无需知道对象内部的细节(当然也无从知道),但可以通过该对象对外的提供的接口来访问该对象。
对于封装而言,一个对象它所封装的是自己的属性和方法,所以它是不需要依赖其他对象就可以完成自己的操作。
使用封装有三大好处:
1、良好的封装能够减少耦合。
2、类内部的结构可以自由修改。
3、可以对成员进行更精确的控制。
4、隐藏信息,实现细节。
封装的步骤:
1. 使用private修饰需要被封装的属性.
2. 根据需要提供get或者set方法设置以及获取属性。
3. 根据需求来选择合适的权限修饰符来修饰成员方法。
规范 : 在现实开发中一般实体类的所有成员属性(成员变量)都要封装起来。
代码示例如下:
1 //属性封装 2 class People{ 3 private String name; //姓名 4 private String sex; //性别 0:女 1:男 5 private String sexName; //性别显示 6 private int age; //年龄 7 //对外开放设置属性的接口 setter和getter方法 8 public String getName(){ 9 return name; 10 } 11 public void setName(String name){ 12 this.name = name; 13 } 14 public String getSex(){ 15 return sex; 16 } 17 public void setSex(String sex){ 18 this.sex = sex; 19 } 20 public int getAge(){ 21 return age; 22 } 23 public void setAge(int age){ 24 //对属性值进行检测 25 if (age > 120) { 26 System.out.println("设置的年龄不符合实际"); 27 }else{ 28 this.age = age; 29 } 30 } 31 32 //获取有意义的属性值 33 public String getSexName(){ 34 if (sex.equals("0")) { 35 sexName = "女"; 36 }else if (sex.equals("1")) { 37 sexName = "男"; 38 }else{ 39 sexName = "人妖"; 40 } 41 return sexName; 42 } 43 } 44 45 //功能封装 46 class Calculator{ 47 public int num1; //第一个操作数 48 public int num2; //第二个操作数 49 public char operate; //操作符 50 51 //构造方法 - 一个类不一定要有getter 和 setter 52 public Calculator(int num1, int num2, char operate){ 53 this.num1 = num1; 54 this.num2 = num2; 55 if (operate=='+'||operate=='-'||operate=='*'||operate=='/') { 56 this.operate = operate; 57 }else{ 58 this.operate = '+'; 59 } 60 } 61 62 //计算功能 63 public void calculate(){ 64 switch(operate){ 65 case '+': 66 System.out.println("做加法运算,结果是:"+(num1+num2)); 67 break; 68 case '-': 69 System.out.println("做减法运算,结果是:"+(num1-num2)); 70 break; 71 case '*': 72 System.out.println("做乘法运算,结果是:"+(num1*num2)); 73 break; 74 case '/': 75 System.out.println("做除法运算,结果是:"+(num1/num2)); 76 break; 77 default: 78 break; 79 } 80 } 81 } 82 83 class Demo{ 84 public static void main(String[] args){ 85 //测试封装属性 86 People people = new People(); 87 people.setName("张三"); 88 people.setSex("1"); 89 people.setAge(130); 90 System.out.println(people.getName() +" 的性别是 " + people.getSexName() + " 年龄是 "+people.getAge()); 91 //功能封装 92 Calculator calculator = new Calculator(2,1,'*'); 93 calculator.calculate(); 94 } 95 }