我有两种情况,它们之间的奇怪差异让我有点悲伤.我将尝试在下面的代码中详细介绍它们.
情况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...
Run Code Online (Sandbox Code Playgroud)
情况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...
Run Code Online (Sandbox Code Playgroud)
为什么,在情况一,是未使用的参数的运行时类型,但在情况二,它是?我知道这些例子实际上是不同的东西,但我对这里的"幕后"内容更加好奇.
在第一示例中,从多个过载签名中选择方法签名.Java语言规范说这是基于变量的静态类型完成的.
在第二示例中,基于虚拟方法分派选择给定方法签名的实现.这是基于包含方法定义的类的运行时类型完成的.