为了清楚起见,我已经更详细地阐述了我的问题。
我在这里有这段代码,它使用覆盖的概念详细说明了动态绑定。
这是代码:
class Test {
public static void main(String [] args)
{
B b = new A();
b.p(10); // 10.0
b.p(10.0); // 10.0
}
}
class B
{
public void p(double i)
{
print(i*2);
}
}
class A extends B
{
public void p(double i)
{
print(i);
}
}
现在,解释说编译器无法确定在“编译时间”期间调用哪个方法。正是在“运行时”期间,编译器才知道需要调用的方法是子类方法,因为当我们重写时,我们正在查看实际类型。
与此代码对比:
class Test {
public static void main(String [] args)
{
B b = new A();
b.p(10); // 10.0
b.p(10.0); // 10.0
}
}
class B
{
public void p(double i)()
{
print(i*2);
}
}
class A extends B
{
public void p(int i)
{
print(i);
}
}
在此示例中,编译器可以识别在编译期间调用哪个方法。编译器如何在此示例中识别而无法识别上一个示例?问题:
术语“编译时间”和“运行时间”究竟是什么意思?编译器如何在编译时无法识别需要调用的函数是子类函数?