Đa hình là một khái niệm OOP trong đó một tên có thể có nhiều dạng.
Ví dụ, bạn có một điện thoại thông minh để liên lạc. Chế độ liên lạc bạn chọn có thể là bất cứ điều gì. Nó có thể là một 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 phổ biến là giao tiếp, nhưng cách tiếp cận của họ thì khác. Điều này được gọi là đa hình.
Trong hướng dẫn này, bạn sẽ học-
- Đa hình là gì?
- Đa hình Java trong OOP với ví dụ
- Phương pháp ghi đè
- Sự khác biệt giữa quá tải và ghi đè
- Đa hình động là gì?
- Siêu từ khóa
- Sự khác biệt giữa đa hình tĩnh và động
Đa hình Java trong OOP
Chúng tôi có một lớp cha, 'Account' có chức năng gửi và rút tiền. Tài khoản có 2 lớp con
Hoạt động gửi và rút tiền là như nhau đối với Tài khoản tiết kiệm và Kiểm tra. Vì vậy, các phương thức được kế thừa từ lớp Tài khoản sẽ hoạt động.
Thay đổi trong yêu cầu phần mềm
Có một sự thay đổi trong đặc tả yêu cầu, một cái gì đó rất phổ biến trong ngành công nghiệp phần mềm. Bạn phải thêm tài khoản Ngân hàng đặc quyền chức năng với Cơ sở thấu chi.
Đối với một nền tảng, thấu chi là một cơ sở nơi bạn có thể rút một số tiền nhiều hơn số dư có sẵn trong tài khoản của bạn.
Vì vậy, phương thức rút tiền cho các nhu cầu đặc quyền để thực hiện trước đó. Nhưng bạn không thay đổi đoạn mã được kiểm tra trong tài khoản Tiết kiệm và Kiểm tra. Đây là lợi thế của OOPS
Bước 1) Như vậy khi phương thức "withdrawn" để lưu tài khoản được gọi là phương thức từ lớp tài khoản mẹ đượ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 được thực thi. Đây là đa hình.
Phương pháp ghi đè
Phương thức ghi đè là định nghĩa 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 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ở, lớp con có thể công khai nhưng không phải ngược lại.
Thí 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 Overloading(nạp chồng) và Overriding (ghi đè)
Overloading
|
Overriding
|
Quá tải phương thức là trong cùng một lớp, trong đó có nhiều hơn một 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 trong siêu lớp đượ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.
|
Vd
void sum (int a, int b);
void sum (int a, int b, int c);
void sum (float a, double b);
|
Vd
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 (Dynamic Polymorphism) 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 lớp cha và lớp con. Cuộc gọi đến một phương thức ghi đè được giải quyết trong thời gian chạy.
Ví dụ đ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 lớp phụ
Doctor obj = new Surgeon();
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à của lớp con (như trong sơ đồ).
obj.treatPatient () sẽ thực thi phương thức TreatPatient () của lớp con - Bác sĩ phẫu thuật
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 được quyết định bởi JVM, tùy thuộc vào đối tượng mà tham chiếu được trỏ đến
Ví dụ, mặc dù obj là một tham chiếu đến Doctor, nó gọi phương thức của Surgeon, vì nó trỏ đến một đối tượng Surgeon
Điều này được quyết định trong thời gian chạy và do đó được gọi là đa hình động hoặc thời gian chạy
Từ khoá Super
Điều gì xảy ra nếu phương thức TreatPatient trong lớp Surgeon muốn thực thi chức năng được xác định trong lớp Doctor và sau đó thực hiện chức năng cụ thể của riêng nó?
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 là:
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.
Ví dụ: -Để tìm hiểu Kế thừa, Đa hình & siêu từ khóa
Bước 1) Sao chép mã sau vào Editor
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(){
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) Dòng không ghi chú # 6-9. Lưu, biên dịch và chạy mã. Quan sát đầu ra.
Bước 4) Dòng không ghi chú # 10. Lưu và biên dịch mã.
Bước 5) Lỗi =? Điều này là do lớp phụ không thể truy cập các thành viên tư nhân của siêu hạng.
Sự khác biệt giữa đa hình tĩnh và động
Đa hình tĩnh
|
Đa hình động
|
Nó liên quan đến quá tải phương pháp. | Nó liên quan đến phương pháp ghi đè. |
Lỗi, nếu có, đượ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, do đó tên tĩnh.
Vd
void sum (int a, int b);
void sum (float a, double b);
int tổng (int a, int b); // trình biên dịch đưa ra lỗi.
|
Trong trường hợp một biến tham chiếu đang gọi một phương thức được ghi đè, phương thức được gọi được xác định bởi đối tượng, biến tham chiếu của bạn được trỏ đến. Điều này chỉ có thể được xác định trong thời gian chạy khi mã được thực thi, do đó tên động.
Vd
// tham chiếu của cha mẹ trỏ đến đối tượng con
Doctor obj = new Surgeon ();
// phương thức con gọi là
obj.treatPatient ();
|
إرسال تعليق