Java - Различия в типе во время выполнения

У меня есть две ситуации, и странные различия между ними вызывают у меня немного горя. Я попытаюсь подробно описать их ниже в коде.

Ситуация 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...

Почему в первой ситуации тип времени выполнения параметра не используется, а во второй ситуации он используется? Я понимаю, что примеры на самом деле разные вещи, но мне больше любопытно, что происходит » под одеялом »здесь.

5
задан nicholas.hauschild 14 May 2011 в 00:05
поделиться