Java 封装

  • 概念

封装(Encapsulation)是Java的三大特性之一,顾名思义,封装就是把东西包起来,不允许用户直接操作被隐藏的信息,而是通过定义好的方法来访问和更新被包起来的信息。

  • 目的

封装的目的就是提供安全保障,封装代码实现细节,防止用户随意操作类属性让系统崩溃。同时方便后期维护,保护对象信息的完整性。

  • 封装原则

    1. 把成员变量(属性)和代码实现细节隐藏起来,不允许外部直接访问。
    2. 提供相应的访问和更新方法,也就是也就是属性私有提供get/set方法
    3. 总的来说就是该露的露,该藏的藏,追求“高内聚,低耦合”。高内聚就是指操作细节自己完成,不允许外部干涉;低耦合:仅暴露少量的方法给外部使用。
  • 封装的实现步骤:

    封装设计具体步骤
    1. 修改属性的可见性设为private
    2. 提供getter/setter方法用于访问、更新属性的值
    3. 在getter/setter方法中加入属性控制语句对属性值的合法性进行判断
  • Java中的访问控制符:

    访问修饰符本类同包子类其他
    private
    default
    protected
    public
    • private:当前类中可以访问
    • default:在当前包内可以访问
    • protected:在当前类和它的派生类可以访问
    • public:公共访问权,谁都能访问
  • 代码实例:

    1. 创建类,并让属性私有

      public class Student {
          private String name; //名字
          private int id; //学号
          private String sex; //性别
      }
    2. 从上面的修饰符访问权限可以看到,private(私有)只有本类能访问,要想其他类也能访问,则需要额外提供公共方法访问(IDEA中 快捷键 Alt + Insert 快速插入getter/setter)。

      public class Student {
          private String name; //名字
          private int id; //学号
          private String sex; //性别 male or female
      
          public String getName() {
              return name;
          }
      
          public void setName(String name) {
              this.name = name;
          }
      
          public int getId() {
              return id;
          }
      
          public void setId(int id) {
              this.id = id;
          }
      
          public String getSex() {
              return sex;
          }
      
          public void setSex(String sex) {
              this.sex = sex;
          }
      }
    3. 具体测试代码:

      //Application.java
      package com.zctou.oop;
      
      
      import com.zctou.oop.demo03.Student;
      
      public class Application {
      
          public static void main(String[] args) {
              Student student1 = new Student();
              student1.setName("再重头");
              System.out.println(student1.getName());
      
          }
      }
      
      //Student.java
      package com.zctou.oop.demo03;
      
      public class Student {
          private String name; //名字
          private int id; //学号
          private char sex; //性别
      
          public String getName() {
              return name;
          }
      
          public void setName(String name) {
              this.name = name;
          }
      
          public int getId() {
              return id;
          }
      
          public void setId(int id) {
              this.id = id;
          }
      
          public char getSex() {
              return sex;
          }
      
          public void setSex(char sex) {
              this.sex = sex;
          }
      }
      
      //输出:
      再重头
    4. 前面提过:可以在getter/setter方法中加入属性控制语句过滤非法数据

      如 sex学生类的性别,不是male就是female,第三种是不存在的,所以在sex 的setter方法中加入控制代码即可。

      public void setSex(String sex) {
          if(sex.equals("male") || sex.equals("female")) {
              this.sex = sex;
          } else {
              System.out.println("性别有误!是男人请输入male,是女人输入female");
          }
      }

      测试:

      public static void main(String[] args) {
          student.setSex("a");
          System.out.println(student.getSex()); //性别有误!是男人请输入male,是女人输入female null
          student.setSex("male");
          System.out.println(student.getSex()); // male
      
      }
文章目录