Friday, March 13, 2020

Java hướng đối tượng: Tính trừu tượng (Abstraction) trong Java

Java hướng đối tượng: Tính trừu tượng (Abstraction) trong Java
Theo từ điển, trừu tượng là chất lượng xử lý các ý tưởng hơn là các sự kiện. Ví dụ: khi bạn xem xét trường hợp của e-mail, các chi tiết phức tạp như những gì xảy ra ngay khi bạn gửi e-mail, giao thức mà máy chủ e-mail của bạn sử dụng sẽ bị ẩn khỏi người dùng. Do đó, để gửi e-mail, bạn chỉ cần nhập nội dung, đề cập đến địa chỉ của người nhận và nhấp gửi.
Tương tự như vậy trong lập trình hướng đối tượng, trừu tượng hóa là một quá trình ẩn các chi tiết triển khai khỏi người dùng, chỉ có chức năng sẽ được cung cấp cho người dùng. Nói cách khác, người dùng sẽ có thông tin về những gì đối tượng làm thay vì cách nó thực hiện.
Tính trừu tượng (Abstraction) trong Java

Trong Java, sự trừu tượng hóa đạt được bằng cách sử dụng các lớp và giao diện Trừu tượng.

Lớp trừu tượng

Một lớp có chứa từ khóa trừu tượng trong khai báo của nó được gọi là lớp trừu tượng.
Các lớp trừu tượng có thể có hoặc không chứa các phương thức trừu tượng, tức là các phương thức không có phần thân (void void get ();)
Nhưng, nếu một lớp có ít nhất một phương thức trừu tượng, thì lớp đó phải được khai báo là trừu tượng.
Nếu một lớp được khai báo là trừu tượng, nó không thể được khởi tạo.
Để sử dụng một lớp trừu tượng, bạn phải kế thừa nó từ một lớp khác, cung cấp các triển khai cho các phương thức trừu tượng trong nó.
Nếu bạn kế thừa một lớp trừu tượng, bạn phải cung cấp các triển khai cho tất cả các phương thức trừu tượng trong nó.
Employee.java
public abstract class Employee {
   private String name;
   private String address;
   private int number;
   public Employee(String name, String address, int number) {
      System.out.println("Constructing an Employee");
      this.name = name;
      this.address = address;
      this.number = number;
   }
 
   public double computePay() {
     System.out.println("Inside Employee computePay");
     return 0.0;
   }
 
   public void mailCheck() {
      System.out.println("Mailing a check to " + this.name + " " + this.address);
   }
   public String toString() {
      return name + " " + address + " " + number;
   }
   public String getName() {
      return name;
   }

   public String getAddress() {
      return address;
   }
 
   public void setAddress(String newAddress) {
      address = newAddress;
   }

   public int getNumber() {
      return number;
   }
}
Salary.java
public class Salary extends Employee {
   private double salary;   // Annual salary
 
   public Salary(String name, String address, int number, double salary) {
      super(name, address, number);
      setSalary(salary);
   }
 
   public void mailCheck() {
      System.out.println("Within mailCheck of Salary class ");
      System.out.println("Mailing check to " + getName() + " with salary " + salary);
   }

   public double getSalary() {
      return salary;
   }
 
   public void setSalary(double newSalary) {
      if(newSalary >= 0.0) {
         salary = newSalary;
      }
   }
 
   public double computePay() {
      System.out.println("Computing salary pay for " + getName());
      return salary/52;
   }
}
AbstractDemo.java
public class AbstractDemo {
   public static void main(String [] args) {
      Salary s = new Salary("Mohd Mohtashim", "Ambehta, UP", 3, 3600.00);
      Employee e = new Salary("John Adams", "Boston, MA", 2, 2400.00);
      System.out.println("Call mailCheck using Salary reference --");
      s.mailCheck();
      System.out.println("\n Call mailCheck using Employee reference--");
      e.mailCheck();
   }
}
Kết quả:
Constructing an Employee
Constructing an Employee
Call mailCheck using Salary reference --
Within mailCheck of Salary class
Mailing check to Mohd Mohtashim with salary 3600.0
 Call mailCheck using Employee reference--
Within mailCheck of Salary class
Mailing check to John Adams with salary 2400.0

No comments:

Post a Comment