Đ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 Java nào có thể vượt qua nhiều thử nghiệm IS-A đều được coi là đa hình. Trong Học lập trình 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.
Đ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.
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.
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
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 đè.
Ở đây, 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 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. 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.
Bất kỳ đối tượng Java nào có thể vượt qua nhiều thử nghiệm IS-A đều được coi là đa hình. Trong Học lập trình 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.
Đ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.
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.
Khóa học lập trình Java |
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
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 đè 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ờ, bạn 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(); } }Điều này sẽ tạo ra kết quả sau
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, 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 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. 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