Java 教程

Java 控制语句

面向对象编程

Java 内置类

Java 文件处理

Java 错误和异常

Java 多线程

Java 同步

Java 网络编程

Java 集合

Java 接口

Java 数据结构

Java 集合算法

高级 Java

Java 杂项

Java APIs 和框架

Java 类引用

Java 有用资源

Java - 封装



Java 封装

封装是四个基本OOP 概念之一。另外三个是继承多态抽象

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

在 Java 中实现封装

为了在 Java 中实现封装 -

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

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

Java 封装示例

以下是一个演示如何在 Java 中实现封装的示例:

/* File name : 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;
   }
}

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

可以使用以下程序访问EncapTest类的变量:

/* File name : 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()。这些方法可以用来获取在类中声明为私有的属性的值。

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

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

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

public class Main {
  public static void main(String args[]) {
    // Object to Person class
    Person per = new Person();

    // Getting and printing the values
    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 封装:只写类

只写类只能具有 setter 方法来设置属性的值,不应该有任何 getter 方法。

示例:创建只写类

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

// Class "Person"
class Person {
  private String name;
  private int age;

  // Setter Methods
  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[]) {
    // Object to Person class
    Person per = new Person();

    // Setting the values
    per.setName("Robert");
    per.setAge(21);
  }
}

Java 封装:更多示例

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

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

// Class "Person"
class Person {
  private String name;
  private int age;

  // Setter Methods
  public void setName(String name) {
    this.name = name;
  }
  public void setAge(int age) {
    this.age = age;
  }

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

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

// The Main class to test encapsulated class "Person"
public class Main {
  public static void main(String args[]) {
    // Objects to Person class
    Person per1 = new Person();
    Person per2 = new Person();

    // Setting the values
    per1.setName("Robert");
    per1.setAge(21);

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

    // Printing the values
    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"
class Employee {
  private String emp_name;
  private String emp_id;
  private double net_salary;

  // Constructor
  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 methods
  public String getEmpName() {
    return emp_name;
  }

  public String getEmpId() {
    return emp_id;
  }

  public double getSalary() {
    return net_salary;
  }

  // Setter methods
  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;
  }
}

// The Main class to test encapsulated class "Employee"
public class Main {
  public static void main(String args[]) {
    // Objects to Employee class
    // First object - setting values using constructor
    Employee emp = new Employee("Robert", "EMP001", 75450.00);

    // Printing data
    System.out.println("Employee (Intial Values):");
    System.out.println(emp.getEmpId() + " , " + emp.getEmpName() + " , " + emp.getSalary());

    // Updating values using setter methods
    emp.setEmpName("Riyan");
    emp.setEmpId("EMP002");
    emp.setSalary(90500.00);

    // Printing data
    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
广告