考虑以下简单的Java代码片段:
package p;
class Sup {
public Sup f() {return null;}
}
class Sub extends Sup {
@Override public Sub f() {return null;}
}
我使用Java Reflection列出了类Sub
的所有(声明的)方法,如下所示。
for(Method m : Sub.class.getDeclaredMethods())
System.out.println(m);
但是我收到了如下输出:
public p.Sub p.Sub.f()
public p.Sup p.Sub.f()
第一行非常合理,但第二行让我困惑(即使它的返回类型不同)。请解释为什么我得到方法public p.Sup p.Sub.f()
?在虚拟方法调用解析期间,JVM如何在运行时区分这两种方法?
谢谢。