Đa hình trong Java (Tĩnh và Động)
⚡ Tóm tắt thông minh
Đa hình trong Java Nó cho phép một giao diện đại diện cho nhiều hình thức, do đó một tên phương thức duy nhất có thể hoạt động khác nhau trên các lớp liên quan. Đây là một trụ cột của thiết kế hướng đối tượng, thúc đẩy tính linh hoạt, khả năng tái sử dụng mã và mở rộng một cách hiệu quả các hệ thống ngân hàng, y tế và doanh nghiệp hiện có.

Đa hình trong Java?
Đa hình trong Java Hiện tượng này xảy ra khi một hoặc nhiều lớp hoặc đối tượng có mối quan hệ với nhau thông qua kế thừa. Đó là khả năng của một đối tượng có thể mang nhiều hình thức khác nhau. Kế thừa cho phép người dùng kế thừa các thuộc tính và phương thức, còn đa hình sử dụng các phương thức này để thực hiện các nhiệm vụ khác nhau. Mục tiêu là sự giao tiếp, mặc dù cách tiếp cận có thể khác nhau.
Ví dụ, điện thoại thông minh được sử dụng để liên lạc. Phương thức liên lạc có thể là gọi điện, nhắn tin văn bản, tin nhắn hình ảnh hoặc email. Mục tiêu đều giống nhau, đó là liên lạc, nhưng cách tiếp cận thì khác nhau. Hành vi này chính là bản chất của... Tính đa hìnhBây giờ chúng ta sẽ tìm hiểu về tính đa hình trong... Java Kèm theo mã ví dụ, sơ đồ và giải thích từng bước.
Nhấp chuột đây nếu video không thể truy cập được
Tại sao nên sử dụng đa hình trong Java?
Đa hình trong Java Mô hình này được sử dụng vì nó làm cho mã nguồn linh hoạt, có thể tái sử dụng và dễ bảo trì hơn. Một biến tham chiếu duy nhất của kiểu cha có thể trỏ đến nhiều đối tượng con, do đó cùng một lệnh gọi sẽ thích ứng với bất kỳ lớp con nào được cung cấp. Mô hình này giữ cho mã đã được kiểm thử không bị thay đổi trong khi hành vi mới được thêm vào thông qua các lớp con chuyên biệt, đó chính là lý do tại sao các framework như Spring và Jakarta EE lại phụ thuộc vào nó.
Java Đa hình trong OOP với ví dụ
Hãy xem xét một lớp cha có tên là Tài khoản Với các chức năng gửi và rút tiền. Lớp Account có hai lớp con. Thao tác gửi và rút tiền giống nhau đối với tài khoản Tiết kiệm và Tài khoản Thanh toán, vì vậy các phương thức được kế thừa từ lớp Account sẽ hoạt động.
Java Ví dụ đa hình
Thay đổi về yêu cầu phần mềm
Có sự thay đổi trong đặc tả yêu cầu, điều này khá phổ biến trong ngành công nghiệp phần mềm. Cần bổ sung chức năng cho Tài khoản Ngân hàng Đặc quyền có Hạn mức Thấu chi. Thấu chi là chức năng cho phép khách hàng rút số tiền lớn hơn số dư hiện có trong tài khoản. Phương thức rút tiền cho tài khoản đặc quyền cần được triển khai lại, trong khi mã đã được kiểm thử trong các tài khoản Tiết kiệm và Tài khoản Thanh toán vẫn được giữ nguyên. Sự tách biệt đó là lợi thế của OOPS.
Bước 1) Khi phương thức rút tiền của tài khoản Tiết kiệm được gọi, phương thức được định nghĩa trong lớp Account cha sẽ được thực thi.
Bước 2) Khi phương thức rút tiền cho tài khoản ưu tiên (tiện ích thấu chi) được gọi, phương thức rút tiền được định nghĩa trong lớp ưu tiên sẽ được thực thi. Việc phân phối này là Đa hình trong lập trình hướng đối tượng.
Ghi đè phương thức trong Java
Ghi đè phương thức là quá trình định nghĩa lại một phương thức của lớp cha bên trong lớp con. Lớp con vẫn giữ nguyên các tham số.tract, nhưng cung cấp một triển khai mới được chọn khi chương trình chạy.
Quy tắc ghi đè phương thức
- Chữ ký phương thức, tức là tên phương thức, danh sách tham số và kiểu trả về, phải khớp chính xác.
- Phương thức được ghi đè có thể mở rộng phạm vi truy cập, nhưng không thể thu hẹp nó. Nếu phương thức là private trong lớp cơ sở, lớp con có thể làm cho nó public nhưng điều ngược lại thì không thể.
Ví dụ
class Doctor{ public void treatPatient(){ // treatPatient method } class Surgeon extends Doctor{ public void treatPatient(){ // treatPatient method } } class Run{ public static void main (String args[]){ Doctor doctorObj = new Doctor(); // treatPatient method in class Doctor will be executed doctorObj.treatPatient(); Surgeon surgeonObj = new Surgeon(); // treatPatient method in class Surgeon will be executed surgeonObj.treatPatient(); } }
Sự khác biệt giữa nạp chồng phương thức và ghi đè phương thức
Nạp chồng phương thức xảy ra bên trong cùng một lớp với cùng tên phương thức nhưng chữ ký khác nhau. Ghi đè phương thức xảy ra giữa các lớp cha-con, trong đó lớp con định nghĩa lại một phương thức được khai báo trong lớp cha.
| Nạp chồng phương thức (Method Overloading) cũng thuộc cùng loại, trong đó nhiều phương thức có cùng tên nhưng chữ ký khác nhau. | Ghi đè phương thức là khi một trong các phương thức của lớp cha được định nghĩa lại trong lớp con. Trong trường hợp này, chữ ký của phương thức vẫn giữ nguyên. |
ví dụ:
void sum (int a , int b); void sum (int a , int b, int c); void sum (float a, double b); |
ví dụ:
class X{ public int sum(){ // some code } } class Y extends X{ public int sum(){ //overridden method //signature is same } } |
Đa hình động là gì?
Đa hình động trong lập trình hướng đối tượng (OOP) là cơ chế cho phép định nghĩa nhiều phương thức với cùng tên và chữ ký trong lớp cha và lớp con. Lời gọi đến một phương thức được ghi đè sẽ được giải quyết trong thời gian chạy thông qua liên kết động bên trong JVM.
Ví dụ về đa hình động
Biến tham chiếu của lớp cha có thể tham chiếu đến đối tượng của lớp con:
Doctor obj = new Surgeon();
Hãy xem xét phát biểu sau:
obj.treatPatient();
Ở đây, biến tham chiếu obj Con trỏ thuộc lớp cha, nhưng đối tượng mà nó trỏ tới lại thuộc lớp con, như được minh họa trong sơ đồ Đa hình.
Cuộc gọi obj.treatPatient() sẽ thực thi phương thức treatPatient() của lớp con Surgeon. Khi một tham chiếu đến lớp cơ sở được sử dụng để gọi một phương thức, phương thức được gọi sẽ do JVM quyết định dựa trên đối tượng thực tế mà tham chiếu đang trỏ đến. Mặc dù obj Đây là một tham chiếu đến Doctor, nó gọi phương thức của Surgeon, bởi vì nó trỏ đến một đối tượng Surgeon. Quyết định được đưa ra trong quá trình thực thi, đó là lý do tại sao nó được gọi là... Đa hình động hoặc tính đa hình trong thời gian chạy.
Sự khác biệt giữa đa hình tĩnh và đa hình động
Đa hình tĩnh trong Java Đa hình logic (Multimorphism) là một loại đa hình thu thập thông tin để gọi một phương thức tại thời điểm biên dịch, trong khi đa hình động (Dynamic Polymorphism) là một loại đa hình thu thập thông tin để gọi một phương thức tại thời điểm chạy.
| Nó liên quan đến việc nạp chồng phương thức. | Nó liên quan đến việc ghi đè phương thức. |
| Nếu có lỗi, chúng sẽ được xử lý trong quá trình biên dịch. Vì mã không được thực thi trong quá trình biên dịch, nên tên biến là tĩnh.
ví dụ: void sum (int a , int b); void sum (float a, double b); int sum (int a, int b); //compiler gives error. |
Khi một biến tham chiếu gọi một phương thức được ghi đè, phương thức cần được gọi sẽ được xác định bởi đối tượng mà biến tham chiếu đang trỏ tới. Điều này chỉ có thể được xác định trong thời gian chạy khi mã đang được thực thi, đó là lý do tại sao tên của phương thức lại mang tính động.
ví dụ: //reference of parent pointing to child object Doctor obj = new Surgeon(); // method of child called obj.treatPatient(); |
Siêu từ khóa trong Java
Điều gì sẽ xảy ra nếu phương thức treatPatient trong lớp Surgeon muốn thực thi chức năng được định nghĩa trong lớp Doctor và sau đó thực hiện hành vi cụ thể của riêng nó? Trong trường hợp này, từ khóa là cần thiết. super có thể được sử dụng để truy cập các phương thức của lớp cha từ lớp con. Phương thức treatPatient trong lớp Surgeon có thể được viết như sau:
treatPatient(){
super.treatPatient();
//add code specific to Surgeon
}
Từ khóa `super` có thể được sử dụng để truy cập bất kỳ thành viên dữ liệu hoặc phương thức nào của lớp cha từ bên trong lớp con. Tiếp theo, chúng ta sẽ tìm hiểu về từ khóa `super`. di sảnvà Đa hình trong Java với các chương trình ví dụ.
Ví dụ: Để học về Kế thừa, Đa hình và từ khóa siêu cấp
Bước 1) Sao chép đoạn mã sau vào trình soạn thảo.
public class Test{ public static void main(String args[]){ X x= new X(); Y y = new Y(); y.m2(); //x.m1(); //y.m1(); //x = y;// parent pointing to object of child //x.m1() ; //y.a=10; } } class X{ private int a; int b; public void m1(){ System.out.println("This is method m1 of class X"); } } class Y extends X{ int c; // new instance variable of class Y public void m1(){ // overridden method System.out.println("This is method m1 of class Y"); } public void m2(){ super.m1(); System.out.println("This is method m2 of class Y"); } }
Bước 2) Lưu, biên dịch và chạy mã. Quan sát kết quả đầu ra.
Bước 3) Bỏ dấu chú thích ở các dòng từ 6 đến 9. Lưu, biên dịch và chạy mã. Quan sát kết quả đầu ra.
Bước 4) Bỏ dấu chú thích ở dòng 10. Lưu và biên dịch mã.
Bước 5) Lỗi = ? Điều này xảy ra vì lớp con không thể truy cập các thành viên riêng tư của lớp cha.





