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


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


Điều quan trọng là phải biết rằng 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, các loại của một biến tham chiếu không thể thay đổi.


Biến tham chiếu có thể được bố trí cho các đối tượng khác với điều kiện nó không được công bố chính thức. Các kiểu của biến tham khảo sẽ xác định các phương pháp mà nó có thể gọi trên đối tượng lap trinh android


Một biến tham chiếu có thể tham khảo bất kỳ đối tượng của kiểu tuyên bố của mình hoặc bất kỳ kiểu con của kiểu được 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 giao diện kiểu.


Ví dụ:
Chúng ta hãy nhìn vào một ví dụ.
Mã:
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ì đây có nhiều di sản. Sau đây là đúng đối với các ví dụ trên:


- Một Deer IS-A động vật


- Một Deer IS-A Vegetarian


- Một Deer IS-A Deer


- Một Deer IS-A Object


Khi chúng tôi áp dụng các sự kiện biến tham chiếu đến một đối tượng tham chiếu Deer, các tờ khai sau đây là hợp pháp:
Mã:
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 tham khảo các đối tượng Deer cùng trong đống.


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


Chúng tôi đã đã thảo luận về phương pháp trọng, nơi một lớp con có thể ghi đè lên một phương pháp trong cha mẹ của nó. Một phương pháp ghi đè cơ bản được ẩn trong các lớp cha mẹ, và không được gọi trừ khi lớp trẻ sử dụng từ khóa siêu trong phương pháp trọng.
Mã:
/* 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;
   }
}

Xem thêm: KHóa hoc lap trinh android nâng cao tại Hà nội !


Now suppose we extend Employee class as follows:
Mã:
/* 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;
   }
}



Now, you study the following program carefully and try to determine its output:
Mã:
/* 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();
    }
}



Điều này sẽ tạo ra các kết quả sau đây:


Xây dựng một nhân viên
Xây dựng một nhân viên
Gọi MAILCHECK sử dụng tài liệu tham khảo Tiền lương -
Trong vòng MAILCHECK của lớp Lương
ốm yếu kiểm tra để Mohd Mohtashim với lương 3600.0


Gọi MAILCHECK sử dụng nhân viên reference--
Trong vòng MAILCHECK của lớp Lương
ốm yếu kiểm tra để John Adams với lương 2400,0
Ở đây, chúng tôi nhanh chóng hai đối tượng Lương. một cách sử dụng một tài liệu tham khảo Mức lương s, và các khác bằng cách sử dụng một tài liệu tham khảo Employee e.


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


Gọi MAILCHECK () trên e là khá khác nhau, vì e là một tài liệu tham khảo nhân viên. Khi trình biên dịch thấy e.mailCheck (), trình biên dịch thấy các MAILCHECK () trong lớp Employee.


Ở đây, tại thời gian biên dịch, trình biên dịch sử dụng MAILCHECK () trong nhân viên để xác nhận tuyên bố này. Lúc chạy, tuy nhiên, các JVM gọi MAILCHECK () trong lớp Lương.


Hành vi này được gọi phương pháp gọi là ảo, và các phương pháp được gọi là phương pháp ảo. Tất cả các phương thức trong Java cư xử theo cách này, theo đó một phương pháp ghi đè được gọi vào thời gian chạy, không có vấn đề gì kiểu dữ liệu tham chiếu là đã được sử dụng trong mã nguồn tại thời gian biên dịch.


Xem thêm: Khóa học photoshop cơ bản nâng cao tại Hà nội !

Chủ đề tương tự: