Лучший вопрос может быть "Почему в C # есть не виртуальные методы?" Или, по крайней мере, почему они не являются виртуальными по умолчанию с возможностью пометить их как не виртуальные?
В C ++ существует идея (как так замечательно сказал Брайан), что если вы не хотите этого, вы не платите за это. Проблема в том, что если вы этого хотите, это обычно означает, что вы в конечном итоге платите за это через нос. В большинстве реализаций Java они предназначены для множества виртуальных вызовов; реализации vtable обычно бывают быстрыми, чуть дороже, чем не виртуальные вызовы, а это означает, что основное преимущество не виртуальных функций потеряно. Кроме того, JIT-компиляторы могут встроить виртуальные функции во время выполнения. Таким образом, из соображений эффективности, на самом деле до очень мало причин использовать не виртуальные функции.
Таким образом, это в значительной степени сводится к принципу наименьшего удивления. Это говорит нам о том, что все методы ведут себя одинаково, не половина из них является виртуальной, а половина - не виртуальной. Поскольку для достижения этой цели полиморфизма нам нужно иметь хотя бы несколько виртуальных методов, имеет смысл, чтобы они все были виртуальными. Кроме того, наличие двух методов с одной и той же сигнатурой - это просто просьба выстрелить себе в ногу.
Полиморфизм также диктует, что сам объект должен контролировать то, что он делает. Его поведение не должно зависеть от того, думает ли клиент, что это FooParent или FooChild.
РЕДАКТИРОВАТЬ: Таким образом, меня вызывают на мои утверждения. Следующий абзац - это предположение с моей стороны, а не констатация факта.
Интересным побочным эффектом всего этого является то, что Java-программисты, как правило, очень интенсивно используют интерфейсы. Поскольку благодаря оптимизации виртуальных методов стоимость интерфейсов практически не существует, они позволяют вам использовать список (например) вместо ArrayList и переключать его на LinkedList в более поздние сроки с простым изменением в одну строку без дополнительного штрафа.
РЕДАКТИРОВАТЬ: Я также пони пару источников. Хотя они и не являются первоисточниками, они все-таки получены от Sun и объясняют некоторые принципы работы HotSpot.
Встраивание
* 1022 виртуальные таблицы *