Java - 运行时输入差异

时间:2011-05-14 00:05:49

标签: 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...

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

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

2 个答案:

答案 0 :(得分:6)

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

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

答案 1 :(得分:2)

情境#1是方法重载,在编译时是静态的。情境#2是多态,在运行时是动态的。