Thứ Bảy, 26 tháng 1, 2019

Học lập trình Java - Đa hình

Đa hình là khả năng của một đối tượng có nhiều dạng. Việc sử dụng đa hình phổ biến nhất trong OOP xảy ra khi tham chiếu lớp cha được sử dụng để chỉ đối tượng lớp con.

Bất kỳ đối tượng Đào tạo lập trình Java nào có thể vượt qua nhiều thử nghiệm IS-A đều được coi là đa hình. Trong Java, tất cả các đối tượng Java là đa hình vì bất kỳ đối tượng nào cũng sẽ vượt qua bài kiểm tra IS-A cho loại riêng của chúng và cho Đối tượng lớp.

Học lập trình Java chuyên nghiệp
Học lập trình Java chuyên nghiệp

Điều quan trọng cần biết là cách duy nhất có thể để truy cập một đối tượng là thông qua một biến tham chiếu. Một biến tham chiếu có thể chỉ có một loại. Sau khi khai báo, loại biến tham chiếu không thể thay đổi.

Đào tạo lập trình Java Biến tham chiếu có thể được gán lại cho các đối tượng khác với điều kiện là nó không được khai báo cuối cùng. Kiểu của biến tham chiếu sẽ xác định các phương thức mà nó có thể gọi trên đối tượng.

Một biến tham chiếu có thể tham chiếu đến bất kỳ đối tượng nào thuộc kiểu khai báo hoặc bất kỳ kiểu con nào của kiểu khai báo của nó. Một biến tham chiếu có thể được khai báo là một lớp hoặc loại giao diện.

Chúng ta hãy xem xét một ví dụ.

public interface Vegetarian{}
public class Animal{}
public class Deer extends Animal implements Vegetarian{}
Bây giờ, lớp Deer được coi là đa hình vì điều này có nhiều sự kế thừa. Sau đây là đúng với các ví dụ trên -

Một con nai IS-Một con vật

Một con nai IS-A chay

Một con nai IS-Một con nai

Một con nai IS-A Object

Khi chúng tôi áp dụng các sự kiện biến tham chiếu cho tham chiếu đối tượng Deer, các khai báo sau là hợp pháp
Deer d = new Deer();
Animal a = d;
Vegetarian v = d;
Object o = d;
Tất cả các biến tham chiếu d, a, v, o đều đề cập đến cùng một đối tượng Deer trong heap.

Phương thức ảo

Trong phần này, tôi sẽ chỉ cho bạn cách hành vi của các phương thức được ghi đè trong Đào tạo lập trình Java cho phép bạn tận dụng tính đa hình khi thiết kế các lớp của mình.

Chúng ta đã thảo luận về ghi đè phương thức, trong đó một lớp con có thể ghi đè một phương thức trong lớp cha của nó. Một phương thức được ghi đè về cơ bản được ẩn trong lớp cha và không được gọi trừ khi lớp con sử dụng siêu từ khóa trong phương thức ghi đè.
/* File name : Employee.java */
public 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 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;
   }
}
Bây giờ, giả sử chúng tôi mở rộng lớp Nhân viên như sau
/* File name : 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;
   }
}
Bây giờ, Đào tạo lập trình Java nghiên cứu chương trình sau một cách cẩn thận và cố gắng xác định đầu ra của nó
/* File name : VirtualDemo.java */
public class VirtualDemo {

   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();
   }
}
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

Ở đây, Đào tạo lập trình Java chúng tôi khởi tạo hai đối tượng Mức lương. Một cách sử dụng một tài liệu tham khảo Mức lương s , và người kia sử dụng một tài liệu tham khảo nhân viên e .

Trong khi gọi s.mailCheck () , trình biên dịch sẽ thấy mailCheck () trong lớp Mức lương tại thời gian biên dịch và JVM gọi mailCheck () trong lớp Mức lương khi chạy.

mailCheck () trên e khá khác biệt vì e là tài liệu tham khảo của Nhân viên. Khi trình biên dịch nhìn thấy e.mailCheck () , trình biên dịch sẽ thấy phương thức mailCheck () trong lớp Nhân viên.

Ở đây, tại thời điểm biên dịch, trình biên dịch đã sử dụng mailCheck () trong Nhân viên để xác thực tuyên bố này. Đào tạo lập trình Java Tuy nhiên, tại thời gian chạy, JVM gọi mailCheck () trong lớp Mức lương.

Hành vi này được gọi là gọi phương thức ảo và các phương thức này được gọi là phương thức ảo. Một phương thức ghi đè được gọi trong thời gian chạy, bất kể kiểu tham chiếu nào được sử dụng trong mã nguồn tại thời gian biên dịch.

Không có nhận xét nào:

Đăng nhận xét

Lập trình Java - Ngoại lệ

Một ngoại lệ (hoặc sự kiện đặc biệt) là một vấn đề phát sinh trong quá trình thực hiện chương trình. Khi xảy ra Ngoại lệ , luồng bình thường...