Единственной наиболее важной особенностью объектно-ориентированного программирования является инкапсуляция. Сокрытие деталей реализации, очевидно, имеет решающее значение для написания поддерживаемого кода.
В C ++, поскольку у вас есть неконтролируемые указатели, один плохо написанный объект может буквально что-то делать другому. Это означает, что инкапсуляция нарушена, и ошибки трудно найти.
У Java такой проблемы нет, но ей не хватает базового постоянства. Это не строго объектно-ориентированная теоретическая особенность, но возможность объявить, что метод только для чтения или объект только для чтения, является фантастическим средством повышения надежности в C ++, которого нет в Java.
Наконец, механизм шаблонов java - бледная имитация C ++. Неспособность параметризовать классы - огромная потеря для Java.
Поскольку Java не поддерживает указатели на методы, а отражение слишком медленное, оно заставляет использовать много маленьких объектов, когда указатель на функцию будет делать. Некоторые могут считать это хорошей вещью.