我正在浏览Android开发培训文档并偶然发现:
“Intent是一个在不同组件之间提供运行时绑定的对象(例如两个活动)。”
有人想解释什么是运行时绑定吗?
谢谢!
答案 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
复制