× Giới thiệu Lịch khai giảng Tin tức Sản phẩm học viên

Gắn kết tĩnh gắn kết động trong Java - Sự khác biệt và ví dụ cụ thể

14/06/2021 01:31

Tính đa hình trong Java là một trong những tính năng OOP cho phép một đối tượng xuất hiện ở nhiều dạng. Khi một phương thức thể hiện tính đa hình, trình biên dịch sẽ ánh xạ tên của phương thức đó đến phần thực hiện cuối cùng. Trong bài viết này, chúng ta sẽ thảo luận về cách gắn kết tĩnh và động trong Java khác nhau như thế nào cùng các ví dụ cụ thể minh họa cho cả hai phương thức.

Khái niệm gắn kết tĩnh, gắn kết động trong Java

Gắn kết (binding) có nghĩa là một liên kết của lời gọi phương thức với định nghĩa phương thức. Có hai loại gắn kết là: Static và Dynamic Binding trong Java. Nếu trình biên dịch ánh xạ phương thức tại thời điểm biên dịch, nó là Liên kết tĩnh hoặc gắn kết sớm. Và, nếu phương thức được giải quyết trong thời gian chạy, nó là Liên kết động hoặc Gắn kết muộn.

Khái niệm gắn kết tĩnh, gắn kết động trong Java

Khái niệm gắn kết tĩnh, gắn kết động trong Java

Static Binding hoặc Early Binding trong Java đề cập đến một quá trình trong đó trình biên dịch xác định loại đối tượng và giải quyết phương thức trong thời gian biên dịch. Nói chung, trình biên dịch liên kết các phương thức được nạp chồng bằng cách sử dụng liên kết tĩnh.

Có một sự thật là ràng buộc của các phương thức static, private và cuối cùng luôn được thực hiện trong thời gian biên dịch bằng cách sử dụng static-binding.

Tại sao gắn kết của các phương thức tĩnh, final và riêng tư luôn là gắn kết tĩnh?

Lý do cho gắn kết của các phương thức private, final và static trong thời gian biên dịch là trình biên dịch xác định loại lớp tại thời gian biên dịch và do đó chúng ta không thể ghi đè chúng trong thời gian chạy. Một lý do khác là liên kết tĩnh của các phương thức cung cấp hiệu suất tốt hơn liên kết thời gian chạy. Trình biên dịch nhận thức được các phương thức này và hiểu rằng không thể ghi đè phương thức với các phương thức như vậy. Các phương thức này chỉ có thể được truy cập bởi đối tượng của lớp cục bộ. Do đó gắn kết của các phương thức này luôn diễn ra trong quá trình biên dịch.

>>> Đọc thêm: Đa luồng trong Java - Tìm hiểu về lập trình đa luồng trong Java

Ví dụ về gắn kết tĩnh trong Java

Giả sử chúng ta có hai lớp tên là Person và Teacher. Lớp Teacher mở rộng lớp Person. Cả hai lớp này đều có các phương thức giống nhau được gọi là speak (). Tuy nhiên, phương thức này là tĩnh nên chúng ta không thể ghi đè nó. Do đó, ngay cả khi chúng ta sử dụng đối tượng của lớp Teacher thì nó cũng gọi phương thức của lớp Person.

Ví dụ:

package com.techvidvan.binding;

class Person

{

  public void speak()

  {

    System.out.println("Person speaks");

  }

}

class Teacher extends Person

{

  public static void speak()

  {

    System.out.println("Teacher speaks");

  }

}

public class StaticBinding

{

  public static void main( String args[ ])

  {

    // Reference is of Person type and object is Teacher type

    Person obj = new Teacher();

    obj.speak();

    //Reference and object both are of Person type.

    Person obj2 = new Person();

    obj2.speak();

  }

}

Output

Person speaks

Person speaks

Từ đoạn mã trên, chúng tôi nhận được cùng một đầu ra từ lớp cha. Điều này xảy ra bởi vì:

  • Tham chiếu cho lớp cha và lớp con là giống nhau (Person). Có nghĩa là, một đối tượng duy nhất đề cập đến cả hai.
  • Vì phương thức là tĩnh, trình biên dịch biết rằng phương thức này không thể bị ghi đè trong lớp con và nó biết phương thức nào cần gọi. Do đó không có sự mơ hồ và đầu ra là như nhau cho cả hai trường hợp.

Gắn kết động/ Gắn kết muộn trong Java

Khi trình biên dịch giải quyết ràng buộc cuộc gọi phương thức trong quá trình thực thi chương trình, quá trình như vậy được gọi là Liên kết động hoặc Kết thúc muộn trong Java. Chúng tôi cũng gọi Gắn kết động vì ràng buộc diễn ra trong quá trình thực thi thực tế của chương trình.

Ví dụ tốt nhất về gắn kết động là Ghi đè phương thức trong đó cả lớp cha và lớp dẫn xuất có cùng một phương thức. Và, do đó kiểu của đối tượng xác định phương thức nào sẽ được thực thi. Loại đối tượng được xác định trong quá trình thực hiện chương trình, do đó nó được gọi là ràng buộc động.

>>> Đọc thêm: Trình biên dịch ngược trong Java mà mọi lập trình viên cần nằm lòng

Sự khác biệt giữa gắn kết tĩnh, gắn kết động trong Java

 

STT

Gắn kết tĩnh

Gắn tĩnh động

1

Một kiểu đ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.

Một kiểu đa hình thu thập thông tin để gọi một phương thức trong thời gian chạy.

2

Sự gắn kết xảy ra tại thời điểm biên dịch.

Ràng buộc xảy ra trong thời gian chạy.

3

Đối tượng thực tế không được sử dụng để gắn kết.

Đối tượng thực tế được sử dụng để ràng buộc.

4

Nó cũng được gọi là gắn kết sớm vì ràng buộc xảy ra trong quá trình biên dịch.

Nó cũng được gọi là ràng buộc muộn vì ràng buộc xảy ra tại thời gian chạy.

5

Tốc độ thực thi cao.

Tốc độ thực thi chậm.

6

Nạp chồng phương thức là ví dụ tốt nhất về gắn kết tĩnh.

Ghi đè phương thức là ví dụ tốt nhất về ràng buộc động.

7

Các phương thức riêng tư, tĩnh và cuối cùng, hiển thị gắn kết tĩnh vì chúng tôi không thể ghi đè chúng.

Các phương thức private, static và final method khác hiển thị ràng buộc động vì có thể ghi đè với các phương thức này.

 

>>> Tham khảo: Khóa học Java Web

Kết luận: Gắn kết là một phần không thể thiếu của bất kỳ ngôn ngữ lập trình hướng đối tượng nào. Đây là một chủ đề quan trọng trong bất kỳ ngôn ngữ lập trình nào và mỗi lập trình viên phải biết hoạt động của nó cũng như hai dạng của nó mà chúng ta đã thảo luận trong bài viết này. 

Gắn kết có thể là Tĩnh hoặc Động. Biểu mẫu phụ thuộc vào thời điểm mà lời gọi phương thức bị ràng buộc với định nghĩa phương thức; thời gian biên dịch hoặc trong thời gian chạy. Chúng ta đã thảo luận cả hai loại này với một số ví dụ cụ thể, hy vọng bạn đã hiểu rõ về hai loại gắn kết này. Tìm hiểu thêm về Java và các ngôn ngữ lập trình khác qua các khóa học lập trình trong Java  tại Viện công nghệ thông tin T3H bạn nhé!