Java 封装

封装 是面向对象概念四个基本特征之一 。另外三个是继承、多态和抽象。

Java 中的封装是一种将数据(变量)和作用于数据的代码(方法)包装在一起作为一个单元的机制。 在封装中,一个类的变量将对其他类隐藏,并且只能通过当前类的方法来访问。 因此,它也被称为数据隐藏。

在Java中实现封装

在Java中实现封装 

  • 将类的变量声明为私有。

  • 提供公共的setter和getter方法来修改和查看变量值。

Java 封装示例

下面是一个示例,演示如何在 Java 中实现封装 -

/* 文件名 : EncapTest.java */
public class EncapTest {
   private String name;
   private String idNum;
   private int age;

   public int getAge() {
      return age;
   }

   public String getName() {
      return name;
   }

   public String getIdNum() {
      return idNum;
   }

   public void setAge( int newAge) {
      age = newAge;
   }

   public void setName(String newName) {
      name = newName;
   }

   public void setIdNum( String newId) {
      idNum = newId;
   }
} 

public setXXX()getXXX() 方法是 实例变量的访问点EncapTest 类。通常,这些方法称为 getter 和 setter。因此,任何想要访问变量的类都应该通过这些 getter 和 setter 来访问它们。

EncapTest 类的变量可以使用以下程序 -

/* 文件名 : RunEncap.java */
public class RunEncap {

   public static void main(String args[]) {
      EncapTest encap = new EncapTest();
      encap.setName("James");
      encap.setAge(20);
      encap.setIdNum("12343ms");

      System.out.print("Name : " + encap.getName() + " Age : " + encap.getAge());
   }
}

public class EncapTest {
   private String name;
   private String idNum;
   private int age;

   public int getAge() {
      return age;
   }

   public String getName() {
      return name;
   }

   public String getIdNum() {
      return idNum;
   }

   public void setAge( int newAge) {
      age = newAge;
   }

   public void setName(String newName) {
      name = newName;
   }

   public void setIdNum( String newId) {
      idNum = newId;
   }
} 

输出

Name : James Age : 20 

封装的好处

  • 可以制作类的字段只读或只写。

  • 类可以完全控制其字段中存储的内容。

Java封装:只读类

只读类只能有getter方法来获取属性的值,不应该有任何setter方法。

示例:创建只读类

在这个例子中,我们定义了一个类Person,它有两个getter方法getName ()getAge()。这些方法可用于获取类中声明为私有的属性的值。

//"Person"类
class Person {
  private String name = "Robert";
  private int age = 21;

  // Getter 方法
  public String getName() {
    return this.name;
  }

  public int getAge() {
    return this.age;
  }
}

public class Main {
  public static void main(String args[]) {
    // 对象到人员类
    Person per = new Person();

    //获取并打印值
    System.out.println("Name of the person is: " + per.getName());
    System.out.println("Age of the person is: " + per.getAge());
  }
} 

输出

Name of the person is: Robert
Age of the person is: 21 

Java 封装:只写类

A write-only 类只能有 setter 方法来设置属性的值,不应该有任何 getter 方法。

示例:创建 Write-Only 类

在此示例中,我们定义了一个类 Person ,它有两个 setter 方法 setName()setAge()。这些方法可用于设置类中声明为私有的属性的值。

//"人"类
class Person {
  private String name;
  private int age;

  // 设置方法
  public void setName(String name) {
    this.name = name;
  }
  public void setAge(int age) {
    this.age = age;
  }
}

public class Main {
  public static void main(String args[]) {
    // 对象到人员类
    Person per = new Person();

    //设置值
    per.setName("Robert");
    per.setAge(21);
  }
} 

Java 封装:更多示例

示例 1:Person 类(完全封装)

此示例创建一个名为"Person"的完全封装的类。该类具有私有类属性、setter 和 getter 方法。

//"人"类
class Person {
  private String name;
  private int age;

  // 设置方法
  public void setName(String name) {
    this.name = name;
  }
  public void setAge(int age) {
    this.age = age;
  }

  // Getter 方法
  public String getName() {
    return this.name;
  }

  public int getAge() {
    return this.age;
  }
}

// 测试封装类"Person"的主类
public class Main {
  public static void main(String args[]) {
    // 对象到 Person 类
    Person per1 = new Person();
    Person per2 = new Person();

    //设置值
    per1.setName("Robert");
    per1.setAge(21);

    per2.setName("Riyan");
    per2.setAge(22);

    // 打印值
    System.out.println("Person 1: Name : " + per1.getName() + " Age : " + per1.getAge());
    System.out.println("Person 2: Name : " + per2.getName() + " Age : " + per2.getAge());

  }
} 

输出

Person 1: Name : Robert Age : 21
Person 2: Name : Riyan Age : 22 

示例 2:Employee 类(完全封装)

此示例创建一个完全封装的类名为"Employee"。该类具有私有类属性、setter 和 getter 方法。

//"员工"类
class Employee {
  private String emp_name;
  private String emp_id;
  private double net_salary;

  // 构造函数
  public Employee(String emp_name, String emp_id, double net_salary) {
    this.emp_name = emp_name;
    this.emp_id = emp_id;
    this.net_salary = net_salary;
  }

  // Getter 方法
  public String getEmpName() {
    return emp_name;
  }

  public String getEmpId() {
    return emp_id;
  }

  public double getSalary() {
    return net_salary;
  }

  // 设置方法
  public void setEmpName(String emp_name) {
    this.emp_name = emp_name;
  }

  public void setEmpId(String emp_id) {
    this.emp_id = emp_id;
  }

  public void setSalary(double net_salary) {
    this.net_salary = net_salary;
  }
}

//测试封装类"Employee"的Main类
public class Main {
  public static void main(String args[]) {
    // Employee 类的对象
    // 第一个对象 - 使用构造函数设置值
    Employee emp = new Employee("Robert", "EMP001", 75450.00);

    //打印数据
    System.out.println("Employee (Intial Values):");
    System.out.println(emp.getEmpId() + " , " + emp.getEmpName() + " , " + emp.getSalary());

    // 使用setter方法更新值
    emp.setEmpName("Riyan");
    emp.setEmpId("EMP002");
    emp.setSalary(90500.00);

    //打印数据
    System.out.println("Employee (Updated Values):");
    System.out.println(emp.getEmpId() + " , " + emp.getEmpName() + " , " + emp.getSalary());
  }
} 

输出

Employee (Intial Values):
EMP001 , Robert , 75450.0
Employee (Updated Values):
EMP002 , Riyan , 90500.0