JavaRush /Blog Java /Random-VI /Sự khác biệt giữa ràng buộc sớm và muộn trong Java

Sự khác biệt giữa ràng buộc sớm và muộn trong Java

Xuất bản trong nhóm
Để hiểu sự khác biệt giữa liên kết sớm (tĩnh) và liên kết muộn (động) trong Java, trước tiên bạn phải hiểu liên kết là gì . Liên kết có nghĩa là có sự kết nối giữa liên kết và mã. Ví dụ: một biến bạn tham chiếu được liên kết với mã mà nó được xác định. Tương tự như vậy, phương thức được gọi sẽ bị ràng buộc với vị trí trong mã nơi nó được xác định.
Sự khác biệt giữa liên kết sớm và muộn trong Java - 1
Có hai loại liên kết phương thức trong ngôn ngữ Java: liên kết sớm (còn gọi là tĩnh) và liên kết muộn (tương ứng là động) . Gọi một phương thức trong Java có nghĩa là phương thức đó được liên kết với mã cụ thể, tại thời điểm biên dịch hoặc thời gian chạy, khi chương trình chạy và các đối tượng được tạo. Như tên cho thấy, liên kết tĩnh có bản chất tĩnh hơn vì nó xảy ra vào thời gian biên dịch, nghĩa là mã “biết” phương thức nào sẽ gọi sau khi biên dịch mã nguồn Java thành các tệp lớp. Và vì điều này đề cập đến giai đoạn đầu của vòng đời chương trình nên nó còn được gọi là ràng buộc sớm. Mặt khác, liên kết động xảy ra trong thời gian chạy, sau khi chương trình được Máy ảo Java chạy. Trong trường hợp này, phương thức nào sẽ được gọi được xác định bởi đối tượng cụ thể, do đó thông tin không có sẵn tại thời điểm biên dịch vì các đối tượng được tạo trong thời gian chạy. Và vì điều này xảy ra muộn trong vòng đời của chương trình nên nó được gọi là liên kết muộn trong Java.
Vì vậy, sự khác biệt cơ bản giữa liên kết tĩnh và liên kết động trong Java là ở chỗ liên kết tĩnh xảy ra sớm, tại thời điểm biên dịch, dựa trên loại biến tham chiếu và liên kết động xảy ra sau, trong thời gian chạy, sử dụng các đối tượng cụ thể.
Hãy xem xét thêm một vài điểm khác biệt để hiểu rõ hơn về vấn đề này và cũng có thể trả lời câu hỏi rất phổ biến này trong các cuộc phỏng vấn Java.

Liên kết sớm và muộn trong Java

Có nhiều điểm khác biệt giữa liên kết tĩnh và liên kết động trong Java, nhưng điều quan trọng nhất là cách JVM sử dụng chúng. Bạn đã bao giờ tự hỏi làm thế nào JVM quyết định nên gọi phương thức nào khi có nhiều hơn một phương thức có cùng tên trong phạm vi? Nếu bạn đã từng sử dụng nạp chồng hoặc ghi đè phương thức, bạn biết rằng trong Java bạn có thể có nhiều phương thức có cùng tên. Trong trường hợp Java, JVM sử dụng cả liên kết tĩnh và động để chọn phương thức mong muốn.

Ví dụ về liên kết tĩnh và động trong Java

Trong chương trình này, bạn sẽ thấy rằng việc liên kết các phương thức ảo không xảy ra tại thời điểm biên dịch bằng cách sử dụng liên kết tĩnh, vì điều này sẽ gọi một phương thức từ siêu lớp, như xảy ra với các phương thức tĩnh được liên kết sớm. Nếu một phương thức từ một lớp con được gọi, thì một đối tượng cụ thể sẽ được sử dụng để liên kết hàm trong thời gian chạy và do đó liên kết động được sử dụng để liên kết các hàm ảo.
public class Main {
  public static void main(String[] args) {

    // Пример статического и динамического связывания в Java
    Insurance current = new CarInsurance();

    // Динамическое связывание на основе an object
    int premium = current.premium();

    // Статическое связывание на основе класса
    String category = current.category();

    System.out.println("premium : " + premium);
    System.out.println("category : " + category);
  }
}

