4 封装性(Encapsulation)

4.1封装的概念

高度概括:对属性的访问做限制

封装步骤:

  1. 私有化成员变量(private)

  2. 为每个成员变量添加set 和get 方法(不一定同时存在,根据需要)

  3. 对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 是为了程序的封装,封装是为了对 外部类访问本类属性和方法做限制。

results matching ""

    No results matching ""