请解释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方法内。请告知:这种理解是否正确,请提供更多示例。感谢。
答案 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();
}
}