java中方法重载的行为

时间:2013-08-16 04:48:24

标签: java polymorphism overloading

我尝试了以下代码

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不能考虑实际对象的类型而不是指向它的引用的类型?

1 个答案:

答案 0 :(得分:3)

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