【发布时间】:2013-08-16 04:48:23
【问题描述】:
我尝试了以下代码
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 不能考虑实际对象的类型而不是指向它的引用的类型?
【问题讨论】:
-
Re:“当 jvm 决定执行哪个函数时,它只考虑引用的类型,而不考虑对象的实际类型”:更准确的说法是编译器不会延迟JVM 的决定,所以不是 JVM 做出这个决定。 (很明显,鉴于这一事实,为什么只考虑表达式的静态类型,而不考虑其值的运行时类型。)
-
另外,当你问“为什么”时,我并不完全清楚你在问什么。您是否要求提供指向 Java 语言规范 中指定此内容的部分的链接?您是否要求解释为什么以这种方式设计语言?你只是在口头上问“为什么”吗? :-P
-
类名应始终以 CAPS 开头,newTest 和 newTest1 不遵循编码约定。
标签: java polymorphism overloading