Java es un lenguaje de programación que se creó con el objetivo de ser portable, rápido y seguro.
Java es por tanto al mismo tiempo un lenguaje compilado y interpretado. Los lenguajes interpretados históricamente siempre se han asociado con cierta lentitud, si bien Java es capaz de conseguir mayor rapidez gracias a que el bytecode puede a su vez ser compilado a código máquina nativo, algo que se hace «just-in-time» (JIT), es decir, en el momento en que la aplicación está corriendo. Dado que la optimización del código también provoca una penalización de velocidad, este proceso ha ido evolucionando hacia una «adaptive compilation» donde partiendo del código interpretado con acuerdo al uso real que se va haciendo de la aplicación se prioriza la optimización de los fragmentos de código más utilizados, aquellos que se ejecutan de manera repetitiva. El resto de código no se optimiza y se sigue interpretando cuando es necesaria su ejecución. Aun asi se puede decir que Java siempre estará penalizado en cuanto a velocidad con respecto a otros lenguajes como C o C++
Java es un lenguaje orientado a objetos, la unidad fundamental de Java es «la clase». El encapsulamiento de las clases en Java es una de las claves de su seguridad, la encapsulación oculta los datos y comportamientos en el interior de la clase. En otros lenguajes de programación como C o C++ se puede violar la encapsulación de clases privadas por ejemplo mediante el uso de «punteros«. Java no dispone de punteros, si bien dispone de referencias que son algo así como «punteros seguros» que no permiten aritmética de punteros.
Java también dispone de un recolector de basura (automatic garbage collector) lo que permite que el programador se despreocupe de la gestión de la memoria: cuando un objeto deja de estar en uso, el recolector lo borra liberando la memoria que ocupaba.