Sự khác biệt giữa đa hình thời gian biên dịch (Compile Time Polymorphism) và đa hình thời gian chạy (Run Time Polymorphism) trong Java

Đăng bởi: Admin | Lượt xem: 7806 | Chuyên mục: Java

Trong bài này chúng ta sẽ tìm hiểu sự khác nhau giữa đa hình thời gian biên dịch (Compile Time Polymorphism) và đa hình thời gian chạy (Run Time Polymorphism) trong Java và tìm hiểu về cách sử dụng Nạp chồng phương thức (Overloading) và Ghi đè phương thức (Overriding).


1. Đa hình là gì?

Từ đa hình có nghĩa là có nhiều dạng. Nói một cách đơn giản, chúng ta có thể định nghĩa đa hình là khả năng của một thông điệp được hiển thị dưới nhiều dạng. Trong bài viết này, chúng ta sẽ thấy sự khác biệt giữa hai loại đa hình: thời gian biên dịch (Compile-time) và thời gian chạy (run-time).

2. Đa hình thời gian biên dịch (Compile Time Polymorphism)

Bất cứ khi nào một đối tượng bị ràng buộc với chức năng của chúng tại thời gian biên dịch thì được gọi là đa hình thời gian biên dịch. Tại thời gian biên dịch, java biết nên gọi phương thức nào bằng cách kiểm tra chữ ký của phương thức. Vì vậy, điều này được gọi là đa hình thời gian biên dịch hoặc liên kết tĩnh. Đa hình thời gian biên dịch đạt được thông nạp chồng phương thức (Overloading). Nạp chồng phương thức (Overloading) cho biết bạn có thể có nhiều hơn một hàm có cùng tên trong một lớp có một nguyên mẫu khác nhau. Nạp chồng phương thức là một trong những cách để đạt được đa hình nhưng nó phụ thuộc vào công nghệ mà chúng ta áp dụng loại đa hình nào. Sau đây là một ví dụ trong đó đa hình thời gian biên dịch.

// Java program to demonstrate 
// compile-time polymorphism 
public class GFG { 
  
    // First addition function 
    public static int add(int a, int b) 
    { 
        return a + b; 
    } 
  
    // Second addition function 
    public static double add( 
        double a, double b) 
    { 
        return a + b; 
    } 
  
    // Driver code 
    public static void main(String args[]) 
    { 
        // Here, the first addition 
        // function is called 
        System.out.println(add(2, 3)); 
  
        // Here, the second addition 
        // function is called 
        System.out.println(add(2.0, 3.0)); 
    } 
} 

Đầu ra:

5
5.0

3. Đa hình thời gian chạy (Run-Time Polymorphism)

Bất cứ khi nào một đối tượng bị ràng buộc với chức năng trong thời gian chạy thì được gọi là đa hình thời gian chạy. Tính đa hình thời gian chạy có thể đạt được bằng ghi đè phương thức (Overriding) . Máy ảo Java xác định phương thức thích hợp để gọi trong thời gian chạy, không phải lúc biên dịch, nó cũng được gọi là ràng buộc động. Ghi đè phương thức (Overriding) cho biết lớp con có cùng phương thức như được khai báo trong lớp cha, có nghĩa là nếu lớp con cung cấp việc triển khai cụ thể của phương thức đã được cung cấp bởi một trong các lớp cha của nó thì nó được gọi là phương thức ghi đè. Sau đây là một ví dụ trong đó đa hình thời gian chạy.

// Java program to demonstrate 
// runtime polymorphism 
  
// Implementing a class 
class Test { 
  
    // Implementing a method 
    public void method() 
    { 
        System.out.println("Method 1"); 
    } 
} 
  
// Defining a child class 
public class GFG extends Test { 
  
    // Overriding the parent method 
    public void method() 
    { 
        System.out.println("Method 2"); 
    } 
  
    // Driver code 
    public static void main(String args[]) 
    { 
        Test test = new GFG(); 
  
        test.method(); 
    } 
} 

Đầu ra:

Method 2

4. So sánh 2 dạng đa hình

Bảng sau đây cho thấy sự khác biệt giữa đa hình thời gian chạy và đa hình thời gian biên dịch:

STT

Compile polymorphism

(Đa hình thời gian biên dịch)

run time polymorphism

(Đa hình thời gian chạy)

1

Trong đa hình thời gian biên dịch, lời gọi hàm được giải quyết bởi trình biên dịch.

Trong đa hình thời gian chạy, lời gọi hàm không được giải quyết bởi trình biên dịch.

2

Nó còn được gọi là liên kết tĩnh, liên kết sớm.

Sử dụng nạp chồng phương thức (Overloading)

Nó còn được gọi là ràng buộc động, ràng buộc muộn.

Sử dụng ghi đè phương thức (Overriding)

3

Nạp chồng phương thức (Overloading) là đa hình thời gian biên dịch  trong đó có nhiều hơn một phương thức chia sẻ cùng tên với các  tham số hoặc chữ ký khác nhau và kiểu trả về khác nhau.

Ghi đè phương thức (overriding) là đa hình thời gian chạy có cùng phương thức với cùng tham số hoặc chữ ký, nhưng được liên kết trong các lớp khác nhau.

4

Nó đạt được bằng cách nạp chồng hàm và nạp chồng toán tử.

Nó đạt được bởi các chức năng ảo và con trỏ.

5

Nó cung cấp thực thi nhanh bởi vì phương thức cần được thực thi, được biết sớm vào thời gian biên dịch.

Nó cung cấp thực thi chậm so với ràng buộc sớm bởi vì phương thức cần được thực thi, biết đến trong thời gian chạy.

6

Đa hình thời gian biên dịch kém linh hoạt vì tất cả mọi thứ thực hiện  tại thời gian biên dịch.

Đa hình thời gian chạy linh hoạt hơn khi tất cả mọi thứ thực hiện tại thời gian chạy.

vncoder logo

Theo dõi VnCoder trên Facebook, để cập nhật những bài viết, tin tức và khoá học mới nhất!



Khóa học liên quan

Khóa học: Java

Tổng hợp Bài tập Java có lời giải
Số bài học:
Lượt xem: 17331
Đăng bởi: Admin
Chuyên mục: Java

Lập trình Java cơ bản
Số bài học:
Lượt xem: 39873
Đăng bởi: Admin
Chuyên mục: Java