Đ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ó.

  • 🎭 Nhiều hình thức, một tên gọi: Đa hình trong Java Cho phép cùng một tên phương thức được điều hướng đến các triển khai khác nhau dựa trên kiểu đối tượng thực tế tại thời điểm thực thi.
  • 🔀 Hai hương vị: Đa hình thời điểm biên dịch sử dụng nạp chồng phương thức, trong khi đa hình thời điểm chạy sử dụng ghi đè phương thức thông qua kế thừa và JVM.
  • ⛓️ Liên kết tĩnh so với liên kết động: Các lệnh gọi quá tải được giải quyết tại thời điểm biên dịch thông qua liên kết tĩnh, trong khi các lệnh gọi ghi đè được giải quyết tại thời điểm chạy thông qua liên kết động.
  • Sức mạnh từ khóa vượt trội: Từ khóa `super` cho phép lớp con gọi phương thức triển khai của lớp cha trước khi thêm các hành vi chuyên biệt của riêng nó vào.
  • 🧪 Phạm vi ảnh hưởng thực tế: Các tài khoản ngân hàng, hệ thống phân cấp nhân viên bệnh viện và các công cụ dựng hình đều dựa vào tính đa hình để đáp ứng các yêu cầu mới mà không làm hỏng mã đã được kiểm thử.

Đa hình trong Java

Đ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.

Kế thừa đơn trong Java

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.

Java Tính đa hình

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.

Java Tính đa hình

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.

Java Tính đa hình

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ể.

Quy tắc ghi đè phương thức trong Java

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.

Quá tải phương thức
Ghi đè phương pháp
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.

Đa hình tĩnh
Đa hình động
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.

Câu Hỏi Thường Gặp

Đa hình trong Java Đó là khả năng của một đối tượng có thể mang nhiều hình thức khác nhau. Cùng một tên phương thức có thể chạy các đoạn mã khác nhau tùy thuộc vào đối tượng lớp con nào được tham chiếu trong thời gian chạy, đó chính là hành vi cốt lõi của lập trình hướng đối tượng (OOP).

Java Hỗ trợ đa hình thời điểm biên dịch thông qua Nạp chồng phương thức và đa hình thời điểm chạy thông qua Ghi đè phương thức. Nạp chồng được giải quyết tại thời điểm biên dịch thông qua liên kết tĩnh, trong khi Ghi đè được giải quyết tại thời điểm chạy thông qua liên kết động do JVM xử lý.

Liên kết tĩnh (Static binding) liên kết lời gọi phương thức với định nghĩa của nó tại thời điểm biên dịch và được sử dụng cho Nạp chồng phương thức (Method Overloading). Liên kết động (Dynamic binding) liên kết lời gọi tại thời điểm chạy dựa trên kiểu đối tượng thực tế và hỗ trợ Ghi đè phương thức (Method Overriding). Java.

Từ khóa `super` cho phép lớp con gọi phương thức được ghi đè hoặc truy cập thành viên dữ liệu từ lớp cha. Điều này cho phép lớp con tái sử dụng logic của lớp cha và sau đó thêm các lớp hành vi chuyên biệt lên trên đó.

Các trợ giảng AI như ChatGPT và GitHub Copilot Chat có thể giải thích về Đa hình trong... Java Với các ví dụ tương tự tùy chỉnh, tạo ra các bài tập thực hành, hướng dẫn người học về cây kế thừa và kiểm tra kiến ​​thức về liên kết tĩnh so với liên kết động để nắm vững kiến ​​thức nhanh hơn.

Đúng vậy. Các trợ lý tái cấu trúc dựa trên AI như Cursor, Sourcegraph Cody và IntelliJ AI Assistant có thể phát hiện các điều kiện trùng lặp, đề xuất hệ thống phân cấp lớp và viết lại mã nguồn cũ. Java Viết mã sao cho việc ghi đè phương thức thay thế các chuỗi câu lệnh if-else lặp đi lặp lại.

Tóm tắt bài viết này với: