java中方法重载的行为

我尝试了以下代码

public class HelloWorld { public void printData(Test t) { System.out.println("Reached 1"); } public void printData(newTest t) { System.out.println("Reached 2"); } public void printData(newTest1 t) { System.out.println("Reached 3"); } public static void main(String args[]) { Test t1 = new Test(); HelloWorld h = new HelloWorld(); h.printData(t1); NewTest t2 = new NewTest(); h.printData(t2); NewTest1 t3 = new NewTest1(); h.printData(t3); Test t4 = new NewTest(); h.printData(t4); Test t5 = new NewTest1(); h.printData(t5); } } 

我有简单的课程

 class Test { } class NewTest extends Test { } class NewTest1 extends Test { } 

我得到的输出是

 Reached 1 Reached 2 Reached 3 Reached 1 Reached 1 

从输出看起来,当jvm决定执行哪个函数时,它只考虑引用的类型而不考虑对象的实际类型

为什么会这样? 为什么jvm不能考虑实际对象的类型而不是指向它的引用的类型?

函数重载是编译时多态,这里编译器决定调用哪个版本的方法。对于编译器来说,很难知道运行时的实际对象,所以它只检查引用类型而不管它指向的对象。