Java - различия между типами исполнения - PullRequest
5 голосов
/ 14 мая 2011

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

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

6 голосов
/ 14 мая 2011

В первом примере сигнатура метода выбирается из числа перегруженных сигнатур. В спецификации языка Java сказано, что это делается на основе статического типа переменных.

Во втором примере реализация данной сигнатуры метода выбирается на основе диспетчеризации виртуального метода. Это делается на основе типа времени выполнения класса, содержащего определение метода.

2 голосов
/ 14 мая 2011

Ситуация # 1 - перегрузка метода, которая статична во время компиляции. Ситуация №2 - это полиморфизм, который динамичен во время выполнения.

...