class Insurance{
  public static final int LOW = 100;

  public int premium(){
    return LOW;
  }

  public static String category(){
    return "Insurance";
  }

}

class CarInsurance extends Insurance{
  public static final int HIGH = 200;

  public int premium(){
    return HIGH;
  }

  public static String category(){
    return "Car Insurance";
  }

}
Результаты выполнения:

premium : 200
category : Insurance
Như bạn có thể thấy, một cuộc gọi phương thức premium()dẫn đến việc thực thi một phương thức từ lớp con, trong khi một cuộc gọi phương thức category()dẫn đến việc thực thi một phương thức siêu lớp. Điều này là do premium()- là một phương thức ảo, được giải quyết bằng cách sử dụng liên kết muộn, trong khi category()- là một phương thức tĩnh, được giải quyết bằng cách sử dụng liên kết tĩnh tại thời gian biên dịch theo tên lớp.
Bạn muốn đọc về Java? Hãy tham gia nhóm Nhà phát triển Java !

Sự khác biệt giữa ràng buộc sớm và muộn trong Java

Bây giờ bạn đã nắm được cách Java liên kết các lệnh gọi phương thức cũng như cách hoạt động của liên kết tĩnh và liên kết động, hãy tóm tắt lại những điểm khác biệt chính giữa liên kết sớm và liên kết muộn trong Java:
  1. Liên kết tĩnh xảy ra trong thời gian biên dịch, trong khi liên kết động xảy ra trong thời gian chạy.

  2. Vì liên kết tĩnh xuất hiện sớm trong vòng đời của chương trình nên nó được gọi là liên kết sớm. Tương tự, liên kết động còn được gọi là liên kết muộn vì nó xảy ra muộn hơn trong quá trình thực thi chương trình.

  3. Liên kết tĩnh được sử dụng trong ngôn ngữ Java để giải quyết các phương thức bị quá tải trong khi liên kết động được sử dụng trong ngôn ngữ Java để giải quyết các phương thức bị ghi đè.

  4. Tương tự, các phương thức riêng tư, tĩnh và đầu cuối được giải quyết bằng liên kết tĩnh vì chúng không thể bị ghi đè, trong khi tất cả các phương thức ảo được giải quyết bằng liên kết động.

  5. Trong trường hợp liên kết tĩnh, không phải các đối tượng cụ thể được sử dụng mà là loại thông tin, tức là loại biến tham chiếu được sử dụng để khám phá phương thức mong muốn. Mặt khác, liên kết động sử dụng một đối tượng cụ thể để tìm phương thức mong muốn trong Java.
Đây là một bài tập hay dựa trên các khái niệm về liên kết tĩnh và động trong Java. Bạn có thể trả lời câu hỏi: "Điều gì sẽ xuất ra khi chương trình sau được thực thi?"
Sự khác biệt giữa liên kết sớm và muộn trong Java - 2
Chương trình này sẽ xuất ra cái gì? Collection, Sethoặc HashSet? Đó là tất cả những gì chúng tôi muốn nói với bạn về sự khác biệt giữa liên kết sớm (tĩnh) và liên kết muộn (động) trong Java. Đây là một trong những câu hỏi phỏng vấn qua điện thoại Java hay nhất vì nó mang lại khá nhiều cơ hội để kiểm tra kiến ​​thức chuyên sâu của ứng viên. Luôn nhớ rằng các phương thức riêng tư , tĩnh và cuối cùng được liên kết bằng cách sử dụng liên kết tĩnh , trong khi các phương thức ảo được liên kết bằng liên kết động . Tương tự, ví dụ tốt nhất về liên kết tĩnh là nạp chồng phương thức, trong khi ghi đè là động. Nguồn
Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION