The single most important feature of object oriented programming is encapsulation. Hiding implementation details is obviously crucial to writing maintainable code.
In C++, since you have uncontrolled pointers, it is possible for one badly written object to do literally anything to another. This means that encapsulation is broken, and that bugs are difficult to find.
Java doesn't have that problem, but it lacks basic const-ness. That's not strictly an object-oriented theoretical feature, but being able to declare that a method is read only, or that an object is read only, is a fantastic reliability enhancer in C++ that is not in Java.
Last, java's template mechanism is a pale imitation of C++. Not being able to parametrize classes is a huge loss for Java.
Because Java doesn't support pointers to methods, and reflection is too slow, it forces the use of many little objects when a function pointer would do. Some may consider that a good thing.