La compaa Sun desarroll la implementacin de referencia original para los compiladores de Java, mquinas virtuales y libreras de clases en 1991, y las public por primera vez en 1995. A partir de mayo de 2007, en cumplimiento de las especificaciones del Proceso de la Comunidad Java, Sun volvi a licenciar la mayora de sus tecnologas de Java bajo la Licencia Pblica General de GNU. Otros han desarrollado tambin implementaciones alternas a estas tecnologas de Sun, tales como el Compilador de Java de GNU y el GNU Classpath.
Java se cre como una herramienta de programacin para ser usada en un proyecto de set-top-box en una pequea operacin denominada the Green Project en Sun Microsystems en 1991. El equipo (green team), compuesto por trece personas y dirigido por James Gosling, trabaj durante 18 meses en Sand Hill Road, Menlo Park (California), para desarrollarlo.
Los objetivos de Gosling eran implementar una mquina virtual y un lenguaje con una estructura y sintaxis similar a C++. Entre junio y julio de 1994, tras una sesin maratoniana de tres das entre John Gage, James Gosling, Patrick Naughton, Wayne Rosing y Eric Schmidt, el equipo reorient la plataforma hacia la Web. Sintieron que la llegada del navegador web Mosaic propiciara que Internet se convirtiese en un medio interactivo, como el que pensaban era la televisin por cable. Naughton cre entonces un prototipo de navegador, WebRunner, que ms tarde sera conocido como HotJava.
En 1994, se les hizo una demostracin de HotJava y la plataforma Java a los ejecutivos de Sun. Java 1.0a pudo descargarse por primera vez en 1994, pero hubo que esperar al 23 de mayo de 1995, durante las conferencias de SunWorld, a que vieran la luz pblica Java y HotJava, el navegador Web. El acontecimiento fue anunciado por John Gage, el director cientfico de Sun Microsystems. El acto estuvo acompaado por una pequea sorpresa adicional, el anuncio por parte de Marc Andreessen, vicepresidente ejecutivo de Netscape, de que Java sera soportado en sus navegadores. El 9 de enero del ao siguiente, 1996, Sun fund el grupo empresarial JavaSoft para que se encargase del desarrollo tecnolgico.[2] Dos semanas ms tarde la primera versin de Java fue publicada.
La promesa inicial de Gosling era Write Once, Run Anywhere (Escrbelo una vez, ejectalo en cualquier lugar), proporcionando un lenguaje independiente de la plataforma y un entorno de ejecucin (la JVM) ligero y gratuito para las plataformas ms populares, de forma que los binarios (bytecode) de las aplicaciones Java pudiesen ejecutarse en cualquier plataforma.
Desde J2SE 1.4, la evolucin del lenguaje ha sido regulada por el JCP (Java Community Process), que usa Java Specification Requests (JSRs) para proponer y especificar cambios en la plataforma Java. El lenguaje en s mismo est especificado en la Java Language Specification (JLS), o Especificacin del Lenguaje Java. Los cambios en los JLS son gestionados en JSR 901.
Para conseguir la ejecucin de cdigo remoto y el soporte de red, los programadores de Java a veces recurren a extensiones como CORBA (Common Object Request Broker Architecture), Internet Communications Engine u OSGi, respectivamente.
La segunda caracterstica, la independencia de la plataforma, significa que programas escritos en el lenguaje Java pueden ejecutarse igualmente en cualquier tipo de hardware. As reza el axioma de Java: "write once, run anywhere" que traducido al espaol es: escribe una vez, ejecuta en cualquier parte.
Hay implementaciones del compilador de Java que convierten el cdigo fuente directamente en cdigo objeto nativo, como GCJ. Esto elimina la etapa intermedia donde se genera el bytecode, pero la salida de este tipo de compiladores solamente puede ejecutarse en un tipo de arquitectura.
Las primeras implementaciones del lenguaje usaban una mquina virtual interpretada para conseguir la portabilidad. Sin embargo, el resultado eran programas que se ejecutaban comparativamente ms lentos que aquellos escritos en C o C++. Esto hizo que Java se ganase una reputacin de lento en rendimiento. Las implementaciones recientes de la JVM dan lugar a programas que se ejecutan considerablemente ms rpido que las versiones antiguas, empleando diversas tcnicas, aunque sigue siendo mucho ms lentos que otros lenguajes[cita requerida].
La primera de estas tcnicas es simplemente compilar directamente en cdigo nativo como hacen los compiladores tradicionales, eliminando la etapa del bytecode. Esto da lugar a un gran rendimiento en la ejecucin, pero tapa el camino a la portabilidad. Otra tcnica, conocida como compilacin JIT (Just In Time, o "compilacin al vuelo"), convierte el bytecode a cdigo nativo cuando se ejecuta la aplicacin. Otras mquinas virtuales ms sofisticadas usan una "recompilacin dinmica" en la que la VM es capaz de analizar el comportamiento del programa en ejecucin y recompila y optimiza las partes crticas. La recompilacin dinmica puede lograr mayor grado de optimizacin que la compilacin tradicional (o esttica), ya que puede basar su trabajo en el conocimiento que de primera mano tiene sobre el entorno de ejecucin y el conjunto de clases cargadas en memoria. La compilacin JIT y la recompilacin dinmica permiten a los programas Java aprovechar la velocidad de ejecucin del cdigo nativo sin por ello perder la ventaja de la portabilidad en ambos.
El concepto de independencia de la plataforma de Java cuenta, sin embargo, con un gran xito en las aplicaciones en el entorno del servidor, como los Servicios Web, los Servlets, los Java Beans, as como en sistemas empotrados basados en OSGi, usando entornos Java empotrados.
En Java el problema de fugas de memoria se evita en gran medida gracias a la recoleccin de basura (o automatic garbage collector). El programador determina cundo se crean los objetos, y el entorno, en tiempo de ejecucin de Java (Java runtime), es el responsable de gestionar el ciclo de vida de los objetos. El programa, u otros objetos, pueden tener localizado un objeto mediante una referencia a este. Cuando no quedan referencias a un objeto, el recolector de basura de Java borra el objeto, liberando as la memoria que ocupaba previniendo posibles fugas (ejemplo: un objeto creado y nicamente usado dentro de un mtodo solamente tiene entidad dentro de este; al salir del mtodo el objeto es eliminado). Aun as, es posible que se produzcan fugas de memoria si el cdigo almacena referencias a objetos que ya no son necesarios; es decir, pueden an ocurrir, pero en un nivel conceptual superior. En definitiva, el recolector de basura de Java permite una fcil creacin y eliminacin de objetos y mayor seguridad.
La sintaxis de Java se deriva en gran medida de C++. Pero a diferencia de este, que combina la sintaxis para programacin genrica, estructurada y orientada a objetos, Java fue construido desde el principio para ser completamente orientado a objetos. Todo en Java es un objeto (salvo algunas excepciones), y todo en Java reside en alguna clase (recordemos que una clase es un molde a partir del cual pueden crearse varios objetos).
La sentencia import indica al compilador de Java que incluya las clases java.applet.Applet y java.awt.Graphics, para poder referenciarlas por sus nombres, sin tener que anteponer la ruta completa cada vez que se quieran usar en el cdigo fuente.
La clase Hola extiende (extends) a la clase Applet;es decir, es una subclase de sta. La clase Applet permite a la aplicacin mostrar y controlar el estado del applet. La clase Applet es un componente del AWT (Abstract Window Toolkit), que permite al applet mostrar una interfaz grfica de usuario o GUI (Graphical User Interface), y responder a eventos generados por el usuario.
La clase Hola extiende (extends) es heredera de la clase GenericServlet. Esta clase proporciona la interfaz para que el servidor le pase las peticiones al servlet y el mecanismo para controlar el ciclo de vida del servlet.
El constructor Hola() inicializa el marco o frame llamando al mtodo setDefaultCloseOperation (int) heredado de JFrame para establecer las operaciones por defecto cuando el control de cierre en la barra de ttulo es seleccionado al valor WindowConstants.DISPOSE_ON_CLOSE. Esto hace que se liberen los recursos tomados por la ventana cuando es cerrada, y no simplemente ocultada, lo que permite a la mquina virtual y al programa acabar su ejecucin. A continuacin se crea un objeto de tipo JLabel con el texto "Hola, mundo!", y se aade al marco mediante el mtodo add (Component), heredado de la clase Container. El mtodo pack(), heredado de la clase Window, es invocado para dimensionar la ventana y distribuir su contenido.
El mtodo main() es llamado por la JVM al comienzo del programa. Crea una instancia de la clase Hola y hace la ventana sea mostrada invocando al mtodo setVisible (boolean) de la superclase (clase de la que hereda) con el parmetro a true. Vase que, una vez el marco es dibujado, el programa no termina cuando se sale del mtodo main(), ya que el cdigo del que depende se encuentra en un hilo de ejecucin independiente ya lanzado, y que permanecer activo hasta que todas las ventanas hayan sido destruidas.
El diseo de Java, su robustez, el respaldo de la industria y su fcil portabilidad han hecho de Java uno de los lenguajes con un mayor crecimiento y amplitud de uso en distintos mbitos de la industria de la informtica.
Desde la creacin de la especificacin J2ME (Java 2 Platform, Micro Edition), una versin del entorno de ejecucin Java reducido y altamente optimizado, especialmente desarrollado para el mercado de dispositivos electrnicos de consumo, se ha producido toda una revolucin en lo que a la extensin de Java se refiere.
Es posible encontrar microprocesadores diseados para ejecutar bytecode Java y software Java para tarjetas inteligentes (JavaCard), telfonos mviles, buscapersonas, set-top-boxes, sintonizadores de TV y otros pequeos electrodomsticos.