2009-03-13 30 views
23

Thời gian ràng buộc có thể được phân loại giữa hai loại: tĩnh và động. Sự khác biệt giữa ràng buộc tĩnh và động là gì?Sự khác nhau giữa ràng buộc tĩnh và động là gì?

Bạn có thể đưa ra ví dụ nhanh về từng ví dụ để minh họa thêm không?

+1

Nếu đó là bài tập về nhà, bạn sẽ được tốt hơn yêu cầu cho một bài phê bình của phản ứng kế hoạch của bạn; không cho câu trả lời hoàn toàn. –

+2

@Daniel L, tôi đánh dấu nó là bài tập về nhà. Đây không phải là câu hỏi trực tiếp trong bài tập về nhà của tôi. Tôi phải phân loại một loạt những thứ như tĩnh hoặc năng động và tôi đang cố gắng để làm sáng tỏ trong đầu của tôi mà là thông qua câu hỏi này. Nếu mọi người muốn trả lời họ sẽ. – KingNestor

+0

@KingNestor: Vâng, tôi thấy rằng đó là bài tập về nhà;] Tôi hiểu ý của bạn bây giờ. –

Trả lời

26

Trong các thuật ngữ chung nhất, liên kết tĩnh có nghĩa là các tham chiếu được giải quyết tại thời gian biên dịch.

Animal a = new Animal(); 
a.Roar(); // The compiler can resolve this method call statically. 

động ràng buộc có nghĩa là tài liệu tham khảo được giải quyết tại thời gian chạy.

public void MakeSomeNoise(object a) { 
    // Things happen... 
    ((Animal) a).Roar(); // You won't know if this works until runtime! 
} 
+1

Không đúng, nếu đối tượng a = new Animal(); –

+0

Đúng, mặc dù tôi nghĩ rằng nó đã được rõ ràng tôi đã cố gắng để được chung chung. Tôi điều chỉnh nó một chút. –

+3

Ví dụ sau của bạn vẫn là liên kết tĩnh. Typecast có thể hoặc không thành công, nhưng nếu typecast thành công, ngay cả khi 'Roar' là một phương thức ảo, mã sẽ bị ràng buộc vào khe vtable được liên kết tĩnh với' Animal.Roar() '. Dynamic binding chỉ xuất hiện trong C# khi sử dụng kiểu 'dynamic' mới, hoặc bằng cách sử dụng Reflection (ví dụ' a.GetType(). GetMethod ("Roar"). Gọi (a, null) '). Sau này sẽ làm việc với bất kỳ loại nào thực hiện một phương thức parameterless gọi là 'Roar', và trả về việc thực thi có nguồn gốc nhiều nhất (ngay cả khi một triển khai cơ sở là không ảo). – supercat

6

Điều đó phụ thuộc vào thời điểm liên kết xảy ra: tại thời gian biên dịch (tĩnh) hoặc khi chạy (động). Ràng buộc tĩnh được sử dụng khi bạn gọi một phương thức lớp đơn giản. Khi bạn bắt đầu giao dịch với các phân cấp lớp và các phương thức ảo, trình biên dịch sẽ bắt đầu sử dụng cái gọi là VTABLE s. Vào thời điểm đó trình biên dịch không biết chính xác phương thức nào cần gọi và nó phải đợi cho đến khi thời gian chạy tìm ra phương thức đúng để được gọi (điều này được thực hiện thông qua VTABLE). Điều này được gọi là ràng buộc động.

Xem bài viết trên Wikipedia Virtual tables để biết thêm chi tiết và tham khảo.

-4

Thực hiện ràng buộc tại thời gian biên dịch là ràng buộc tĩnh và ràng buộc được thực hiện tại thời gian chạy là liên kết động .Trong kiểu dữ liệu ràng buộc tĩnh của con trỏ, giải quyết phương thức được viện dẫn.But trong kiểu dữ liệu ràng buộc động của đối tượng giải quyết phương thức nào được gọi .

-4

* Thời gian thực hiện: - * liên kết các biến với giá trị của nó, cũng như ràng buộc biến đến vị trí lưu trữ cụ thể tại thời điểm thực hiện được gọi là ràng buộc thời gian thực hiện.

Nó có thể là hai loại

  1. trên nhập cảnh vào một chương trình con.
  2. Tại các điểm tùy ý trong thời gian thực hiện.

thời gian biên dịch RÀNG BUỘC: - (DỊCH TIME) Nó bao gồm những điều sau đây.

  1. Ràng buộc được chọn bởi lập trình viên.
  2. Sự ràng buộc được chọn bởi người dịch.
  3. Ràng buộc được chọn bởi bộ nạp.
1

