1 回答
TA贡献1909条经验 获得超7个赞
基本上,每次调用方法时,编译器都必须根据传递给方法的类型和参数来确定要调用哪个重载。这是静态绑定。然后在运行时,运行时将确定要调用哪个重载实现(此时已经决定)。
考虑:
class A
{
void f(Object o)
{
System.out.println("From A");
}
}
class B extends A
{
void f(Object o)
{
System.out.println("From B (Object)");
}
void f(String s)
{
System.out.println("From B (String)");
}
}
你也是:
A a = new B();
a.f("");
会发生什么?f(Object)
在编译时,编译器根据a
存在的类型选择了重载A
(只有一种方法可供选择!)。然后在运行时,由于a
实际上引用了 的实例B
,因此调用重载B
的实现,打印。我见过的一种误解是期望输出为. 这是错误的,因为编译器不知道.f(Object)
From B (Object)
From B (String)
a
动态绑定总是在静态绑定之后产生吗?
从上面代码的结果我们可以看出,答案是肯定的。静态绑定发生在编译时,动态绑定发生在运行时,因此前者总是先发生。
如果这是真的,那么每个方法在运行时都是动态链接的说法是真的吗?
我不确定你的意思,所以希望上面的详细解释已经回答了这个问题。
不管怎样,每次方法调用总是会有静态绑定,然后动态绑定?
是的,但有时这两个过程可能会进行得很快,因为选择很少。当您调用方法的类是最终类时,您可能不需要在动态绑定中做出“选择”,是吗?
添加回答
举报