2012-04-28 50 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