2012-04-28 65 views
1

請解釋Java中靜態和動態綁定的概念。關於Java中的靜態和動態綁定

我所掌握的是Java中的靜態綁定發生在編譯期間,而在運行期間發生動態綁定時,靜態綁定使用Type(Class in Java)信息進行綁定,而動態綁定使用Object來解析綁定。

這是我理解的代碼。

public class StaticBindingTest { 

    public static void main (String args[]) { 
     Collection c = new HashSet(); 
     StaticBindingTest et = new StaticBindingTest(); 
     et.sort (c);   
    } 

    //overloaded method takes Collection argument 
    public Collection sort(Collection c) { 
     System.out.println ("Inside Collection sort method"); 
     return c; 
    }  

    //another overloaded method which takes HashSet argument which is sub class 
    public Collection sort (HashSet hs){ 
     System.out.println ("Inside HashSet sort method"); 
     return hs; 
    }   
} 

和上述程序的輸出是集排序方法

動態綁定的內部...

public class DynamicBindingTest { 

    public static void main(String args[]) { 
     Vehicle vehicle = new Car(); //here Type is vehicle but object will be Car 
     vehicle.start();  //Car's start called because start() is overridden method 
    } 
} 

class Vehicle { 

    public void start() { 
     System.out.println("Inside start method of Vehicle"); 
    } 
} 

class Car extends Vehicle { 

    @Override 
    public void start() { 
     System.out.println ("Inside start method of Car"); 
    } 
} 

輸出是汽車的啓動方法裏面。請告知:這種理解是否正確,請提供更多示例。謝謝。

+0

這似乎成爲常態,這些天SO ... – 2012-04-28 04:26:39

回答

0

靜態綁定在編譯時使用,並且通常與重載方法共同使用 - 您的示例中的sort()方法在編譯時使用參數的類型來解析該方法。

動態結合(dynamic dispatch)通常隨多態性和壓倒一切的方法相關聯的 - 在您的示例的開始()方法,其中所述接收器(車輛)的類型是用來在運行時,以解決方法。

0

我想你已經正確地概括了它,並且正確地爲你添加了更多的信息。爲了給你添加更多的信息,首先讓我回過頭來說明方法定義與方法調用的關聯稱爲綁定。因此,正如您指出的那樣,靜態綁定是編譯器可以在編譯時解析的綁定(也稱爲早期綁定或靜態綁定)。另一方面,動態出價或延遲綁定意味着編譯器無法在編譯時解析調用/綁定(它發生在運行時)。請參閱下面的一些例子:

//static binding example 
class Human{ 
.... 
} 
class Boy extends Human{ 
    public void walk(){ 
     System.out.println("Boy walks"); 
    } 
    public static void main(String args[]) { 
     Boy obj1 = new Boy(); 
     obj1.walk(); 
    } 
} 

//Overriding is a perfect example of Dynamic binding 
package beginnersbook.com; 
class Human{ 
    public void walk() 
    { 
     System.out.println("Human walks"); 
    } 
} 
class Boy extends Human{ 
    public void walk(){ 
     System.out.println("Boy walks"); 
    } 
    public static void main(String args[]) { 
     //Reference is of parent class 
     Human myobj = new Boy(); 
     myobj.walk(); 
    } 
} 

source