My tuppen’th:
(1) Java is more than just conventional OO - it really does allow component-oriented programming where the contracts are enforced via interfaces or discovered via reflection. For games this is a real win as game engines often have a lot of different components that must interact cleanly.
(2) The great corollary of (1) is that it is sooo much easier to bolt on a third party component to a Java system and expect the result to be well behaved - in stark contrast to C/C++ where you can’t even be sure all components are using the same malloc/free or where you get unexpected namespace pollution and you’re no longer calling the function you first thought of.
(3) And following further on with bean-flavoured programming you get some big wins in the design stage as well as being able to drop new modules in at runtime. This usually eliminates the need for an auxiliary scripting language.
(4) The net result of all this is a platform with a truly astounding set of APIs (all cleanly documented with javadoc) - not just Sun’s but all the FOSS contributions as well. I’m pulling together components from all over the place for my projects. So much effort saved, it’s unimaginable to have done it any other way.
(5) The final argument on performance is JNI which is a really good way of packaging up high-performance C++ code which can focus on raw number crunching using available vectorisation etc, but where all the high level structure is kept in Java. Tools like SWIG make this pretty damn easy. (I also like the discipline that goes with separating out the performance specific kernel of the algorithms from the data structures.)
Dave
Fuze3D: http://www.shortfuze.co.uk/shortfuze/template/Fuze3D,Index.vm
Machinimascope: http://www.shortfuze.co.uk/shortfuze/template/Machinima,Engine.vm