4 封装性(Encapsulation)
4.1封装的概念
高度概括:对属性的访问做限制
封装步骤:
私有化成员变量(private)
为每个成员变量添加set 和get 方法(不一定同时存在,根据需要)
对get和set 方法的访问做限制(里面做条件判断)
在java中类的封装性主要体现不能让外部随意修改一个成员变量的值,否则会引起很多逻辑上的错误,以及一些不可预知的错误。
在定义一个类的成员(包括变量和方法),使用private关键字说明这个成员的访问权限,只能被这个类的其他成员方法调用,而不能被其他的类中的方法所调用;为实现封装性,常将类的成员变量声明为private,再通过public的方法来对这个变量进行访问。对一个变量的操作,一般都有 读取和赋值操作,我们一般定义两个方法来实现这两种操作,即:getXxx()与setXxx();
一个类就是一个模块,我们应该让模块仅仅公开必须要让外界知道的内容,而隐藏其他的一切内容。再进行程序设计时,应尽量避免一个模块直接修改或操作另一个模块的数据,模块设计追求强内聚(许多功能尽量在类的内部独立完成,不让外面干预),弱耦合(提供给外部尽量少的方法调用)。
假设:有 Student 的学生类,里面有一个属性 age,年龄
public class Student {
int age;//年龄
}
问:这么访问属性有没有问题?
public static void main(String[] args) {
Student student = new Student();
student.age = -1;
}
答:显示生活中,年龄有999岁的吗?随意访问age属性,明显问题就出现了。
那么怎么解决这个问题?
4.2 private
Java中共四种权限修饰符:public、private、protected、default(默认,什么都不写,也称为包访问权限)
而被private修饰的属性和方法的特点是:只有当前类才能访问。
解决上面的问题,首先使用private私有age属性:
public class Student {
private int age;//年龄
}
但是,此时如果是在其他类中使用一下代码,会出现无法访问的问题:
public static void main(String[] args) {
Student student = new Student();
student.age = 999;//这行代码报错,找不到age属性。因为该属性,被 private 修饰,所以只有Student 本类才能访问。
}
如果解决该问题?被 private 修饰的属性,怎么在外部类去修改该属性值?
4.3 get和set方法
使用get和set方法是为了程序的封装,为了其它的类可以使用(设置set和获取get)该类的私有属性和方法。
public class Student {
private int age;//年龄
public int getAge() {
return age - 3;
}
public void setAge(int age) {
if (age<100&&age>0) {
this.age = age;
}else{
System.out.println("设置的age不合法");
this.age = 18;//如果设置非法年龄,自动设置age默认为18
}
}
}
这样就可以通过 public 的 get和set 方法,让外部类去访问 Student 私有的属性 age了。但访问受到了限制:
public static void main(String[] args) {
Student student = new Student();
student.setAge(999);
System.out.println("年龄为:"+student.getAge());
//控制台将输出:
//设置的age不合法
//年龄为:18
}
get 和 set 是为了程序的封装,封装是为了对 外部类访问本类属性和方法做限制。