我有两种情况,他们之间的奇怪差异让我有点悲伤。我将尝试在下面的代码中详细介绍它们。
情况1:
public void doSomething(Object obj) {
//do something with obj
}
public void doSomething(String str) {
//do something similar to str, but apply some custom
//processing for String's
}
Object o = new String("s");
doSomething(o); // this will use the Object version...
情况2:
class Dog {
void makeSound() {
System.out.println("woof");
}
}
class Chihuahua extends Dog {
void makeSound() {
System.out.println("yip");
}
}
Dog dog = new Chihuahua();
dog.makeSound(); //will print 'yip', the Chihuahua version...
为什么,在情况一中,是未使用的参数的运行时类型,但在情况二中它是?我知道这些例子实际上是不同的东西,但我对这里的“幕后”内容更加好奇。
答案 0 :(得分:6)
在第一个示例中,从多个重载签名中选择方法签名。 Java语言规范说这是基于变量的静态类型完成的。
在第二个示例中,基于虚方法分派选择给定方法签名的实现。这是基于包含方法定义的类的运行时类型完成的。
答案 1 :(得分:2)
情境#1是方法重载,在编译时是静态的。情境#2是多态,在运行时是动态的。