前言
我们知道,面向对象有三大特征:封装、继承、多态 。这次我们来讲讲三大特征中的封装。
1、问题的引入
当我们创建一个类的对象之后,我们可以通过 “ 对象.属性 ”的方式,对对象的属性进行赋值,如下所示,这时的属性只受到数据类型和存储范围的限制而已 。
Teacher t = new Teacher();
//我们可以通过“ 对象.属性 ”的方式直接赋值
t.age = 22;
但是我们知道在实际的问题中,还有其他的限制条件,如年龄不能是负数,密码长度不能超过几位等等。而 要添加这些额外条件就需要通过方法来实现进行添加 。比如我们在 Teacher 类中添加 setAge( ) 方法来实现额外限制条件。
class Teacher{
int age; //年龄
//额外添加的限制条件
public void setAge(int a) {
if(a<=0) {
age = 0;
}else {
age = a;
}
}
设置完后,可通过 “ 对象.方法 ” 的方式进行调用。
t.setAge(22);
但是如果我们没有将原有的属性设置为 private 的话,用户还是可以通过 “ 对象.属性 ”的方式对对象的属性进行赋值,如下。
t.age = -1;
年龄是负数,这显然是不对的,因此当我们设置完方法来添加额外限制条件时,还要 把原有的属性设置为 private ( 私有的 ) 。这样才能防止用户再次通过 “ 对象.属性 ”的方式对对象的属性进行赋值,从而保证赋值方式的唯一性。
private int age;
因为用户无法再通过通过 “ 对象.属性 ”的方式对对象的属性进行直接赋值,此时,针对于属性就体现了封装性,该属性对用户隐藏了 。这就是封装与隐藏。隐藏对象内部的复杂性,只对外公开简单的接口。便于外界调用,从而提高系统的可扩展性、可维护性。通俗的说,就是把该隐藏的隐藏起来,该暴露的暴露出来。这就是封装性的设计思想。
2、如何体现封装
封装性的体现有很多种方式,常见的方式如下:
①将类的某个 xxx 属性设为 private 后,通过 public 的 setXxx( ) 和 getXxx( ) 方法分别进行设置和获取 。
②将类中的某个方法 private 化,只在类的内部进行使用,不对外开放。
③单例模式。
在上述的例子中,我们已经设置了 setAge( ) 方法,所以还需要 getAge( ) 方法来使用户有办法查看该属性的值。
class Teacher{
//获取
public int getAge() {
return age;
}
}
至此,第 ① 个方式就实现啦,下面是完整的代码。
public class EncapsulationTest {
public static void main(String []args) {
Teacher t = new Teacher();
t.setAge(22);
/*
* 我们虽然调用了方法,但是如果没有把该属性设为 private ,
* 用户依旧可以通过下列方式给属性赋值,年龄是负数显然是不对的,
* 所以要记得把属性设为 private。
* 设为private后下列语句会报 The field Teacher.age is not visible 的错误,
* 就是说该属性对用户隐藏了,这就是封装与隐藏
*/
// t.age = -4;
t.show();
System.out.println(t.getAge());
}
}
class Teacher{
private int age; //属性私有,封装与隐藏
public void show() {
System.out.println("Teacher's age is " + age + ".");
}
//这是添加额外限制条件的方法,是设置
public void setAge(int a) {
if(a<=0) {
age = 0;
}else {
age = a;
}
}
//获取
public int getAge() {
return age;
}
}
3、权限修饰符配合封装性
可以看到,在封装性的体现中需要权限修饰符来配合,如 private 的属性,public 的 setXxx( ) 和 getXxx( ) 方法。而在 Java 中有 4 种权限修饰符。
①Java 规定的 4 种权限( 从小到大排列 ) : private、缺省、protected、public
②4 种权限可以用来修饰类及类的内部结构,其中,4 种权限都可以用来修饰类的内部结构:属性、方法、构造器、内部类,但是修饰类的话, 只能使用:缺省、public
③用不同的权限修饰符修饰的类或内部结构,什么时候可调用如下:
修饰符 | 类内部 | 同一个包 | 不同包的子类 | 同一个工程 |
---|---|---|---|---|
private | 可用 | |||
缺省 | 可用 | 可用 | ||
protected | 可用 | 可用 | 可用 | |
public | 可用 | 可用 | 可用 | 可用 |
以上笔记供大家学习交流,如有错误,欢迎指正!