什么是运行时绑定?

时间:2013-12-30 00:27:49

标签: java

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

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

有人想解释什么是运行时绑定吗?

谢谢!

4 个答案:

答案 0 :(得分:6)

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

超级引用,引用 子类的对象,只能用于 访问继承和重写 子类的方法。 在子类中新定义的成员 无法参考 超级。

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()是一种重写方法。

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

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

答案 1 :(得分:2)

一些简短的研究可能会引导您进入http://en.wikipedia.org/wiki/Late_binding

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

答案 2 :(得分:2)

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

答案 3 :(得分:2)

动态绑定是指编译器无法解析调用且绑定仅在运行时完成的情况。让我们试着理解这一点。假设我们有一个名为'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中的动态绑定只是绑定方法调用(只能继承方法,因为它们可以在子类中被覆盖,因此编译器可能无法确定要调用哪个版本的方法)基于实际对象类型而不是对象引用的声明类型。

从以下site

复制