这是一个纯粹的理论问题。
给定三个简单的类:
class Base {
}
class Sub extends Base {
}
class SubSub extends Sub {
}
还有一个旨在对这些类进行操作的函数:
public static void doSomething(Base b) {
System.out.println("BASE CALLED");
}
public static void doSomething(Sub b) {
System.out.println("SUB CALLED");
}
似乎以下代码:
SubSub ss = new SubSub();
doSomething(ss);
可能会合法地导致打印 BASE CALLED 或 SUB CALLED,因为 SubSub 可以同时转换为这两者。事实上,删除函数的 Sub 版本会导致打印 BASE CALLED。实际发生的是打印了“SUB CALLED”。这似乎意味着调用哪个函数不取决于定义函数的顺序,因为首先调用了基本版本。
Java 是否只查看函数的所有不同版本并选择需要最小遍历继承堆栈的版本?这是标准化的吗?它是否写在任何文档中?