Java - 运行时输入差异

nic*_*ild 5 java runtime

我有两种情况,它们之间的奇怪差异让我有点悲伤.我将尝试在下面的代码中详细介绍它们.

情况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)

为什么,在情况一,是未使用的参数的运行时类型,但在情况二,它是?我知道这些例子实际上是不同的东西,但我对这里的"幕后"内容更加好奇.

Mik*_*uel 6

在第一示例中,从多个过载签名中选择方法签名.Java语言规范说这是基于变量的静态类型完成的.

在第二示例中,基于虚拟方法分派选择给定方法签名的实现.这是基于包含方法定义的类的运行时类型完成的.