Ответ 1
http://www.artima.com/underthehood/invocationP.html Ссылка, приведенная выше, дает четкие примеры, которые дополняют мой вопрос.
class Superclass {
private void interestingMethod() {
System.out.println("Superclass interesting method.");
}
void exampleMethod() {
interestingMethod();
}
}
class Subclass extends Superclass {
void interestingMethod() {
System.out.println("Subclass interesting method.");
}
public static void main(String args[]) {
Subclass me = new Subclass();
me.exampleMethod();
}
}
При вызове main() в подклассе, как определено выше, он должен напечатать "Суперклассный интересный метод". Если invokevirtual был использован, он бы напечатал "Подкласс интересный метод". Зачем? Поскольку виртуальная машина выбирает метод interestingMethod() для вызова на основе фактического класса объекта, который является подклассом. Поэтому он будет использовать Subclass interestingMethod(). С другой стороны, с помощью invokespecial виртуальная машина выберет метод, основанный на типе ссылки, поэтому будет запущена версия суперкомплекса interestingMethod().