什么是运行时绑定?

我正在浏览android开发培训文档并偶然发现:

“Intent是一个在不同组件之间提供运行时绑定的对象(例如两个活动)。”

任何人都在关心解释什么是运行时绑定?

谢谢!

inheritance创建类型兼容性。 它允许超类引用引用子类的对象。 (反向不是真的)。

引用子类对象的超类引用只能用于访问子类的inheritance和重写方法。 使用超类的引用无法访问子类中新定义的成员。

class A { void f1() { //this holds address of object of B System.out.println("A f1"); } void f2() { System.out.println("A f2"); } }//A class B extends A { void f3() { //new method System.out.println("B f3"); } void f2() { //this holds address of object of B System.out.println("B f2 starts"); f3(); //this.f3() System.out.println("B f2 ends "); } } //B class TypeCmptbl { public static void main(String args[]) { A ref; //reference of A ref = new B();//Object of B //ref.inherited() allowed ref.f1(); //ref.overridden() allowed ref.f2(); //ref.newMembersOfChild() not allowed //ref.f3(); }//main } 

考虑一下这句话

  ref.f2(); 

这里ref是A类的引用,它具有B类对象的地址f2()是一个重写方法。

当编译器检测到这样的语句时,它不会将函数调用与任何定义绑定。 它只validation通话。

这些调用的绑定留给运行时环境。 在程序运行时,系统识别对象的数据类型,并使用对象类提供的函数定义绑定函数调用。 函数调用和函数定义之间的这种类型的绑定称为“后期绑定”或“ 运行时绑定 ”或“ 运行时多态 ”或“ 动态方法调度 ”。

运行时绑定与动态绑定或后期绑定相同。 动态绑定基本上意味着实际调用的方法实现是在运行时确定的,而不是在编译时确定的。 这就是为什么它被称为动态绑定 – 因为将在运行时选择将运行的方法。

动态绑定是指编译器无法解析调用且绑定仅在运行时完成的情况。 让我们试着理解这一点。 假设我们有一个名为’SuperClass’的类,另一个名为’SubClass’的类扩展了它。 现在,’SuperClass’引用也可以分配给’SubClass’类型的对象。 如果我们在’SuperClass’中有一个方法(比如’someMethod()’),我们在’SubClass’中覆盖它,那么’SuperClass’引用上的该方法的调用只能在运行时解析,因为编译器不能确保此引用在运行时指向的对象类型。

 ... SuperClass superClass1 = new SuperClass(); SuperClass superClass2 = new SubClass(); ... superClass1.someMethod(); // SuperClass version is called superClass2.someMethod(); // SubClass version is called .... 

在这里,我们看到即使对象引用superClass1和superClass2都只是’SuperClass’类型,但在运行时它们分别引用类型’SuperClass’和’SubClass’的对象。

因此,在编译时,编译器无法确定对这些引用上的方法’someMethod()’的调用是否实际引用了该方法的哪个版本 – 超类版本或子类版本。

因此,我们看到Java中的动态绑定只是绑定方法调用(只有在子类中可以覆盖的inheritance方法,因此编译器可能无法确定要调用的方法版本),具体取决于实际的对象类型和不在对象引用的声明类型上。

从以下网站复制

一些简短的研究可以引导您访问http://en.wikipedia.org/wiki/Late_binding 。

用于防止某些死链接的简短定义:运行时绑定是一种计算机编程机制,在该机制中,在运行时按名称查找对象调用的方法。

后期绑定或动态绑定是一种计算机编程机制,其中在运行时通过名称查找对象调用的方法。 通过早期绑定或静态绑定,编译阶段可以修复所有类型的变量和表达式。

静态绑定

 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();//Cars 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的内部启动方法