Đa hình trong Java (Tĩnh và Động)
Đa hình trong Java?
Tính đa hình in Java xảy ra khi có một hoặc nhiều lớp hoặc đối tượng liên quan với nhau bằng sự kế thừa. Đó là khả năng của một vật thể có nhiều hình dạng. Tính kế thừa cho phép người dùng kế thừa các thuộc tính và phương thức, đồng thời tính đa hình sử dụng các phương thức này để thực hiện các tác vụ khác nhau. Vì vậy, mục tiêu là giao tiếp, nhưng cách tiếp cận thì khác.
Ví dụ, bạn có một chiếc điện thoại thông minh để giao tiếp. Chế độ giao tiếp bạn chọn có thể là bất kỳ thứ gì. Có thể là cuộc gọi, tin nhắn văn bản, tin nhắn hình ảnh, thư, v.v. Vì vậy, mục tiêu chung là giao tiếp, nhưng cách tiếp cận của họ thì khác nhau. Điều này được gọi là Đa hình. Bây giờ chúng ta sẽ học về Đa hình trong Java với ví dụ.
Nhấp chuột đây nếu video không thể truy cập được
Java Đa hình trong OOP với ví dụ
Chúng ta có một lớp cha, 'Account' với chức năng gửi và rút tiền. Account có 2 lớp con. Hoạt động 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 vãng lai. Vì vậy, các phương thức kế thừa từ lớp Account sẽ hoạt động.
Thay đổi về yêu cầu phần mềm
Có một thay đổi trong thông số kỹ thuật yêu cầu, một điều rất phổ biến trong ngành công nghiệp phần mềm. Bạn được cho là thêm chức năng Tài khoản Ngân hàng đặc quyền với Cơ sở thấu chi. Để biết thêm thông tin, thấu chi là một cơ sở mà bạn có thể rút một số tiền nhiều hơn số dư khả dụng trong tài khoản của mình. Vì vậy, phương pháp rút tiền cho nhu cầu đặc quyền cần được triển khai lại. Nhưng bạn không thay đổi đoạn mã đã thử nghiệm trong Tài khoản Tiết kiệm và Thanh toán. Đây là lợi thế của OOPS
Bước 1) Như vậy khi phương thức “rút” để lưu tài khoản được gọi thì phương thức từ lớp tài khoản gốc được thực thi
Bước 2) Nhưng khi phương thức “Rút tiền” cho tài khoản đặc quyền (cơ sở thấu chi) được gọi là phương thức rút tiền được xác định trong lớp đặc quyền sẽ được thực thi. Đây là Tính đa hình trong OOP.
Ghi đè phương thức trong Java
Ghi đè phương thức đang xác định lại một phương thức siêu lớp trong một lớp con.
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 khả năng truy cập nhưng không thu hẹp nó, tức là nếu nó là riêng tư trong lớp cơ sở thì lớp con có thể đặt nó ở chế độ công khai nhưng không được ngược lại.
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 quá tải và ghi đè
Nạp chồng phương thức nằm trong cùng một lớp, trong đó có nhiều phương thức có cùng tên nhưng có chữ ký khác nhau. | Ghi đè phương thức là khi một trong các phương thức trong siêu lớp được xác định 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 OOP là cơ chế theo đó nhiều phương thức có thể được định nghĩa với cùng tên và chữ ký trong siêu lớp và lớp con. Cuộc gọi đến một phương thức bị ghi đè sẽ được giải quyết trong thời gian chạy.
Ví dụ về đa hình động:
Một biến tham chiếu của siêu lớp có thể tham chiếu đến một đối tượng của lớp con
Doctor obj = new Surgeon();
Hãy xem xét tuyên bố
obj.treatPatient();
Ở đây, biến tham chiếu “obj” là của lớp cha, nhưng đối tượng mà nó trỏ đến lại thuộc lớp con (như trong ví dụ sơ đồ dưới đây về Đa hình).
obj.treatPatient() sẽ thực thi phương thức TreatPatient() của lớp con – Surgeon
Nếu một tham chiếu lớp cơ sở được sử dụng để gọi một phương thức, thì phương thức được gọi sẽ do JVM quyết định, tùy thuộc vào đối tượng mà tham chiếu đang trỏ tới
Ví dụ: mặc dù obj là tham chiếu đến Doctor nhưng nó vẫn gọi phương thức Surgeon vì nó trỏ đến đối tượng Surgeon
Điều này được quyết định trong thời gian chạy và do đó được gọi là năng động or đa hình thời gian chạy
Sự khác biệt giữa đa hình tĩnh và động
Đa hình tĩnh trong Java là một loại đa hình thu thập thông tin để gọi một phương thức trong thời gian biên dịch, trong khi Đa hình động là một loại đa hình thu thập thông tin để gọi một phương thức trong thời gian chạy.
Nó liên quan đến quá tải phương thức. | Nó liên quan đến ghi đè phương thức. |
Lỗi, nếu có, sẽ được giải quyết tại thời điểm biên dịch. Vì mã không được thực thi trong quá trình biên dịch nên có tên 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. |
Trong trường hợp một biến tham chiếu đang gọi một phương thức bị ghi đè, thì phương thức được gọi sẽ được xác định bởi đối tượng mà biến tham chiếu của bạn đ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, do đó có tên độ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
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 chức năng cụ thể của riêng nó thì sao? Trong trường hợp này, từ khóa 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 siêu lớp trong lớp con.
Tiếp theo chúng ta sẽ tìm hiểu về từ khóa Super, di sản và tính đa hình trong Java với các chương trình ví dụ.
Ví dụ: -Học Kế thừa, Đa hình & siêu từ khóa
Bước 1) Sao chép mã sau vào Trình chỉnh sửa
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(){ // overriden 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 đầu ra.
Bước 3) Bỏ ghi chú dòng #6-9. Lưu, biên dịch và chạy mã. Quan sát đầu ra.
Bước 4) Bỏ chú thích dòng #10. Lưu và biên dịch mã.
Bước 5) Lỗi =? Điều này là do lớp con không thể truy cập các thành viên riêng tư của lớp cha.
Tổng kết
- Tính đa hình trong lập trình hướng đối tượng xảy ra khi có một hoặc nhiều lớp hoặc đối tượng liên quan với nhau bằng tính kế thừa. Đó là khả năng của một vật thể có nhiều hình dạng.
- Ghi đè phương thức đang xác định lại một phương thức siêu lớp trong một lớp con.
- Đa hình động trong Java là cơ chế mà nhiều phương thức có thể được định nghĩa với cùng tên và chữ ký trong siêu lớp và lớp con.
- Đa hình tĩnh trong Java là một loại đa hình thu thập thông tin để gọi một phương thức trong thời gian biên dịch, trong khi Đa hình động là một loại đa hình thu thập thông tin để gọi một phương thức trong thời gian chạy.
- Từ khóa 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.