为了说清楚,我已经更详细地阐述了我的问题.
我在这里有这个代码,它详细阐述了使用覆盖概念的动态绑定.
这是代码:
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);
}
}
Run Code Online (Sandbox Code Playgroud)
现在,解释说编译器无法确定在"编译时"期间调用哪个方法.正是在"运行时",编译器知道需要调用的方法是子类方法,因为当我们覆盖时,我们正在查看实际类型.
与此代码对比:
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);
}
}
Run Code Online (Sandbox Code Playgroud)
在此示例中,编译器可以识别在编译期间调用哪个方法.如果在前面的例子中无法识别int,那么编译器如何在此示例中识别?题:
术语"编译时间"和"运行时间"究竟是什么意思?以及如何做一个编译器不能在编译时是需要被调用的函数是子类的功能认识?
考虑以下(伪)代码:
B b = Rand() > 0.5?new A() : new B();
b.p(10);
Run Code Online (Sandbox Code Playgroud)
编译器无法知道在运行时将调用哪个.
| 归档时间: |
|
| 查看次数: |
2275 次 |
| 最近记录: |