Apart from automatic memory management, in what ways is Java better?
Its much easier to deploy and support Java applications on a range of platforms because Java only has to be compiled once Java has superb run-time monitoring tools available. Because Java dynamically loads classes compiling changes in a large Java application can be much faster, as only relevant classes need be re-compiled. Java supports Unicode by default. Because Java compilation is done at run-time the compiler can produce extremely optimised code based on the current loaded state of the application, not the entire codebase. This results in things like method calls being inlined if only one class in a class hierarchy is loaded. Java supports concurrency by default. The Java runtime provides a rich and consistent environment across all platforms, no matter what the capabilities of individual processors. Because Java compilation is done at run-time a program can be compiled to instructions that are available on each individual processor, rather than having to be compiled once for an entire processor family. Java includes a high-quality cross-platform user interface framework by default (Swing). Java includes a very rich standard library as part of every installation. Java applications dont always crash whenever there is a bug. Exceptions can generate stack traces and halt the current thread, but programs can continue. Java excludes features which were found to result in hard-to-support complexity in C++, such as multiple inheritance of state and operator overloading. The backwards compatibility of Java combined with the use of a VM means that code compiled decades ago will run on modern machines without the need for re-compilation. Java has security settings so that the effects of code can be restricted. Because class information is retained at run-time Java can perform reflection. Java byte code is a very compact way of describing functionality, making it suitable for use in embedded systems.