Возможно, хорошим вариантом будет
Rust . Это молодой язык, и не факт, что он пригодится вам в ближайшие пару лет, но для обучения у него есть несколько преимуществ:
- С одной стороны, он предсказуем, как и C++, т.е. обычно достаточно очевидно, как будет выполняться тот или иной кусок кода на низком уровне. С другой, он достаточно прост (ненамного сложнее JAVA) и автоматизирует управление ресурсами (без сборщика мусора, но так даже лучше).
- Как и в C++, можно использовать абстракции с нулевой стоимостью (чего в Java нет в принципе), и для этого не требуется сложный шаблонный код.
- Компилятор обругает вас за допущенные ошибки. Если не обругает компилятор - в большинстве случаев будет ошибка времени выполнения. C++ тоже часто находит ошибки во время компиляции, но в Rust это реализовано лучше, при этом на C++ сложнее искать ошибки времени выполнения. В JAVA ошибки по большей части возникают во время выполнения, что не очень хорошо для обучения - многие ошибки на простых примерах просто не возникают.
- Модель управления ресурсами изначально учитывает многопоточность, что снижает вероятность возникновения ошибок в многопоточных программах.
- Есть стандартный менеджер пакетов и система сборки, чего сильно не хватает C++. У Java тоже есть неплохие менеджеры пакетов, но их несколько, пусть и совместимых, что иногда осложняет жизнь.
- У него неплохой стандартный учебник, в том числе на русском, в который я в любом случае рекомендую заглянуть: rurust.github.io/rust_book_ru/README.html . Правда, у С++ и Java тоже с этим особых проблем нет, разве что сложнее выбрать подходящий.
Если вы всё же выбираете между C++ и Java - выбор в основном должен зависеть от того, сколько времени вы готовы потратить на изучение. Для изучения C++ нужно несколько лет (существует мнение, что около 5 лет), при этом нет смысла изучать C++ на базовом уровне - его достоинства проявляются только при хорошем знании языка. Java проще для изучения, довольно быстро можно достичь уровня, необходимого для устройства на работу, многие перспективные инструменты изначально разрабатываются на/для Java (например, экосистема BigData сейчас вертится вокруг Java и Scala, многие СУБД тоже ориентированы на Java). Но в случае выбора другого языка для изучения Java потом при необходимости можно будет быстро освоить, да и популярные инструменты обычно предоставляют интерфейсы для других языков, так что ориентироваться на конкретные инструменты не стоит.
P.S. Я сам программирую на C++, Java (а чаще - Scala) использую только для научной работы (BigData и т.п.), и в целом C++ мне нравится больше. Но в будущем планирую перейти на Rust в качестве основного языка.