关于Java中的静态和动态绑定

时间:2012-04-28 04:03:03

标签: java

请解释Java中静态和动态绑定的概念。

我所掌握的是Java中的静态绑定发生在编译期间,而动态绑定发生在运行时,静态绑定使用Type(Java中的Class)信息进行绑定,而动态绑定使用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");
    }
}

输出在Car的start方法内。请告知:这种理解是否正确,请提供更多示例。感谢。

2 个答案:

答案 0 :(得分:0)

静态绑定在编译时使用,通常与重载方法相同 - 示例中的sort()方法,其中参数的类型在编译时用于解析方法

动态绑定(dynamic dispatch)通常与多态和覆盖方法相关联 - 示例中的start()方法,其中 receiver (vehicle)的类型在运行时使用解决方法。

答案 1 :(得分:0)

我认为您已正确地对其进行了总结,并且shams也正确地为您添加了更多信息。只是为了给你添加更多信息,首先让我退一步说明方法定义与方法调用的关联称为绑定。因此,正确指出的静态绑定是编译器在编译时可以解析的绑定(也称为早期绑定或静态绑定)。另一方面,动态出价或后期绑定意味着编译器无法在编译时解析调用/绑定(它发生在运行时)。请参阅下面的一些示例:

//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