Existe uma diferença fundamental na filosofia do Java e do C++.
Veja:
“C++ is designed to give the programmer choice, even if this makes it possible for the programmer to choose incorrectly” (Stroustroup, The Design and Evolution of C++)
“Primary characteristics of the Java programming language include a simple language that can be programmed without extensive programmer training while being attuned to current software practices.” (Sun, The Java Language Environment Whitepaper).
Percebe a contradição das duas afirmações? Em C++, ninguém está preocupado com a simplicidade da linguagem, ou com te prevenir de erros. Estão preocupados em te dar escolhas. Seja de paradigmas, técnicas, ou gerência de memória.
Já em java, a preocupação é de se ter uma linguagem e uma programação simples. Por isso, muitas vezes lemos em artigos conceitos como “esse recurso iremos retirar da linguagem por ser sujeito a erros”, “por as vezes gerar dúvidas”, etc… Recursos como sobrecarga de operadores, acesso direto a memória, templates, foram todos intencionalmente rejeitados pela linguagem.
Isso é uma coisa ruim? Não necessariamente. Boa parte das escolhas do C++ não são necessárias para o software do dia-a-dia. Existem nichos específicos que irão usar esses recursos como é o caso da indústria, dos jogos e dos institutos de pesquisa.