这个问题是在我和我的朋友们准备考试的时候出现的。在调用静态分配变量的方法时,我们注意到了奇怪的行为。
代码>单词,所以我们开始:
class C {
public void a(double x) {}
}
class D extends C {
void b() {}
}
class F extends D {
void a(int i) {}
void a(double d) {}
现在,做
D foo = new F();
foo.a(1);
这会带来什么?好吧..它在F中运行方法a(double)!
这是我们认为发生的事情:
- 程序首先在静态类型D中寻找一个:那里什么都没有。
- 转到它的超类C。没有找到a(int)而是找到a(double)。
- 决定这是我的意思的签名(即a(双)),但首先,在所有这些搜索之后,让我们先看看它说的动态类型!
- 在 F 中运行a(double) !
它是否正确?这意味着它爬上了层次结构以找到一些适合从 int 到 double 的类型转换的方法。在此之后,它检查动态类型是否具有这个新解释的签名。
我注意到如果我添加
void a(int) {}
** 在C 类中,运行上面的调用时,它会在F中给我a(int) !
有人可以解释一下这个过程中涉及的机制吗?为什么代码会以这种方式运行/编译?这背后的技术原因是什么?关于类似情况,还有什么需要注意的吗()