Tôi đã xem câu trả lời hoàn hảo này của người dùng quora "Monis Yousuf". Anh giải thích điều này một cách hoàn hảo. Tôi đặt nó ở đây cho người khác.

Ràng buộc chủ yếu là một khái niệm trong lập trình hướng đối tượng liên quan đến Đa hình.

Trước tiên, hãy hiểu những gì Đa hình là. Sách nói rằng nó có nghĩa là "một tên và nhiều hình thức". Đúng, nhưng quá trừu tượng. Chúng ta hãy lấy một ví dụ thực tế.Bạn đi đến một "Bác sĩ", bác sĩ có thể là chuyên gia về mắt, chuyên gia ENT, Bác sĩ phẫu thuật thần kinh, Homeopath, v.v.

Ở đây, "bác sĩ" là tên và có thể có nhiều loại; mỗi người thực hiện chức năng riêng của họ. Đây là tính đa hình trong đời thực.

Quá tải hàm: Khái niệm này mô tả Ràng buộc tĩnh. Hàm nạp chồng có thể được định nghĩa gần như, hai hoặc nhiều phương thức (hàm) có cùng tên nhưng chữ ký khác nhau (bao gồm số tham số, kiểu tham số, kiểu trả về khác nhau) được gọi là phương thức quá tải (hoặc hàm).

Giả sử bạn phải tính diện tích hình chữ nhật và hình tròn. Xem mã bên dưới: -

class CalculateArea { 

    private static final double PI = 3.14; 

    /* 
     Method to return area of a rectangle 
     Area of rectangle = length X width 
    */ 
    double Area(double length, double width) { 
     return (length * width); 
    } 

    /* 
     Method to return area of circle 
     Area of circle = π * r * r 
    */ 
    double Area(double radius) { 
     return PI * radius * radius; 
    } 
} 

Trong mã trên, có hai phương pháp "Khu vực" với các thông số khác nhau. Kịch bản này đủ điều kiện làm quá tải hàm.

Bây giờ, đến với câu hỏi thực: Làm thế nào là ràng buộc tĩnh này?

Khi bạn gọi bất kỳ hàm nào ở trên trong mã của mình, bạn phải chỉ định tham số bạn đang truyền. Trong tình huống này, bạn sẽ vượt qua một trong hai:

  • Hai tham số kiểu double [Mà sẽ gọi phương pháp đầu tiên, để tính toán là một hình chữ nhật]
  • tham số đơn kiểu double [Mà sẽ gọi thứ hai để tính toán diện tích của một vòng tròn]

Vì vậy, tại thời gian biên dịch trình biên dịch java có thể tìm ra, chức năng gọi, đó là ràng buộc biên dịch (hoặc STATIC).

Ghi đè chức năng: Ghi đè chức năng là khái niệm được hiển thị trong kế thừa. Nó có thể gần như được định nghĩa là: khi có một phương thức có trong một lớp cha và lớp con của nó cũng có cùng phương thức với chữ ký SAME, nó được gọi là hàm ghi đè. [Có nhiều hơn với nó, nhưng vì lợi ích của sự đơn giản, tôi đã viết định nghĩa này] Nó sẽ dễ hiểu hơn với đoạn mã dưới đây.

class ParentClass { 
    int show() { 
     System.out.println("I am from parent class"); 
    } 
} 

class ChildClass extends ParentClass{ 
    int show() { 
     System.out.println("I am from child class"); 
    } 
} 

class SomeOtherClass { 
    public static void main (String[] s) { 
     ParentClass obj = new ChildClass(); 
     obj.show(); 
    } 
} 

Trong đoạn code trên, phương pháp show() đã được ghi đè như cùng một chữ ký (và tên) hiện diện trong cả hai lớp phụ huynh và trẻ em.

Trong lớp thứ ba, SomeOtherClass, Biến tham chiếu (obj) loại ParentClass giữ đối tượng ChildClass. Tiếp theo, phương thức show() được gọi từ cùng một biến tham chiếu (obj).

Một lần nữa, cùng một câu hỏi: Liên kết động này như thế nào?

Khi biên dịch, trình biên dịch kiểm tra biến Tham chiếu là loại ParentClass và kiểm tra xem phương thức show() có trong lớp này không. Khi nó kiểm tra điều này, việc biên dịch thành công.

Bây giờ, khi chương trình chạy, nó thấy rằng đối tượng là ChildClass và do đó, nó chạy phương pháp show() của ChildClass. Vì quyết định này được thực hiện vào lúc RUNTIME, nó được gọi là Binding động (hoặc đa hình thời gian chạy).

Link cho câu trả lời ban đầu

Các vấn đề liên quan