Потому что в Java философия дизайна сильно отличается от C ++. (Я не собираюсь обсуждать C # здесь.)
При разработке C ++ Stroustrup хотел включить полезные функции, независимо от того, как они могут быть использованы не по назначению. Можно много обойтись с множественным наследованием, перегрузкой операторов, шаблонами и различными другими функциями, но с ними также можно делать очень хорошие вещи.
Философия дизайна Java заключается в том, чтобы подчеркнуть безопасность в языковых конструкциях. В результате есть вещи, которые гораздо более неловко делать, но вы можете быть намного увереннее, что код, который вы просматриваете, означает то, что вы думаете.
Кроме того, Java была в значительной степени реакцией C ++ и Smalltalk, наиболее известных ОО-языков. Существует множество других ОО-языков (Common Lisp был фактически первым стандартизированным языком) с различными ОО-системами, которые лучше справляются с MI.
Не говоря уже о том, что в Java вполне возможно сделать MI, используя интерфейсы, композицию и делегирование. Он более явный, чем в C ++, и, следовательно, более громоздкий в использовании, но даст вам то, что вы, скорее всего, поймете на первый взгляд.
Здесь нет правильного ответа. Существуют разные ответы, и какой из них лучше для данной ситуации, зависит от приложений и индивидуальных предпочтений.