【发布时间】:2026-01-22 19:30:01
【问题描述】:
我在某处读到运行时多态性是语言动态类型的结果。通过检查下面的代码,我们可以看到运行时多态性的一个清晰示例。
class A{
do(){}
}
class B extends A{
do(){}
}
...
A ex = new B();
ex.do();
由于存在超类类型引用,编译器无法决定哪个类型将实际引用引用并在运行时绑定方法。但是下面使用相同类定义的用法呢?
我的第一个问题是针对下面的示例;
class A{
do(){}
}
class B extends A{
//no overriding
}
...
A ex = new B();
ex.do();
层次结构中只有一个版本的方法 do()。系统是否仍然等待运行时绑定方法?还是在编译时绑定?
我的第二个问题是针对下面的示例;
class A{
do(){}
}
class B extends A{
do(){}
}
...
B ex = new B();
ex.do();
现在有子类(继承链中最低)类型引用。会在运行时绑定吗?
【问题讨论】:
-
在编译时很难确定有多少实现可用,因为有人可以在运行时添加它自己的实现。但是在运行时 JIT 可以推测层次结构并做以下事情*.com/a/33351238/1352098
标签: java jvm polymorphism compiler-optimization