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
廣告