Diferencia entre revisiones de «Java (lenguaje de programación)»

m (Revertidos los cambios de Kenia idict (disc.) a la última edición de Rapunzell uci)
Línea 1: Línea 1:
  
 +
 +
'''Java''' es un [[lenguaje de programación]] [[orientado a objetos]] desarrollado por [[Sun Microsystems]] a principios de los [[años 90]]. El lenguaje en sí mismo toma mucha de su sintaxis de [[Lenguaje de programación C|C]] y [[C++]], pero tiene un modelo de objetos más simple y elimina herramientas de bajo nivel, que suelen inducir a muchos errores, como la manipulación directa de [[Puntero (programación)|punteros]] o memoria.
 +
 +
Las [[aplicación Java|aplicaciones Java]] están típicamente [[compilador|compiladas]] en un ''[[bytecode]]'', aunque la compilación en [[código máquina]] nativo también es posible. En el [[tiempo de ejecución]], el ''bytecode'' es normalmente [[intérprete informático|interpretado]] o compilado a código nativo para la ejecución, aunque la ejecución directa por [[hardware]] del ''bytecode'' por un [[procesador Java]] también es posible.
 +
 +
La implementación original y de referencia del [[compilador]], la [[máquina virtual]] y las bibliotecas de clases de Java fueron desarrollados por Sun Microsystems en [[1995]]. Desde entonces, Sun ha controlado las especificaciones, el desarrollo y evolución del lenguaje a través del [[Java Community Process]], si bien otros han desarrollado también implementaciones alternativas de estas tecnologías de Sun, algunas incluso bajo licencias de [[software libre]].
 +
 +
Entre noviembre de [[2006]] y mayo de [[2007]], Sun Microsystems liberó la mayor parte de sus tecnologías Java bajo la licencia [[GNU GPL]], de acuerdo con las especificaciones del Java Community Process, de tal forma que prácticamente todo el Java de Sun es ahora [[software libre]] (aunque la [[biblioteca (programación)|biblioteca de clases]] de Sun que se requiere para ejecutar los programas Java aún no lo es).
 +
 +
== Historia ==
 +
La tecnología Java se creó como una herramienta de programación para ser usada en un proyecto de [[Set-top box|set-top-box]] en una pequeña operación denominada ''the Green Project'' en Sun Microsystems en el año [[1991]]. El equipo (''Green Team''), compuesto por trece personas y dirigido por [[James Gosling]], trabajó durante 18 meses en Sand Hill Road en Menlo Park en su desarrollo.
 +
 +
El lenguaje se denominó inicialmente ''Oak'' (por un roble que había fuera de la oficina de Gosling), luego pasó a denominarse ''Green'' tras descubrir que ''Oak'' era ya una marca comercial registrada para adaptadores de tarjetas gráficas y finalmente se renombró a ''Java''.
 +
 +
El término Java fue acuñado en una cafetería frecuentada por algunos de los miembros del equipo. Pero no está claro si es un acrónimo o no, aunque algunas fuentes señalan que podría tratarse de las iniciales de sus creadores: <cite>'''J'''ames Gosling, '''A'''rthur '''V'''an Hoff, y '''A'''ndy Bechtolsheim</cite>. Otros abogan por el siguiente acrónimo, <cite>'''J'''ust '''A'''nother '''V'''ague '''A'''cronym</cite> ("sólo otro acrónimo ambiguo más"). La hipótesis que más fuerza tiene es la que Java debe su nombre a un tipo de café disponible en la cafetería cercana, de ahí que el icono de java sea una taza de cafe caliente. Un pequeño signo que da fuerza a esta teoría es que los 4 primeros bytes (el ''número mágico'') de los archivos .class que genera el compilador, son en hexadecimal, 0xCAFEBABE. Otros simplemente dicen que el nombre fue sacado al parecer de una lista aleatoria de palabras.
 +
 +
Los objetivos de Gosling eran implementar una máquina virtual y un lenguaje con una estructura y sintaxis similar a [[C++]]. Entre junio y julio de 1994, tras una sesión maratoniana de tres días entre John Gaga, James Gosling, Joy Naughton, Wayne Rosing y Eric Schmidt, el equipo reorientó la plataforma hacia la Web. Sintieron que la llegada del navegador web [[Mosaic]], propiciaría que Internet se convirtiese en un medio interactivo, como el que pensaban era la televisión por cable. Naughton creó entonces un prototipo de navegador, WebRunner, que más tarde sería conocido como [[HotJava]].
 +
 +
En 1994, se les hizo una demostración 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 pública Java y HotJava, el navegador Web. El acontecimiento fue anunciado por John Gage, el Director Científico de Sun Microsystems. El acto estuvo acompañado por una pequeña sorpresa adicional, el anuncio por parte de Marc Andreessen, Vicepresidente Ejecutivo de Netscape, de que Java sería soportado en sus navegadores. El 9 de enero del año siguiente, 1996, Sun fundó el grupo empresarial JavaSoft para que se encargase del desarrollo tecnológico.
 +
[http://www.sun.com/smi/Press/sunflash/1996-01/sunflash.960109.14048.html]
 +
Dos semanas más tarde la primera versión de Java fue publicada.
 +
 +
La promesa inicial de Gosling era ''Write Once, Run Anywhere'' (Escríbelo una vez, ejecútalo en cualquier lugar), proporcionando un lenguaje independiente de la plataforma y un entorno de ejecución (la [[Máquina virtual Java|JVM]]) ligero y gratuito para las plataformas más populares de forma que los binarios (bytecode) de las aplicaciones Java pudiesen ejecutarse en cualquier plataforma.
 +
 +
El entorno de ejecución era relativamente seguro y los principales navegadores web pronto incorporaron la posibilidad de ejecutar [[applet]]s Java incrustadas en las páginas web.
 +
 +
Java ha experimentado numerosos cambios desde la versión primigenia, [[JDK]] 1.0, así como un enorme incremento en el número de clases y paquetes que componen la biblioteca estándar.
 +
 +
Desde [[Java SE|J2SE]] 1.4, la evolución 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 Especificación del Lenguaje Java. Los cambios en los JLS son gestionados en [http://www.jcp.org/en/jsr/detail?id=63 JSR 901].
 +
 +
* '''JDK 1.0''' ([[23 de enero]] de [[1996]]) — Primer lanzamiento: [http://www.sun.com/smi/Press/sunflash/1996-01/sunflash.960123.10561.html comunicado de prensa]
 +
 +
* '''JDK 1.1''' ([[19 de febrero]] de [[1997]]) — Principales adiciones incluidas: [http://www.sun.com/smi/Press/sunflash/1997-02/sunflash.970219.0001.html comunicado de prensa]
 +
** una reestructuración intensiva del modelo de eventos AWT (Abstract Windowing Toolkit)
 +
** clases internas (inner classes)
 +
** [[JavaBeans]]
 +
** [[JDBC]] (Java Database Connectivity), para la integración de bases de datos
 +
** [[RMI]] (Remote Method Invocation)
 +
 +
* '''J2SE 1.2''' ([[8 de diciembre]] de [[1998]]) — Nombre clave ''Playground''. Esta y las siguientes versiones fueron recogidas bajo la denominación '''Java 2''' y el nombre "J2SE" (Java 2 Platform, Standard Edition), reemplazó a JDK para distinguir la plataforma base de J2EE (Java 2 Platform, Enterprise Edition) y J2ME (Java 2 Platform, Micro Edition). Otras mejoras añadidas incluían: [http://www.sun.com/smi/Press/sunflash/1998-12/sunflash.981208.9.html comunicado de prensa]
 +
** la palabra reservada (keyword) <code>[[strictfp]]</code>
 +
** [[Reflexión (informática)|reflexión en la programación]]
 +
** la API gráfica ( [[Swing (biblioteca gráfica)|Swing]]) fue integrada en las clases básicas
 +
** la máquina virtual (JVM) de Sun fue equipada con un [[compilador]] [[JIT]] (Just in Time) por primera vez
 +
** [[Java Plug-in]]
 +
** [[Java IDL]], una implementación de IDL (Lenguaje de Descripción de [[Interfaz (Java)|Interfaz]]) para la interoperabilidad con [[CORBA]]
 +
** Colecciones ([[Collection class|Collections]])
 +
 +
* '''J2SE 1.3''' ([[8 de mayo]] de [[2000]]) — Nombre clave ''Kestrel''. Los cambios más notables fueron:[http://www.sun.com/smi/Press/sunflash/2000-05/sunflash.20000508.3.html comunicado de prensa] [http://java.sun.com/j2se/1.3/docs/relnotes/features.html lista completa de cambios]
 +
** la inclusión de la máquina virtual de [[HotSpot]] JVM (la JVM de HotSpot fue lanzada inicialmente en abril de 1999, para la JVM de J2SE 1.2)
 +
** [[RMI]] fue cambiado para que se basara en [[CORBA]]
 +
** [[JavaSound]] MARGARITO Y BUKI PUUUUUUUUUUTOOOOO
 +
** se incluyó el [[JNDI|Java Naming and Directory Interface]] (JNDI) en el paquete de bibliotecas principales (anteriormente disponible como una extensión)
 +
** [[Java Platform Debugger Architecture]] (JPDA)
 +
 +
* '''J2SE 1.4''' ([[6 de febrero]] de [[2002]]) — Nombre Clave ''Merlin''. Este fue el primer lanzamiento de la plataforma Java desarrollado bajo el Proceso de la Comunidad Java como [http://www.jcp.org/en/jsr/detail?id=59 JSR 59]. Los cambios más notables fueron: [http://www.sun.com/smi/Press/sunflash/2002-02/sunflash.20020206.5.html comunicado de prensa][http://java.sun.com/j2se/1.4.2/docs/relnotes/features.html lista completa de cambios]
 +
** Palabra reservada <code>[[Assertion (computing)|assert]]</code> (Especificado en [http://www.jcp.org/en/jsr/detail?id=41 JSR 41].)
 +
** [[Expresiones regulares]] modeladas al estilo de las expresiones regulares [[Perl programming language|Perl]]
 +
** [[Encadenación de excepciones]] Permite a una excepción encapsular la excepción de bajo nivel original.
 +
** non-blocking NIO ([[New I/O|New Input/Output]]) (Especificado en [http://www.jcp.org/en/jsr/detail?id=51 JSR 51].)
 +
** Logging API (Specified in [http://www.jcp.org/en/jsr/detail?id=47 JSR 47].)
 +
** API I/O para la lectura y escritura de imágenes en formatos como [[JPEG]] o [[PNG]]
 +
** Parser [[XML]] integrado y procesador [[XSLT]] ([[JAXP]]) (Especificado en [http://www.jcp.org/en/jsr/detail?id=5 JSR 5] y [http://www.jcp.org/en/jsr/detail?id=63 JSR 63].)
 +
** Seguridad integrada y extensiones criptográficas (JCE, [[JSSE]], [[JAAS]])
 +
** [[Java Web Start]] incluido (El primer lanzamiento ocurrió en marzo de 2001 para J2SE 1.3) (Especificado en [http://www.jcp.org/en/jsr/detail?id=56 JSR 56].)
 +
 +
* '''J2SE 5.0''' ([[30 de septiembre]] de [[2004]]) — Nombre clave: ''Tiger''. (Originalmente numerado 1.5, esta notación aún es usada internamente.[http://java.sun.com/j2se/1.5.0/docs/relnotes/version-5.0.html]) Desarrollado bajo [http://www.jcp.org/en/jsr/detail?id=176 JSR 176], Tiger añadió un número significativo de nuevas características [http://www.sun.com/smi/Press/sunflash/2004-09/sunflash.20040930.1.html comunicado de prensa]
 +
** [[Programación genérica|Plantillas (genéricos)]] — provee [[conversion de tipos (type safety)]] en tiempo de compilación para colecciones y elimina la necesidad de la mayoría de [[Conversión de tipos‎|conversion de tipos (type casting)]]. (Especificado por [http://www.jcp.org/en/jsr/detail?id=14 JSR 14].)
 +
** [[Metadatos]] — también llamados [[anotacione]]s, permite a estructuras del lenguaje como las clases o los métodos, ser etiquetados con datos adicionales, que puedan ser procesados posteriormente por utilidades de proceso de metadatos. (Especificado por [http://www.jcp.org/en/jsr/detail?id=175 JSR 175].)
 +
** [[Autoboxing]]/unboxing — Conversiones automáticas entre [[tipo primitivo|tipos primitivos]] (Como los <code>int</code>) y [[clases de envoltura primitivas]] (Como {{Javadoc:SE|java/lang|Integer}}). (Especificado por [http://www.jcp.org/en/jsr/detail?id=201 JSR 201].)
 +
** [[Enumeración|Enumeraciones]] — la palabra reservada <code>enum</code> crea una [[type safety|typesafe]], lista ordenada de valores (como <code>Dia.LUNES</code>, <code>Dia.MARTES</code>, etc.). Anteriormente, esto solo podía ser llevado a cabo por constantes enteras o clases construidas manualmente (enum pattern). (Especificado por [http://www.jcp.org/en/jsr/detail?id=201 JSR 201].)
 +
** Varargs (número de argumentos variable) — El último parámetro de un método puede ser declarado con el nombre del tipo seguido por tres puntos (e.g. <code>void drawtext(String... lines)</code>). En la llamada al método, puede usarse cualquier número de parámetros de ese tipo, que serán almacenados en un array para pasarlos al método.
 +
** [[Bucle]] <code>for</code> mejorado — La sintaxis para el bucle <code>for</code> se ha extendido con una sintaxis especial para iterar sobre cada miembro de un array o sobre cualquier clase que implemente {{Javadoc:SE|java/lang|Iterable}}, como la clase estándar {{Javadoc:SE|java/util|Collection}}, de la siguiente forma:
 +
 +
<!-- La tabla inferior está destinada a mostrar el ejemplo de código y texto siguiente en un ancho de 32 píxeles -->
 +
<source lang="java">
 +
void displayWidgets (Iterable<Widget> widgets) {
 +
    for (Widget w : widgets) {
 +
        w.display();
 +
    }
 +
}
 +
</source>
 +
 +
Este ejemplo itera sobre el objeto <code>Iterable</code> <code>widgets</code>, asignando, en orden, cada uno de los elementos a la variable <code>w</code>, y llamando al método <code>display()</code> de cada uno de ellos. (Especificado por JSR 201.)
 +
|}
 +
* '''Java SE 6''' ([[11 de diciembre]] de [[2006]]) — Nombre clave [https://mustang.dev.java.net/ ''Mustang'']. Estuvo en desarrollo bajo la [http://www.jcp.org/en/jsr/detail?id=270 JSR 270]. En esta versión, Sun cambió el nombre "J2SE" por '''Java SE''' y eliminó el ".0" del número de versión.[http://www.java.com/en/about/brand/naming.jsp]. Está disponible en [http://java.sun.com/javase/6/ http://java.sun.com/javase/6/]. Los cambios más importantes introducidos en esta versión son:
 +
** Incluye un nuevo marco de trabajo y APIs que hacen posible la combinación de Java con lenguajes dinámicos como PHP, Python, Ruby y JavaScript.
 +
** Incluye el motor Rhino, de Mozilla, una implementación de Javascript en Java.
 +
** Incluye un cliente completo de Servicios Web y soporta las últimas especificaciones para Servicios Web, como JAX-WS 2.0, JAXB 2.0, STAX y JAXP.
 +
** Mejoras en la interfaz gráfica y en el rendimiento.
 +
 +
* '''Java SE 7''' — Nombre clave ''Dolphin''. En el año [[2006]] aún se encontraba en las primeras etapas de planificación. Se espera que su desarrollo dé comienzo en la primavera de 2006, y se estima su lanzamiento para 2008.
 +
** Soporte para XML dentro del propio lenguaje.
 +
** Un nuevo concepto de superpaquete.
 +
** Soporte para [[Clausura_(informática)|closures]].
 +
** Introducción de anotaciones estándar para detectar fallos en el software.
 +
*No oficiales:
 +
** NIO2.
 +
** Java Module System.
 +
** Java Kernel.
 +
** Nueva API para el manejo de Dias y Fechas, la cual reemplazara las antiguas clases Date y  Calendar.
 +
** Posibilidad de operar con clases BigDecimal usando operandos.
 +
 +
[http://weblogs.java.net/blog/editors/archives/2004/09/evolving_a_lang.html]
 +
 +
Además de los cambios en el lenguaje, con el paso de los años se han efectuado muchos más cambios dramáticos en la biblioteca de clases de Java (''Java class library'') que ha crecido de unos pocos cientos de clases en JDK 1.0 hasta más de tres mil en J2SE 5.0. APIs completamente nuevas, como [[Swing (biblioteca gráfica)|Swing]] y [[Java 2D|Java2D]], han sido introducidas y muchos de los métodos y clases originales de JDK 1.0 están obsoletas.
 +
 +
En el [[2005]] se calcula en 4,5 millones el número de  desarrolladores y 2.500 millones de dispositivos habilitados con tecnología Java.
 +
 +
== Filosofía ==
 +
El lenguaje Java se creó con cinco objetivos principales:
 +
#Debería usar la metodología de la programación orientada a objetos.
 +
#Debería permitir la ejecución de un mismo programa en múltiples sistemas operativos.
 +
#Debería incluir por defecto soporte para trabajo en red.
 +
#Debería diseñarse para ejecutar código en sistemas remotos de forma segura.
 +
#Debería ser fácil de usar y tomar lo mejor de otros lenguajes orientados a objetos, como C++.
 +
 +
Para conseguir la ejecución de código 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]] o [[OSGi]] respectivamente.
 +
 +
=== Orientado a Objetos ===
 +
La primera característica, [[orientado a objetos]] (“OO”), se refiere a un método de programación y al diseño del lenguaje. Aunque hay muchas interpretaciones para OO, una primera idea es diseñar el software de forma que los distintos tipos de datos que usen estén unidos a sus operaciones. Así, los datos y el código (funciones o métodos) se combinan en entidades llamadas [[Objetos (programación orientada a objetos)|objetos]]. Un objeto puede verse como un paquete que contiene el “comportamiento” (el código) y el “estado” (datos). El principio es separar aquello que cambia de las cosas que permanecen inalterables. Frecuentemente, cambiar una estructura de datos implica un cambio en el código que opera sobre los mismos, o viceversa. Esta separación en objetos coherentes e independientes ofrece una base más estable para el diseño de un sistema software. El objetivo es hacer que grandes proyectos sean fáciles de gestionar y manejar, mejorando como consecuencia su calidad y reduciendo el número de proyectos fallidos.
 +
Otra de las grandes promesas de la programación orientada a objetos es la creación de entidades más genéricas (objetos) que permitan la reutilización del software entre proyectos, una de las premisas fundamentales de la Ingeniería del Software. Un objeto genérico “cliente”, por ejemplo, debería en teoría tener el mismo conjunto de comportamiento en diferentes proyectos, sobre todo cuando estos coinciden en cierta medida, algo que suele suceder en las grandes organizaciones. En este sentido, los objetos podrían verse como piezas reutilizables que pueden emplearse en múltiples proyectos distintos, posibilitando así a la industria del software a construir proyectos de envergadura empleando componentes ya existentes y de comprobada calidad; conduciendo esto finalmente a una reducción drástica del tiempo de desarrollo. Podemos usar como ejemplo de objeto el aluminio. Una vez definidos datos (peso, maleabilidad, etc.), y su “comportamiento” (soldar dos piezas, etc.), el objeto “aluminio” puede ser reutilizado en el campo de la construcción, del automóvil, de la aviación, etc.
 +
 +
La reutilización del software ha experimentado resultados dispares, encontrando dos dificultades principales: el diseño de objetos realmente genéricos es pobremente comprendido, y falta una metodología para la amplia comunicación de oportunidades de reutilización. Algunas comunidades de “código abierto” (open source) quieren ayudar en este problema dando medios a los desarrolladores para diseminar la información sobre el uso y versatilidad de objetos reutilizables y bibliotecas de objetos.
 +
 +
=== Independencia de la plataforma ===
 +
La segunda característica, la independencia de la plataforma, significa que programas escritos en el lenguaje Java pueden ejecutarse igualmente en cualquier tipo de hardware. Este es el significado de ser capaz de escribir un programa una vez y que pueda ejecutarse en cualquier dispositivo, tal como reza el axioma de Java, ‘’’write once, run everywhere’’’.
 +
 +
Para ello, se compila el código fuente escrito en lenguaje Java, para generar un código conocido como “bytecode” (específicamente Java bytecode)—instrucciones máquina simplificadas específicas de la plataforma Java. Esta pieza está “a medio camino” entre el código fuente y el código máquina que entiende el dispositivo destino. El bytecode es ejecutado entonces en la máquina virtual (JVM), un programa escrito en código nativo de la plataforma destino (que es el que entiende su hardware), que interpreta y ejecuta el código. Además, se suministran bibliotecas adicionales para acceder a las características de cada dispositivo (como los gráficos, ejecución mediante hebras o threads, la interfaz de red) de forma unificada. Se debe tener presente que, aunque hay una etapa explícita de compilación, el bytecode generado es interpretado o convertido a instrucciones máquina del código nativo por el compilador JIT (Just In Time).
 +
 +
Hay implementaciones del compilador de Java que convierten el código fuente directamente en código objeto nativo, como [[GCJ]]. Esto elimina la etapa intermedia donde se genera el bytecode, pero la salida de este tipo de compiladores sólo puede ejecutarse en un tipo de arquitectura.
 +
 +
La licencia sobre Java de Sun insiste que todas las implementaciones sean “compatibles”. Esto dio lugar a una disputa legal entre Microsoft y Sun, cuando éste último alegó que la implementación de Microsoft no daba soporte a las interfaces RMI y JNI además de haber añadido características ‘’dependientes’’ de su plataforma. Sun demandó a Microsoft y ganó por daños y perjuicios (unos 20 millones de dólares) así como una orden judicial forzando la acatación de la licencia de Sun. Como respuesta, Microsoft no ofrece Java con su versión de sistema operativo, y en recientes versiones de Windows, su navegador Internet Explorer no admite la ejecución de applets sin un conector (o plugin) aparte. Sin embargo, Sun y otras fuentes ofrecen versiones gratuitas para distintas versiones de Windows.
 +
 +
Las primeras implementaciones del lenguaje usaban una máquina virtual interpretada para conseguir la portabilidad. Sin embargo, el resultado eran programas que se ejecutaban comparativamente más lentos que aquellos escritos en C o C++. Esto hizo que Java se ganase una reputación de lento en rendimiento. Las implementaciones recientes de la JVM dan lugar a programas que se ejecutan considerablemente más rápido que las versiones antiguas, empleando diversas técnicas, aunque sigue siendo mucho más lento que otros lenguajes.
 +
 +
La primera de estas técnicas es simplemente compilar directamente en código nativo como hacen los compiladores tradicionales, eliminando la etapa del bytecode. Esto da lugar a un gran rendimiento en la ejecución, pero tapa el camino a la portabilidad. Otra técnica, conocida como compilación JIT (Just In Time, o ‘’’compilación al vuelo’’’), convierte el bytecode a código nativo cuando se ejecuta la aplicación. Otras máquinas virtuales más sofisticadas usan una ‘’’recompilación dinámica’’’ en la que la VM es capaz de analizar el comportamiento del programa en ejecución y recompila y optimiza las partes críticas. La recompilación dinámica puede lograr mayor grado de optimización que la compilación tradicional (o estática), ya que puede basar su trabajo en el conocimiento que de primera mano tiene sobre el entorno de ejecución y el conjunto de clases cargadas en memoria. La compilación JIT y la recompilación dinámica permiten a los programas Java aprovechar la velocidad de ejecución del código nativo sin por ello perder la ventaja de la portabilidad en ambos.
 +
 +
La portabilidad es técnicamente difícil de lograr, y el éxito de Java en ese campo ha sido dispar. Aunque es de hecho posible escribir programas para la plataforma Java que actúen de forma correcta en múltiples plataformas de distinta arquitectura, el gran número de estas con pequeños errores o inconsistencias llevan a que a veces se parodie el eslogan de Sun, "[[Write once, run anywhere]]" como "Write once, [[debug]] everywhere" (o “Escríbelo una vez, ejecútalo en cualquier parte” por “Escríbelo una vez, depúralo en todas partes”)
 +
 +
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.
 +
 +
=== El recolector de basura ===
 +
{{VT|Recolector de basura}}
 +
 +
En Java el problema de las [[Fuga de memoria|fugas de memoria]] se evita en gran medida gracias a la [[recolección de basura]] (o ''automatic garbage collector''). El programador determina cuándo se crean los objetos y el entorno en tiempo de ejecución 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 éste. 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 método sólo tiene entidad dentro de éste; al salir del método el objeto es eliminado). Aun así, es posible que se produzcan fugas de memoria si el código almacena referencias a objetos que ya no son necesarios—es decir, pueden aún ocurrir, pero en un nivel conceptual superior. En definitiva, el recolector de basura de Java permite una fácil creación y eliminación de objetos, mayor seguridad y puede que más rápida que en C++ {{añadir referencias}}.
 +
 +
== Sintaxis ==
 +
La sintaxis de Java se deriva en gran medida de [[C++]]. Pero a diferencia de éste, que combina la sintaxis para programación genérica, 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).
 +
 +
=== Hola Mundo ===
 +
{{AP|Hola mundo}}
 +
 +
==== Aplicaciones autónomas ====
 +
<source lang="java">
 +
// Hola.java
 +
import java.io*;
 +
public class Hola
 +
{
 +
    public static void main(String[] args)throws IOException {
 +
        System.out.println("¡Hola, mundo!");
 +
    }
 +
}
 +
</source>
 +
 +
Este ejemplo necesita una pequeña explicación.
 +
* Todo en Java está dentro de una clase, incluyendo programas autónomos.
 +
* El código fuente se guarda en archivos con el mismo nombre que la clase que contienen y con extensión “.java”. Una clase (<code>class</code>) declarada pública (<code>public</code>) debe seguir este convenio. En el ejemplo anterior, la clase es <code>Hola</code>, por lo que el código fuente debe guardarse en el fichero “Hola.java”
 +
* El compilador genera un archivo de clase (con extensión “.class”) por cada una de las clases definidas en el archivo fuente. Una clase anónima se trata como si su nombre fuera la concatenación del nombre de la clase que la encierra, el símbolo “$”, y un número entero.
 +
* Los programas que se ejecutan de forma independiente y autónoma, deben contener el método <code>”main()”</code>.
 +
* La palabra reservada <code>”void”</code> indica que el método main no devuelve nada.
 +
* El método main debe aceptar un [[array]] de objetos tipo String. Por acuerdo se referencia como <code>”args”</code>, aunque puede emplearse cualquier otro identificador.
 +
<!--
 +
* The main method must accept an [[array]] of '''{{Javadoc:SE|java/lang|String}}''' objects. By convention, it is referenced as <code>'''args'''</code> although any other legal identifier name can be used.
 +
-->
 +
* La palabra reservada <code>”static”</code> indica que el método es un [[Método (programación orientada a objetos)|método de clase]], asociado a la clase en vez de una instancias de la misma. El método main debe ser estático o ’’de clase’’.
 +
* La palabra reservada <code>'''public'''</code> significa que un método puede ser llamado desde otras clases, o que la clase puede ser usada por clases fuera de la jerarquía de la propia clase. Otros tipos de acceso son <code>”private”</code> o <code>”protected”</code>.
 +
* La utilidad de impresión (en pantalla por ejemplo) forma parte de la biblioteca estándar de Java: la clase ‘’’System’’’ define un campo público estático llamado ‘’’out’’’. El objeto <code>out</code> es una instancia de ‘’’PrintStream’’’, que ofrece el método ‘’’println (String)’’’ para volcar datos en la pantalla (la salida estándar).
 +
<!--
 +
'''{{Javadoc:SE|java/lang|System}}'''
 +
'''{{Javadoc:SE|name=out|java/lang|System|out}}'''
 +
{{Javadoc:SE|java/io|PrintStream}}
 +
'''{{Javadoc:SE|name=println(String)|java/io|PrintStream|println(java.lang.String)}}'''
 +
-->
 +
* Las aplicaciones autónomas se ejecutan dando al entorno de ejecución de Java el nombre de la clase cuyo método main debe invocarse. Por ejemplo, una línea de comando (en [[Unix]] o [[Windows]]) de la forma <code>java –cp . Hola</code> ejecutará el programa del ejemplo (previamente compilado y generado “Hola.class”) . El nombre de la clase cuyo método main se llama puede especificarse también en el fichero “MANIFEST” del archivo de empaquetamiento de Java (.jar).
 +
 +
==== Applets ====
 +
{{AP|Applet Java}}
 +
 +
Las [[applet Java]] son programas incrustados en otras aplicaciones, normalmente una página Web que se muestra en un navegador.
 +
 +
<source lang="java">
 +
// Hola.java
 +
import java.applet.Applet;
 +
import java.awt.Graphics;
 +
 +
public class Hola extends Applet {
 +
    public void paint(Graphics gc) {
 +
        gc.drawString("Hola, mundo!", 65, 95);
 +
    }   
 +
}
 +
</source>
 +
<source lang="html4strict">
 +
<!-- Hola.html -->
 +
<html>
 +
  <head>
 +
    <title>Applet Hola Mundo</title>
 +
  </head>
 +
  <body>
 +
    <applet code="Hola.class" width="200" height="200">
 +
    </applet>
 +
  </body>
 +
</html>
 +
</source>
 +
 +
La sentencia '''<code>import</code>''' 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 código fuente.
 +
 +
La clase <code>'''Hola'''</code> extiende (<code>extends</code>) a la clase <code>Applet</code>, es decir, es una subclase de ésta. La clase <code>Applet</code> permite a la aplicación mostrar y controlar el estado del applet. La clase <code>Applet</code> es un componente del AWT ([[Abstract Window Toolkit]]), que permite al applet mostrar una inteterfaz gráfica de usuario o GUI (Graphical User Interface), y responder a eventos generados por el usuario.
 +
 +
La clase <code>Hola</code> sobrecarga el método '''paint (Graphics)''' heredado de la superclase contenedora (<code>Applet</code> en este caso), para acceder al código encargado de dibujar. El método <code>paint()</code> recibe un objeto '''<code>Graphics</code>''' que contiene el contexto gráfico para dibujar el applet. El método '''<code>paint()</code>''' llama al método drawString (String, int, int) del objeto '''<code>Graphics</code>''' para mostrar la cadena de caracteres '''Hola, mundo!''' en la posición (65, 96) del espacio de dibujo asignado al applet.
 +
 +
La referencia al applet es colocada en un documento [[HTML]] usando la etiqueta '''<code><applet></code>'''. Esta etiqueta o tag tiene tres atributos: '''<code>code="Hola"</code>''' indica el nombre del applet, y '''<code>width="200" height="200"</code>''' establece la anchura y altura, respectivamente, del applet. Un applet también pueden alojarse dentro de un documento HTML usando los elementos <code>object</code>, o <code>embed</code>, aunque el soporte que ofrecen los navegadores Web no es uniforme.[http://java.sun.com/docs/books/tutorial/deployment/applet/applettag.html][http://java.sun.com/docs/books/tutorial/deployment/applet/mixedbrowser.html]
 +
 +
==== Servlets ====
 +
{{AP|Java Servlet}}
 +
 +
Los [[servlets]] son componentes de la parte del servidor de Java EE, encargados de generar respuestas a las peticiones recibidas de los clientes.
 +
 +
<source lang="java">
 +
// Hola.java
 +
import java.io.*;
 +
import javax.servlet.*;
 +
 +
public class Hola extends GenericServlet
 +
{
 +
    public void service(ServletRequest request, ServletResponse response)
 +
        throws ServletException, IOException
 +
    {
 +
        response.setContentType("text/html");
 +
        PrintWriter pw = response.getWriter();
 +
        pw.println("Hola, mundo!");
 +
        pw.close();
 +
    }
 +
}
 +
</source>
 +
 +
Las sentencias '''<code>import</code>''' indican al compilador de Java la inclusión de todas las clases públicas e [[Interfaz (Java)|interfaces]] de los paquetes '''java.io''' y '''javax.servlet''' en la compilación.
 +
 +
La clase <code>'''Hola'''</code> extiende (<code>'''extends'''</code>), 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.
 +
 +
La clase <code>Hola</code> sobrecarga el método '''service (ServletRequest, ServletResponse)''', definido por la interfaz '''servlet''' para acceder al manejador de la petición de servicio. El método <code>service()</code> recibe un objeto de tipo '''ServletRequest''' que contiene la petición del cliente y un objeto de tipo '''ServletResponse''', usado para generar la respuesta que se devuelve al cliente. El método <code>service()</code> puede ''lanzar'' ('''<code>throws</code>''') excepciones de tipo ServletException e IOException si ocurre algún tipo de anomalía.
 +
 +
El método '''setContentType (String)''' en el objeto respuesta establece el tipo de contenido MIME a "text/html", para indicar al cliente que la respuesta a su petición es una página con formato HTML. El método '''getWriter()''' del objeto respuesta devuelve un objeto de tipo '''PrintWriter''', usado como una ''tubería'' por la que viajarán los datos al cliente. El método '''println (String)''' escribe la cadena "Hola, mundo!" en la respuesta y finalmente se llama al método '''close()''' para cerrar la conexión, que hace que los datos escritos en la '''tubería''' o stream sean devueltos al cliente.
 +
 +
==== Aplicaciones con ventanas ====
 +
[[Swing (biblioteca gráfica)|Swing]] es la biblioteca para la interfaz gráfica de usuario avanzada de la plataforma Java SE.
 +
 +
<source lang="java">
 +
// Hola.java
 +
import javax.swing.*;
 +
 +
public class Hola extends JFrame {
 +
    Hola() {
 +
        setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
 +
        add(new JLabel("Hola, mundo!"));
 +
        pack();
 +
    }
 +
 +
    public static void main(String[] args) {
 +
        new Hola().setVisible(true);
 +
    }
 +
}
 +
</source>
 +
 +
Las instrucciones '''<code>import</code>''' indican al compilador de Java que las clases e [[Interfaz (Java)|interfaces]] del paquete '''javax.swing''' se incluyan en la compilación.
 +
 +
La clase <code>'''Hola'''</code> extiende (<code>'''extends'''</code>) la clase '''javax.swing.JFrame''', que implementa una ventana con una barra de título y un control para cerrarla.
 +
 +
El constructor <code>'''Hola()'''</code> inicializa el marco o frame llamando al método '''setDefaultCloseOperation (int)''' heredado de JFrame para establecer las operaciones por defecto cuando el control de cierre en la barra de título 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 máquina virtual y al programa acabar su ejecución. A continuación se crea un objeto de tipo JLabel con el texto "Hola, mundo!", y se añade al marco mediante el método '''add (Component)''', heredado de la clase '''Container'''. El método '''pack()''', heredado de la clase '''Window''', es invocado para dimensionar la ventana y distribuir su contenido.
 +
 +
El método <code>'''main()'''</code> es llamado por la JVM al comienzo del programa. Crea una instancia de la clase <code>'''Hola'''</code> y hace la ventana sea mostrada invocando al método '''setVisible (boolean)''' de la superclase (clase de la que hereda) con el parámetro a true. Véase que, una vez el marco es dibujado, el programa no termina cuando se sale del método <code>'''main()'''</code>, ya que el código del que depende se encuentra en un [[Hilo en sistemas operativos|hilo de ejecución]] independiente ya lanzado, y que permanecerá activo hasta que todas las ventanas hayan sido destruidas.
 +
 +
== Entornos de funcionamiento ==
 +
El diseño de Java, su robustez, el respaldo de la industria y su fácil 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 informática.
 +
 +
=== En dispositivos móviles y sistemas empotrados ===
 +
Desde la creación de la especificación J2ME (Java 2 Platform, Micro Edition), una versión del entorno de ejecución Java reducido y altamente optimizado, especialmente desarrollado para el mercado de dispositivos electrónicos de consumo se ha producido toda una revolución en lo que a la extensión de Java se refiere.
 +
 +
Es posible encontrar microprocesadores específicamente diseñados para ejecutar bytecode Java y software Java para tarjetas inteligentes (JavaCard), teléfonos móviles, buscapersonas, set-top-boxes, sintonizadores de TV y otros pequeños electrodomésticos.
 +
 +
El modelo de desarrollo de estas aplicaciones es muy semejante a las ''applets'' de los navegadores salvo que en este caso se denominan [[Midlet | MIDlets]].
 +
 +
Véase [http://developers.sun.com/mobility/index.jsp Sun Mobile Device Tecnology]
 +
 +
=== En el navegador web ===
 +
Desde la primera versión de java existe la posibilidad de desarrollar pequeñas aplicaciones ([[Applet Java|Applets]]) en Java que luego pueden ser incrustadas en una página HTML para que sean descargadas y ejecutadas por el navegador web. Estas mini-aplicaciones se ejecutan en una JVM que el navegador tiene configurada como extensión (''plug-in'') en un contexto de seguridad restringido configurable para impedir la ejecución local de código potencialmente malicioso.
 +
 +
El éxito de este tipo de aplicaciones (la visión del equipo de Gosling) no fue realmente el esperado debido a diversos factores, siendo quizás el más importante  la lentitud y el reducido ancho de banda de las comunicaciones en aquel entonces que limitaba el tamaño de las applets que se incrustaban en el navegador. La aparición posterior de otras alternativas (aplicaciones web dinámicas de servidor) dejó un reducido ámbito de uso para esta tecnología, quedando hoy relegada fundamentalmente a componentes específicos para la intermediación desde una aplicación web dinámica de servidor con dispositivos ubicados en la máquina cliente donde se ejecuta el navegador.
 +
 +
Las ''applets'' Java no son las únicas tecnologías (aunque sí las primeras) de componentes complejos incrustados en el navegador. Otras tecnologías similares pueden ser: [[ActiveX]] de Microsoft, [[Macromedia Flash|Flash]], [[Java Web Start]], etc.
 +
 +
=== En sistemas de servidor ===
 +
En la parte del servidor, Java es más popular que nunca, desde la aparición de la especificación de [[Java Servlet|Servlets]] y JSP ([[Java Server Pages]]).
 +
 +
Hasta entonces, las aplicaciones web dinámicas de servidor que existían se basaban fundamentalmente en componentes [[Common Gateway Interface|CGI]] y lenguajes interpretados. Ambos tenían diversos inconvenientes (fundamentalmente lentitud, elevada carga computacional o de memoria y propensión a errores por su interpretación dinámica).
 +
 +
Los servlets y las JSPs supusieron un importante avance ya que:
 +
*El [[Interfaz de programación de aplicaciones|API]] de programación es muy sencilla, flexible y extensible.
 +
 +
*Los servlets no son procesos independientes (como los CGIs) y por tanto se ejecutan dentro del mismo proceso que la JVM mejorando notablemente el rendimiento y reduciendo la carga computacional y de memoria requeridas.
 +
 +
*Las JSPs son páginas que se compilan dinámicamente (o se pre-compilan previamente a su distribución) de modo que el código que se consigue una ventaja en rendimiento substancial frente a muchos lenguajes interpretados.
 +
 +
La especificación de Servlets y JSPs define un API de programación y los requisitos para un contenedor (servidor) dentro del cual se puedan desplegar estos componentes para formar aplicaciones web dinámicas completas. Hoy día existen multitud de contenedores (libres y comerciales) compatibles con estas especificaciones.
 +
 +
A partir de su expansión entre la comunidad de desarrolladores, estas tecnologías han dado paso a modelos de desarrollo mucho más elaborados con [[framework]]s (pe [[Struts]], [[Webwork]]) que se sobreponen sobre los servlets y las JSPs para conseguir un entorno de trabajo mucho más poderoso y segmentado en el que la especialización de roles sea posible (desarrolladores, diseñadores gráficos, ...) y se facilite la reutilización y robustez de código. A pesar de todo ello, las tecnologías que subyacen (Servlets y JSPs) son substancialmente las mismas.
 +
 +
Este modelo de trabajo se ha convertido en uno de los estándar ''de-facto'' para el desarrollo de aplicaciones web dinámicas de servidor.
 +
 +
=== En aplicaciones de escritorio ===
 +
Hoy en día existen multitud de aplicaciones gráficas de usuario basadas en Java. El entorno de ejecución Java (JRE) se ha convertido en un componente habitual en los PC de usuario de los sistemas operativos más usados en el mundo. Además, muchas aplicaciones Java lo incluyen dentro del propio paquete de la aplicación de modo que se ejecuten en cualquier [[Computador personal|PC]].
 +
 +
En las primeras versiones de la plataforma Java existían importantes limitaciones en las APIs de desarrollo gráfico ([[Abstract Window Toolkit|AWT]]). Desde la aparición de la biblioteca [[Swing (biblioteca gráfica)|Swing]] la situación mejoró substancialmente y posteriormente con la aparición de bibliotecas como [[SWT]] hacen que el desarrollo de aplicaciones de escritorio complejas y con gran dinamismo, usabilidad, etc. sea relativamente sencillo.
 +
 +
<!-- Comentado provisionalmente mientras se reestructura el contenido
 +
 +
Aunque cada vez la tecnología Java se acerca más y más al PC de sobremesa, las aplicaciones Java han sido relativamente raras para uso doméstico, por varias razones.[http://weblogs.java.net/blog/joshy/archive/2005/03/why_dont_you_sh.html]
 +
 +
*Las aplicaciones Java pueden necesitar gran cantidad de memoria física.
 +
*La Interfaz Gráfica de Usuario ([[GUI]]) no sigue de forma estricta la ''[[Guía para Interfaces Humana]]'' (Human Interface Guidelines), así como tampoco aquella a la que estamos habitualmente acostumbrados. La apariencia de las fuentes no tiene las opciones de optimización activadas por defecto, lo que hace aparecer al texto como si fuera de baja calidad.
 +
*Las herramientas con que cuenta el JDK no son suficientemente potentes para construir de forma simple aplicaciones potentes. Aunque el uso de herramientas como [[Eclipse_(software)|Eclipse]], un IDE con licencia libre de alta calidad, facilita enormemente las tareas de desarrollo.
 +
*Hay varias versiones del Entorno en Tiempo de Ejecución de Java, el JRE. Es necesario tener instalada la versión adecuada.
 +
*Las aplicaciones basadas en la Web están tomando la delantera frente a aquellas que funcionan como entidades independientes. Las nuevas técnicas de programación producen aplicaciones basadas en un modelo en red cada vez más potentes.
 +
 +
Sin embargo hay aplicaciones Java cuyo uso está ampliamente extendido, como los NetBeans, el entorno de desarrollo (IDE) Eclipse, y otros programas como LimeWire y [[Azureus]] para intercambio de archivos. Java también es el motor que usa MATLAB para el renderizado de la interfaz gráfica y para parte del motor de cálculo. Las aplicaciones de escritorio basadas en la tecnología Swing y SWT (Standard Widget Toolkit) suponen una alternativa a la plataforma .Net de Microsoft.
 +
-->
 +
 +
<!-- Comentado provisionalmente mientras se reestructura el contenido
 +
 +
===Java y DB===
 +
Muchos programadores quizás tengan mayor interés en realizar programación basada conjunto a Bases de Datos, pues Java no se queda atrás, Java no implementa Bases de Datos, ya que solo es un lenguaje de programación, pero implementa funciones que permiten al programador realizar conexiones entre la interfaz de usuario y el Gestor de Base de Datos.
 +
 +
Java permite conectarse por medio de puentes JDBC o a través de Drivers a programas gestores de bases de datos, su independencia entre ambos permite al usuario mantener siempre un enfoque, separando el diseño de la Base de Datos y el de la interfaz en dos mundos de pensamientos diferentes el mundo de los datos y el mundo de las interfaces.
 +
 +
Java es orientado a objetos por ende da solidez a la aplicación evitando cortes bruscos del programa y permitiendo continuar de esta manera con la aplicación. Java permite [[Applets]] (Vea más adelante), lo que permite montar cualquier aplicación con Bases de Datos a través de la red de forma segura y sólida.
 +
 +
Un buen ejemplo de como conectar java con el JDBC sería:
 +
 +
<source lang="java">
 +
public boolean Conectar(String DBName) {
 +
        boolean val = true;
 +
        //Creación de la URL
 +
        String url = "jdbc:odbc:" + DBName;
 +
        try {
 +
            //Seleccionar y cargar el driver a ser usado.
 +
            Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
 +
            //Conexión con JDBC
 +
            con = DriverManager.getConnection(url);
 +
        } catch (JDBCException jdbc) {
 +
            //En caso de error con la conexión con JDBC-Server
 +
            con = null;
 +
            val = false;
 +
            JOptionPane
 +
                .showMessageDialog(
 +
                    new JFrame(),
 +
                    jdbc.toString()
 +
                        .substring(
 +
                            49,
 +
                            jdbc.toString()
 +
                                .length())
 +
                        + "\n\nCausas probables del error:\n1- El usuario no tiene los permisos para acceder a "
 +
                        + DBName
 +
                        + ".\nVerifique he inténtelo nuevamente.\nGracias!",
 +
                    "Error!.- No hubo conexión con la base de datos.",
 +
                    0);
 +
        } catch (ClassNotFoundException cnfe) {
 +
            //En caso de error con el driver.
 +
            con = null;
 +
            val = false;
 +
            JOptionPane.showMessageDialog(new JFrame(), cnfe.toString()
 +
                .substring(34, cnfe.toString().length()),
 +
                    "Error!.- Falta Driver.", 0);
 +
        }
 +
        return val;
 +
    }
 +
</source>
 +
 +
-->
 +
 +
=== Plataformas soportadas ===
 +
Una versión del entorno de ejecución Java [[JRE]] (Java Runtime Environment) está disponible en la mayoría de equipos de escritorio. Sin embargo, [[Microsoft]] no lo ha incluido por defecto en sus sistemas operativos. En el caso de [[Apple Inc.|Apple]], éste incluye una versión propia del JRE en su sistema operativo, el [[Mac OS]]. También es un producto que por defecto aparece en la mayoría de las distribuciones de [[GNU/Linux]]. Debido a incompatibilidades entre distintas versiones del JRE, muchas aplicaciones prefieren instalar su propia copia del JRE antes que confiar su suerte a la aplicación instalada por defecto. Los desarrolladores de [[applets]] de Java o bien deben insistir a los usuarios en la actualización del JRE, o bien desarrollar bajo una versión antigua de Java y verificar el correcto funcionamiento en las versiones posteriores.
 +
 +
== Industria relacionada ==
 +
Sun Microsystem, como creador del [[lenguaje de programación]] Java y de la plataforma JDK, mantiene fuertes políticas para mantener una especificación del lenguaje<ref>[http://java.sun.com/docs/books/jls/ Especificación del lenguaje Java]</ref> así como de la  máquina virtual<ref>[http://java.sun.com/docs/books/vmspec/ Especificación de la máquina virtual Java]</ref> a través del JCP. Es debido a este esfuerzo que se mantiene un estándar de facto.
 +
 +
Son innumerables las compañías que desarrollan aplicaciones para Java y/o están volcadas con esta tecnología:
 +
 +
* La industria de la [[telefonía móvil]] está fuertemente influenciada por la tecnología Java.
 +
* El [[Eclipse (software)|entorno de desarrollo Eclipse]] ha tomado un lugar importante entre la comunidad de desarrolladores Java.
 +
* La fundación [[Apache]] tiene también una presencia importante en el desarrollo de bibliotecas y componentes de servidor basados en Java.
 +
* [[IBM]], [[BEA]], [[IONA]], [[Oracle]],... son empresas con grandes intereses y productos creados en y para Java.
 +
 +
== Críticas ==
 +
Harold dijo en 1995 que Java fue creado para abrir una nueva vía en la gestión de software complejo, y es por regla general aceptado que se ha comportado bien en ese aspecto. Sin embargo no puede decirse que Java no tenga grietas, ni que se adapta completamente a todos los estilos de programación, todos los entornos, o todas las necesidades.
 +
 +
=== General ===
 +
*Java no ha aportado capacidades estándares para aritmética en punto flotante. El estándar [[IEEE 754]] para “Estándar para Aritmética Binaria en Punto Flotante” apareció en 1985, y desde entonces es el estándar para la industria. Y aunque la aritmética flotante de Java ''(cosa que cambió desde el 13 de noviembre de 2006, cuando se abrió el código fuente y se adoptó la licencia GNU, aparte de la ya existente)'' se basa en gran medida en la norma del IEEE, no soporta aún algunas características. Más información al respecto puede encontrarse en la sección final de enlaces externos.
 +
 +
=== El lenguaje ===
 +
*En un sentido estricto, Java no es un lenguaje absolutamente orientado a objetos, a diferencia de, por ejemplo, [[Ruby]] o [[Smalltalk]]. Por motivos de eficiencia, Java ha relajado en cierta medida el paradigma de orientación a objetos, y así por ejemplo, no todos los valores son objetos.
 +
*El código Java puede ser a veces redundante en comparación con otros lenguajes. Esto es en parte debido a las frecuentes declaraciones de tipos y conversiones de tipo manual (casting). También se debe a que no se dispone de operadores sobrecargados, y a una sintaxis relativamente simple. Sin embargo, J2SE 5.0 introduce elementos para tratar de reducir la redundancia, como una nueva construcción para los bucles ‘’’foreach’’’.
 +
*A diferencia de C++, Java no dispone de operadores de sobrecarga definidos por el usuario. Los diseñadores de Java tomaron esta decisión puesto que consideraban que, bajo ciertas circunstancias, esta característica podía complicar la lectura y mantenimiento de los programas.
 +
 +
=== Apariencia ===
 +
La apariencia externa (el ‘’’look and feel’’’) de las aplicaciones GUI (Graphical User Interface) escritas en Java usando la plataforma Swing difiere a menudo de la que muestran aplicaciones nativas. Aunque el programador puede usar el juego de herramientas AWT (Abstract Windowing Toolkit) que genera objetos gráficos de la plataforma nativa, el AWT no es capaz de funciones gráficas avanzadas sin sacrificar la portabilidad entre plataformas; ya que cada una tiene un conjunto de APIs distinto, especialmente para objetos gráficos de alto nivel.
 +
Las herramientas de Swing, escritas completamente en Java, evitan este problema construyendo los objetos gráficos a partir de los mecanismos de dibujo básicos que deben estar disponibles en todas las plataformas. El inconveniente es el trabajo extra requerido para conseguir la misma apariencia de la plataforma destino. Aunque esto es posible (usando GTK+ y el Look-and-Feel de Windows), la mayoría de los usuarios no saben cómo cambiar la apariencia que se proporciona por defecto por aquella que se adapta a la de la plataforma.
 +
 +
=== Rendimiento ===
 +
El rendimiento de una aplicación está determinado por multitud de factores, por lo que no es fácil hacer una comparación que resulte totalmente objetiva. En tiempo de ejecución, el rendimiento de una aplicación Java depende más de la eficiencia del compilador, o la JVM, que de las propiedades intrínsecas del lenguaje. El bytecode de Java puede ser interpretado en tiempo de ejecución por la máquina virtual, o bien compilado al cargarse el programa, o durante la propia ejecución, para generar código nativo que se ejecuta directamente sobre el hardware. Si es interpretado, será más lento que usando el código máquina intrínseco de la plataforma destino. Si es compilado, durante la carga inicial o la ejecución, la penalización está en el tiempo necesario para llevar a cabo la compilación.
 +
 +
Algunas características del propio lenguaje conllevan una penalización en tiempo, aunque no son únicas de Java. Algunas de ellas son el chequeo de los límites de arrays, chequeo en tiempo de ejecución de tipos, y la indirección de  [[función virtual|funciones virtuales]].
 +
 +
El uso de un recolector de basura para eliminar de forma automática aquellos objetos no requeridos, añade una sobrecarga que puede afectar al rendimiento, o ser apenas apreciable, dependiendo de la tecnología del recolector y de la aplicación en concreto.
 +
Las JVM modernas usan recolectores de basura que gracias a rápidos algoritmos de manejo de memoria, consiguen que algunas aplicaciones puedan ejecutarse más eficientemente.
 +
 +
El rendimiento entre un compilador JIT y los compiladores nativos puede ser parecido, aunque la distinción no está clara en este punto. La compilación mediante el JIT puede consumir un tiempo apreciable, un inconveniente principalmente para aplicaciones de corta duración o con gran cantidad de código. Sin embargo, una vez compilado, el rendimiento del programa puede ser comparable al que consiguen compiladores nativos de la plataforma destino, inclusive en tareas numéricas. Aunque Java no permite la expansión manual de llamadas a métodos, muchos compiladores JIT realizan esta optimización durante la carga de la aplicación y pueden aprovechar información del entorno en tiempo de ejecución para llevar a cabo transformaciones eficientes durante la propia ejecución de la aplicación. Esta recompilación dinámica, como la que proporciona la máquina virtual HotSpot de Sun, puede llegar a mejorar el resultado de compiladores estáticos tradicionales, gracias a los datos que sólo están disponibles durante el tiempo de ejecución.
 +
 +
Java fue diseñado para ofrecer seguridad y portabilidad, y no ofrece acceso directo al hardware de la arquitectura ni al espacio de direcciones. Java no soporta expansión de código ensamblador, aunque las aplicaciones pueden acceder a características de bajo nivel usando bibliotecas nativas (JNI, Java Native Interfaces).
 +
 +
== Recursos ==
 +
=== '''JRE ''' ===
 +
El '''[[JRE]]''' (Java Runtime Environment, o Entorno en Tiempo de Ejecución de Java) es el software necesario para ejecutar cualquier aplicación desarrollada para la plataforma Java. El usuario final usa el JRE como parte de paquetes software o plugins (o conectores) en un navegador Web. Sun ofrece también el SDK de Java 2, o JDK (Java Development Kit) en cuyo seno reside el JRE, e incluye herramientas como el compilador de Java, [[Javadoc]] para generar documentación o el [[depurador]]. Puede también obtenerse como un paquete independiente, y puede considerarse como el entorno necesario para ejecutar una aplicación Java, mientras que un desarrollador debe además contar con otras facilidades que ofrece el JDK.
 +
 +
=== Componentes ===
 +
* Bibliotecas de Java, que son el resultado de compilar el código fuente desarrollado por quien implementa la JRE, y que ofrecen apoyo para el desarrollo en Java. Algunos ejemplos de estas bibliotecas son:
 +
** Las bibliotecas centrales, que incluyen:
 +
*** Una colección de bibliotecas para implementar [[estructuras de datos]] como [[listas]], arrays, árboles y conjuntos.
 +
*** Bibliotecas para análisis de [[XML]].
 +
*** Seguridad.
 +
*** Bibliotecas de internacionalización y localización.
 +
** Bibliotecas de integración, que permiten la comunicación con sistemas externos. Estas bibliotecas incluyen:
 +
*** La API para acceso a bases de datos [[JDBC]] (Java DataBase Conectivity).
 +
*** La [[Interfaz (Java)|interfaz]] JNDI (Java Naming and Directory Interface) para servicios de directorio.
 +
*** [[RMI]] (Remote Method Invocation) y [[CORBA]] para el desarrollo de aplicaciones distribuidas.
 +
** Bibliotecas para la interfaz de usuario, que incluyen:
 +
*** El conjunto de herramientas nativas AWT (Abstract Windowing Toolkit), que ofrece componentes GUI (Graphical User Interface), mecanismos para usarlos y manejar sus eventos asociados.
 +
*** Las Bibliotecas de Swing, construidas sobre AWT pero ofrecen implementaciones no nativas de los componentes de AWT.
 +
*** APIs para la captura, procesamiento y reproducción de audio.
 +
* Una implementación dependiente de la plataforma en que se ejecuta de la máquina virtual de Java (JVM), que es la encargada de la ejecución del código de las bibliotecas y las aplicaciones externas.
 +
* Plugins o conectores que permiten ejecutar applets en los navegadores Web.
 +
* Java Web Start, para la distribución de aplicaciones Java a través de Internet.
 +
* Documentación y licencia.
 +
 +
=== APIs ===
 +
Sun define tres plataformas en un intento por cubrir distintos entornos de aplicación. Así, ha distribuido muchas de sus [[Interfaz de programación de aplicaciones|APIs]] (Application Program Interface) de forma que pertenezcan a cada una de las plataformas:
 +
* Java ME (Java Platform, Micro Edition) o J2ME — orientada a entornos de limitados recursos, como teléfonos móviles, PDAs (Personal Digital Assistant), etc.
 +
* Java SE (Java Platform, Standard Edition) o J2SE — para entornos de gama media y estaciones de trabajo. Aquí se sitúa al usuario medio en un PC de escritorio.
 +
* Java EE (Java Platform, Enterprise Edition) o J2EE — orientada a entornos distribuidos empresariales o de Internet.
 +
 +
Las clases en las APIs de Java se organizan en grupos disjuntos llamados '''[[paquete]]s'''. Cada paquete contiene un conjunto de interfaces, clases y excepciones relacionadas. La información sobre los paquetes que ofrece cada plataforma puede encontrarse en la documentación de ésta.
 +
 +
El conjunto de las APIs es controlado por Sun Microsystems junto con otras entidades o personas a través del programa JCP (Java Community Process). Las compañías o individuos participantes del JCP pueden influir de forma activa en el diseño y desarrollo de las APIs, algo que ha sido motivo de controversia.
 +
 +
En 2004, IBM y BEA apoyaron públicamente la idea de crear una implementación de [[código abierto]] (open source) de Java, algo a lo que Sun, a fecha de 2006, se ha negado.
 +
 +
=== Extensiones y arquitecturas relacionadas ===
 +
<!----------------------------------------------------------------------------------
 +
  Sólo las del JCP
 +
----------------------------------------------------------------------------------->
 +
Las extensiones de Java están en paquetes que cuelgan de la raíz javax: <code>javax.*</code>. No se incluyen en la JDK o el JRE. Algunas de las extensiones y arquitecturas ligadas estrechamente al lenguaje Java son:
 +
*[[Java EE]] (Java Platform, Enterprise Edition; antes J2EE) —para aplicaciones distribuidas orientadas al entorno empresarial
 +
 +
== Java en código abierto ==
 +
Java se ha convertido en un lenguaje con una implantación masiva en todos los entornos (personales y empresariales). El control que mantiene Sun sobre éste genera reticencias en la comunidad de empresas con fuertes intereses en Java ([[IBM]], [[Oracle]]) y obviamente en la comunidad de desarrolladores de [[software libre]].
 +
 +
La evolución basada en un comité en el que participen todos los implicados no es suficiente y la comunidad demandaba desde hace tiempo la liberación de las [[Interfaz de programación de aplicaciones|APIs]] y bibliotecas básicas de la JDK.
 +
 +
En [[diciembre de 2006]], [[Sun]] comenzó relanzamiento de su plataforma Java<ref>[http://www.fsf.org/news/fsf-welcomes-gpl-java.html Sun begins releasing Java under the GPL - Free Software Foundation<!--Título generado por Muro Bot-->]</ref> bajo la licencia [[Licencia pública general de GNU|GPL]] de [[GNU]].
 +
 +
=== Alternativas libres ===
 +
Existen alternativas para el entorno de ejecución y de desarrollo de Java con una gran cobertura de funcionalidades con respecto a las implementaciones comerciales de Sun, IBM, Bea, etc.
 +
 +
=== Críticas referentes a Java y el software libre ===
 +
 +
*[http://www.gnu.org/philosophy/java-trap.html Free But Shackled — The Java Trap], de [[Richard Stallman]], [[12 de abril]], [[2004]]. ([http://today.java.net/jag/page7.html#59 respuesta de James Gosling])
 +
** Traducción al Español de este artículo: [http://www.gnu.org/philosophy/java-trap.es.html Libre pero encadenado. La trampa del Java.] (Nótese que hay una nota en un recuadro amarillo que habla de la situación actual con respecto a lo que se dice en ese artículo)
 +
Notar que este artículo fue escrito antes de la liberación del código fuente de Java. En la actualidad la postura de la [[Free Software Foundation]] y de [[Richard Stallman]] han cambiado, mostrándose partidarios ambos por su uso en software libre.
 +
 +
== Véase también ==
 +
* [[Applet Java]]
 +
* [[JavaOne]]
 +
* [[JavaOS]]
 +
* [[Javapedia]]
 +
* [[Java Community Process]]
 +
* [[Java User Group]]
 +
* [[Máquina virtual Java]]
 +
* [[Plataforma Java]]
 +
 +
== Referencias ==
 +
*Jon Byous, [http://java.sun.com/features/1998/05/birthday.html ''Java technology: The early years'']. Sun Developer Network, sin fecha[ca. 1998]. Recuperado 21 de abril de 2005.
 +
*[[James Gosling]], [http://today.java.net/jag/old/green/ ''A brief history of the Green project'']. Java.net, sin fecha [ca. Q1/1998]. Recuperado 22 abril de 2005.
 +
*[[James Gosling]], [[Bill Joy]], [[Guy L. Steele, Jr.|Guy Steele]], y [[Gilad Bracha]], ''The Java language specification'', tercera edición. Addison-Wesley, 2005. ISBN 0-321-24678-0.
 +
*Tim Lindholm y Frank Yellin. ''The Java Virtual Machine specification'', segunda edición. Addison-Wesley, 1999. ISBN 0-201-43294-3.
 +
 +
== Notas ==
 +
{{listaref}}
 +
 +
== Enlaces externos ==
 +
<!--
 +
{{Wikibookspar|Programming|Java}}
 +
{{Wikibookspar|Java Programming|Java}}
 +
-->
 +
{{wikibooks|Programación en Java}}
 +
*[http://torturo.com/programas-hechos-en-java/ Programas hechos en java con código fuente]
 +
=== Sun ===
 +
*[http://java.sun.com/ Sitio oficial de Java para desarrolladores, etc]
 +
*[http://java.sun.com/docs/books/jls/ The Java Language Specification, Tercera edición] Especificación oficial del lenguaje Java
 +
<!--
 +
* {{Javadoc:SE}}
 +
-->
 +
*[http://java.sun.com/docs/books/tutorial/ Tutorial de Sun sobre el Lenguaje de programación Java]
 +
*[http://java.sun.com/docs/white/langenv/ Libro blanco original de Java], 1996
 +
 +
=== Tutoriales ===
 +
*[http://java.sun.com/docs/books/tutorial/ The Java Tutorial] de Sun Microsystems (online)
 +
*[http://www.bruceeckel.com/ ''Thinking in Java''], de [[Bruce Eckel]] (online)
 +
*[http://chortle.ccsu.edu/CS151/cs151java.html An introduction to Computer Science using Java] por Bradley Kjell.
 +
*[http://www.vias.org/javacourse/ ''Java Course''], de A.B. Downey.
 +
 +
*[http://www.computer-books.us/java.php Computer-Books.us] Colección de libros sobre Java disponibles para descarga gratuita.
 +
 +
* En castellano:
 +
**[http://www.javaejemplos.com Ejemplos de código para que uses directamente en tus desarrollos.]
 +
**[http://www.lcc.uma.es/~galvez/ Colección «Java a tope» de libros electrónicos] (Universidad de Málaga. España)
 +
**[http://www.forodejava.com/downloads.php Tutoriales de Java avanzados, básicos y preguntas de certificación para practicar.]
 +
**[http://www.cursodejava.com.mx/index.html Curso de Java, de cero a hasta conexión a MYSQL, incluye PDF] (México)
 +
**[http://www.nullbrainexception.blogspot.com/ Capacitación en Java sobre Grandes Proyectos]
 +
 +
=== Certificaciones ===
 +
*[http://www.sun.com/training/certification/java/index.xml Página oficial de certificaciones de Sun Microsystems]
 +
*[http://scjp-sun.blogspot.com/ Recursos e información sobre certificaciones]
 +
 +
=== Críticas ===
 +
*[http://www.softpanorama.org/Lang/java.shtml Softpanorama Java Critique Page: Java vs Scripting Languages], de [[Nikolai Bezroukov]]
 +
*[http://www.cs.berkeley.edu/~wkahan/JAVAhurt.pdf How Java’s Floating-Point Hurts Everyone Everywhere], de [[W. Kahan und Joseph D. Darcy]] en el ''ACM 1998 Workshop on Java for High–Performance Network Computing''
 +
 +
 +
[[Categoría: Ciencias informáticas ]]

Revisión del 14:18 24 mar 2010


Java es un lenguaje de programación orientado a objetos desarrollado por Sun Microsystems a principios de los años 90. El lenguaje en sí mismo toma mucha de su sintaxis de C y C++, pero tiene un modelo de objetos más simple y elimina herramientas de bajo nivel, que suelen inducir a muchos errores, como la manipulación directa de punteros o memoria.

Las aplicaciones Java están típicamente compiladas en un bytecode, aunque la compilación en código máquina nativo también es posible. En el tiempo de ejecución, el bytecode es normalmente interpretado o compilado a código nativo para la ejecución, aunque la ejecución directa por hardware del bytecode por un procesador Java también es posible.

La implementación original y de referencia del compilador, la máquina virtual y las bibliotecas de clases de Java fueron desarrollados por Sun Microsystems en 1995. Desde entonces, Sun ha controlado las especificaciones, el desarrollo y evolución del lenguaje a través del Java Community Process, si bien otros han desarrollado también implementaciones alternativas de estas tecnologías de Sun, algunas incluso bajo licencias de software libre.

Entre noviembre de 2006 y mayo de 2007, Sun Microsystems liberó la mayor parte de sus tecnologías Java bajo la licencia GNU GPL, de acuerdo con las especificaciones del Java Community Process, de tal forma que prácticamente todo el Java de Sun es ahora software libre (aunque la biblioteca de clases de Sun que se requiere para ejecutar los programas Java aún no lo es).

Historia

La tecnología Java se creó como una herramienta de programación para ser usada en un proyecto de set-top-box en una pequeña operación denominada the Green Project en Sun Microsystems en el año 1991. El equipo (Green Team), compuesto por trece personas y dirigido por James Gosling, trabajó durante 18 meses en Sand Hill Road en Menlo Park en su desarrollo.

El lenguaje se denominó inicialmente Oak (por un roble que había fuera de la oficina de Gosling), luego pasó a denominarse Green tras descubrir que Oak era ya una marca comercial registrada para adaptadores de tarjetas gráficas y finalmente se renombró a Java.

El término Java fue acuñado en una cafetería frecuentada por algunos de los miembros del equipo. Pero no está claro si es un acrónimo o no, aunque algunas fuentes señalan que podría tratarse de las iniciales de sus creadores: James Gosling, Arthur Van Hoff, y Andy Bechtolsheim. Otros abogan por el siguiente acrónimo, Just Another Vague Acronym ("sólo otro acrónimo ambiguo más"). La hipótesis que más fuerza tiene es la que Java debe su nombre a un tipo de café disponible en la cafetería cercana, de ahí que el icono de java sea una taza de cafe caliente. Un pequeño signo que da fuerza a esta teoría es que los 4 primeros bytes (el número mágico) de los archivos .class que genera el compilador, son en hexadecimal, 0xCAFEBABE. Otros simplemente dicen que el nombre fue sacado al parecer de una lista aleatoria de palabras.

Los objetivos de Gosling eran implementar una máquina virtual y un lenguaje con una estructura y sintaxis similar a C++. Entre junio y julio de 1994, tras una sesión maratoniana de tres días entre John Gaga, James Gosling, Joy Naughton, Wayne Rosing y Eric Schmidt, el equipo reorientó la plataforma hacia la Web. Sintieron que la llegada del navegador web Mosaic, propiciaría que Internet se convirtiese en un medio interactivo, como el que pensaban era la televisión por cable. Naughton creó entonces un prototipo de navegador, WebRunner, que más tarde sería conocido como HotJava.

En 1994, se les hizo una demostración 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 pública Java y HotJava, el navegador Web. El acontecimiento fue anunciado por John Gage, el Director Científico de Sun Microsystems. El acto estuvo acompañado por una pequeña sorpresa adicional, el anuncio por parte de Marc Andreessen, Vicepresidente Ejecutivo de Netscape, de que Java sería soportado en sus navegadores. El 9 de enero del año siguiente, 1996, Sun fundó el grupo empresarial JavaSoft para que se encargase del desarrollo tecnológico. [1] Dos semanas más tarde la primera versión de Java fue publicada.

La promesa inicial de Gosling era Write Once, Run Anywhere (Escríbelo una vez, ejecútalo en cualquier lugar), proporcionando un lenguaje independiente de la plataforma y un entorno de ejecución (la JVM) ligero y gratuito para las plataformas más populares de forma que los binarios (bytecode) de las aplicaciones Java pudiesen ejecutarse en cualquier plataforma.

El entorno de ejecución era relativamente seguro y los principales navegadores web pronto incorporaron la posibilidad de ejecutar applets Java incrustadas en las páginas web.

Java ha experimentado numerosos cambios desde la versión primigenia, JDK 1.0, así como un enorme incremento en el número de clases y paquetes que componen la biblioteca estándar.

Desde J2SE 1.4, la evolución 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 Especificación del Lenguaje Java. Los cambios en los JLS son gestionados en JSR 901.

  • JDK 1.1 (19 de febrero de 1997) — Principales adiciones incluidas: comunicado de prensa
    • una reestructuración intensiva del modelo de eventos AWT (Abstract Windowing Toolkit)
    • clases internas (inner classes)
    • JavaBeans
    • JDBC (Java Database Connectivity), para la integración de bases de datos
    • RMI (Remote Method Invocation)
  • J2SE 1.2 (8 de diciembre de 1998) — Nombre clave Playground. Esta y las siguientes versiones fueron recogidas bajo la denominación Java 2 y el nombre "J2SE" (Java 2 Platform, Standard Edition), reemplazó a JDK para distinguir la plataforma base de J2EE (Java 2 Platform, Enterprise Edition) y J2ME (Java 2 Platform, Micro Edition). Otras mejoras añadidas incluían: comunicado de prensa
  • J2SE 5.0 (30 de septiembre de 2004) — Nombre clave: Tiger. (Originalmente numerado 1.5, esta notación aún es usada internamente.[2]) Desarrollado bajo JSR 176, Tiger añadió un número significativo de nuevas características comunicado de prensa
    • Plantillas (genéricos) — provee conversion de tipos (type safety) en tiempo de compilación para colecciones y elimina la necesidad de la mayoría de conversion de tipos (type casting). (Especificado por JSR 14.)
    • Metadatos — también llamados anotaciones, permite a estructuras del lenguaje como las clases o los métodos, ser etiquetados con datos adicionales, que puedan ser procesados posteriormente por utilidades de proceso de metadatos. (Especificado por JSR 175.)
    • Autoboxing/unboxing — Conversiones automáticas entre tipos primitivos (Como los int) y clases de envoltura primitivas (Como Plantilla:Javadoc:SE). (Especificado por JSR 201.)
    • Enumeraciones — la palabra reservada enum crea una typesafe, lista ordenada de valores (como Dia.LUNES, Dia.MARTES, etc.). Anteriormente, esto solo podía ser llevado a cabo por constantes enteras o clases construidas manualmente (enum pattern). (Especificado por JSR 201.)
    • Varargs (número de argumentos variable) — El último parámetro de un método puede ser declarado con el nombre del tipo seguido por tres puntos (e.g. void drawtext(String... lines)). En la llamada al método, puede usarse cualquier número de parámetros de ese tipo, que serán almacenados en un array para pasarlos al método.
    • Bucle for mejorado — La sintaxis para el bucle for se ha extendido con una sintaxis especial para iterar sobre cada miembro de un array o sobre cualquier clase que implemente Plantilla:Javadoc:SE, como la clase estándar Plantilla:Javadoc:SE, de la siguiente forma:
 void displayWidgets (Iterable<Widget> widgets) {
     for (Widget w : widgets) {
         w.display();
     }
 }

Este ejemplo itera sobre el objeto Iterable widgets, asignando, en orden, cada uno de los elementos a la variable w, y llamando al método display() de cada uno de ellos. (Especificado por JSR 201.) |}

  • Java SE 6 (11 de diciembre de 2006) — Nombre clave Mustang. Estuvo en desarrollo bajo la JSR 270. En esta versión, Sun cambió el nombre "J2SE" por Java SE y eliminó el ".0" del número de versión.[3]. Está disponible en http://java.sun.com/javase/6/. Los cambios más importantes introducidos en esta versión son:
    • Incluye un nuevo marco de trabajo y APIs que hacen posible la combinación de Java con lenguajes dinámicos como PHP, Python, Ruby y JavaScript.
    • Incluye el motor Rhino, de Mozilla, una implementación de Javascript en Java.
    • Incluye un cliente completo de Servicios Web y soporta las últimas especificaciones para Servicios Web, como JAX-WS 2.0, JAXB 2.0, STAX y JAXP.
    • Mejoras en la interfaz gráfica y en el rendimiento.
  • Java SE 7 — Nombre clave Dolphin. En el año 2006 aún se encontraba en las primeras etapas de planificación. Se espera que su desarrollo dé comienzo en la primavera de 2006, y se estima su lanzamiento para 2008.
    • Soporte para XML dentro del propio lenguaje.
    • Un nuevo concepto de superpaquete.
    • Soporte para closures.
    • Introducción de anotaciones estándar para detectar fallos en el software.
  • No oficiales:
    • NIO2.
    • Java Module System.
    • Java Kernel.
    • Nueva API para el manejo de Dias y Fechas, la cual reemplazara las antiguas clases Date y Calendar.
    • Posibilidad de operar con clases BigDecimal usando operandos.

[4]

Además de los cambios en el lenguaje, con el paso de los años se han efectuado muchos más cambios dramáticos en la biblioteca de clases de Java (Java class library) que ha crecido de unos pocos cientos de clases en JDK 1.0 hasta más de tres mil en J2SE 5.0. APIs completamente nuevas, como Swing y Java2D, han sido introducidas y muchos de los métodos y clases originales de JDK 1.0 están obsoletas.

En el 2005 se calcula en 4,5 millones el número de desarrolladores y 2.500 millones de dispositivos habilitados con tecnología Java.

Filosofía

El lenguaje Java se creó con cinco objetivos principales:

  1. Debería usar la metodología de la programación orientada a objetos.
  2. Debería permitir la ejecución de un mismo programa en múltiples sistemas operativos.
  3. Debería incluir por defecto soporte para trabajo en red.
  4. Debería diseñarse para ejecutar código en sistemas remotos de forma segura.
  5. Debería ser fácil de usar y tomar lo mejor de otros lenguajes orientados a objetos, como C++.

Para conseguir la ejecución de código 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 o OSGi respectivamente.

Orientado a Objetos

La primera característica, orientado a objetos (“OO”), se refiere a un método de programación y al diseño del lenguaje. Aunque hay muchas interpretaciones para OO, una primera idea es diseñar el software de forma que los distintos tipos de datos que usen estén unidos a sus operaciones. Así, los datos y el código (funciones o métodos) se combinan en entidades llamadas objetos. Un objeto puede verse como un paquete que contiene el “comportamiento” (el código) y el “estado” (datos). El principio es separar aquello que cambia de las cosas que permanecen inalterables. Frecuentemente, cambiar una estructura de datos implica un cambio en el código que opera sobre los mismos, o viceversa. Esta separación en objetos coherentes e independientes ofrece una base más estable para el diseño de un sistema software. El objetivo es hacer que grandes proyectos sean fáciles de gestionar y manejar, mejorando como consecuencia su calidad y reduciendo el número de proyectos fallidos. Otra de las grandes promesas de la programación orientada a objetos es la creación de entidades más genéricas (objetos) que permitan la reutilización del software entre proyectos, una de las premisas fundamentales de la Ingeniería del Software. Un objeto genérico “cliente”, por ejemplo, debería en teoría tener el mismo conjunto de comportamiento en diferentes proyectos, sobre todo cuando estos coinciden en cierta medida, algo que suele suceder en las grandes organizaciones. En este sentido, los objetos podrían verse como piezas reutilizables que pueden emplearse en múltiples proyectos distintos, posibilitando así a la industria del software a construir proyectos de envergadura empleando componentes ya existentes y de comprobada calidad; conduciendo esto finalmente a una reducción drástica del tiempo de desarrollo. Podemos usar como ejemplo de objeto el aluminio. Una vez definidos datos (peso, maleabilidad, etc.), y su “comportamiento” (soldar dos piezas, etc.), el objeto “aluminio” puede ser reutilizado en el campo de la construcción, del automóvil, de la aviación, etc.

La reutilización del software ha experimentado resultados dispares, encontrando dos dificultades principales: el diseño de objetos realmente genéricos es pobremente comprendido, y falta una metodología para la amplia comunicación de oportunidades de reutilización. Algunas comunidades de “código abierto” (open source) quieren ayudar en este problema dando medios a los desarrolladores para diseminar la información sobre el uso y versatilidad de objetos reutilizables y bibliotecas de objetos.

Independencia de la plataforma

La segunda característica, la independencia de la plataforma, significa que programas escritos en el lenguaje Java pueden ejecutarse igualmente en cualquier tipo de hardware. Este es el significado de ser capaz de escribir un programa una vez y que pueda ejecutarse en cualquier dispositivo, tal como reza el axioma de Java, ‘’’write once, run everywhere’’’.

Para ello, se compila el código fuente escrito en lenguaje Java, para generar un código conocido como “bytecode” (específicamente Java bytecode)—instrucciones máquina simplificadas específicas de la plataforma Java. Esta pieza está “a medio camino” entre el código fuente y el código máquina que entiende el dispositivo destino. El bytecode es ejecutado entonces en la máquina virtual (JVM), un programa escrito en código nativo de la plataforma destino (que es el que entiende su hardware), que interpreta y ejecuta el código. Además, se suministran bibliotecas adicionales para acceder a las características de cada dispositivo (como los gráficos, ejecución mediante hebras o threads, la interfaz de red) de forma unificada. Se debe tener presente que, aunque hay una etapa explícita de compilación, el bytecode generado es interpretado o convertido a instrucciones máquina del código nativo por el compilador JIT (Just In Time).

Hay implementaciones del compilador de Java que convierten el código fuente directamente en código objeto nativo, como GCJ. Esto elimina la etapa intermedia donde se genera el bytecode, pero la salida de este tipo de compiladores sólo puede ejecutarse en un tipo de arquitectura.

La licencia sobre Java de Sun insiste que todas las implementaciones sean “compatibles”. Esto dio lugar a una disputa legal entre Microsoft y Sun, cuando éste último alegó que la implementación de Microsoft no daba soporte a las interfaces RMI y JNI además de haber añadido características ‘’dependientes’’ de su plataforma. Sun demandó a Microsoft y ganó por daños y perjuicios (unos 20 millones de dólares) así como una orden judicial forzando la acatación de la licencia de Sun. Como respuesta, Microsoft no ofrece Java con su versión de sistema operativo, y en recientes versiones de Windows, su navegador Internet Explorer no admite la ejecución de applets sin un conector (o plugin) aparte. Sin embargo, Sun y otras fuentes ofrecen versiones gratuitas para distintas versiones de Windows.

Las primeras implementaciones del lenguaje usaban una máquina virtual interpretada para conseguir la portabilidad. Sin embargo, el resultado eran programas que se ejecutaban comparativamente más lentos que aquellos escritos en C o C++. Esto hizo que Java se ganase una reputación de lento en rendimiento. Las implementaciones recientes de la JVM dan lugar a programas que se ejecutan considerablemente más rápido que las versiones antiguas, empleando diversas técnicas, aunque sigue siendo mucho más lento que otros lenguajes.

La primera de estas técnicas es simplemente compilar directamente en código nativo como hacen los compiladores tradicionales, eliminando la etapa del bytecode. Esto da lugar a un gran rendimiento en la ejecución, pero tapa el camino a la portabilidad. Otra técnica, conocida como compilación JIT (Just In Time, o ‘’’compilación al vuelo’’’), convierte el bytecode a código nativo cuando se ejecuta la aplicación. Otras máquinas virtuales más sofisticadas usan una ‘’’recompilación dinámica’’’ en la que la VM es capaz de analizar el comportamiento del programa en ejecución y recompila y optimiza las partes críticas. La recompilación dinámica puede lograr mayor grado de optimización que la compilación tradicional (o estática), ya que puede basar su trabajo en el conocimiento que de primera mano tiene sobre el entorno de ejecución y el conjunto de clases cargadas en memoria. La compilación JIT y la recompilación dinámica permiten a los programas Java aprovechar la velocidad de ejecución del código nativo sin por ello perder la ventaja de la portabilidad en ambos.

La portabilidad es técnicamente difícil de lograr, y el éxito de Java en ese campo ha sido dispar. Aunque es de hecho posible escribir programas para la plataforma Java que actúen de forma correcta en múltiples plataformas de distinta arquitectura, el gran número de estas con pequeños errores o inconsistencias llevan a que a veces se parodie el eslogan de Sun, "Write once, run anywhere" como "Write once, debug everywhere" (o “Escríbelo una vez, ejecútalo en cualquier parte” por “Escríbelo una vez, depúralo en todas partes”)

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.

El recolector de basura

Plantilla:VT

En Java el problema de las fugas de memoria se evita en gran medida gracias a la recolección de basura (o automatic garbage collector). El programador determina cuándo se crean los objetos y el entorno en tiempo de ejecución 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 éste. 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 método sólo tiene entidad dentro de éste; al salir del método el objeto es eliminado). Aun así, es posible que se produzcan fugas de memoria si el código almacena referencias a objetos que ya no son necesarios—es decir, pueden aún ocurrir, pero en un nivel conceptual superior. En definitiva, el recolector de basura de Java permite una fácil creación y eliminación de objetos, mayor seguridad y puede que más rápida que en C++ Plantilla:Añadir referencias.

Sintaxis

La sintaxis de Java se deriva en gran medida de C++. Pero a diferencia de éste, que combina la sintaxis para programación genérica, 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).

Hola Mundo

Aplicaciones autónomas

// Hola.java
import java.io*;
public class Hola 
{
    public static void main(String[] args)throws IOException {
        System.out.println("¡Hola, mundo!"); 
    } 
}

Este ejemplo necesita una pequeña explicación.

  • Todo en Java está dentro de una clase, incluyendo programas autónomos.
  • El código fuente se guarda en archivos con el mismo nombre que la clase que contienen y con extensión “.java”. Una clase (class) declarada pública (public) debe seguir este convenio. En el ejemplo anterior, la clase es Hola, por lo que el código fuente debe guardarse en el fichero “Hola.java”
  • El compilador genera un archivo de clase (con extensión “.class”) por cada una de las clases definidas en el archivo fuente. Una clase anónima se trata como si su nombre fuera la concatenación del nombre de la clase que la encierra, el símbolo “$”, y un número entero.
  • Los programas que se ejecutan de forma independiente y autónoma, deben contener el método ”main()”.
  • La palabra reservada ”void” indica que el método main no devuelve nada.
  • El método main debe aceptar un array de objetos tipo String. Por acuerdo se referencia como ”args”, aunque puede emplearse cualquier otro identificador.
  • La palabra reservada ”static” indica que el método es un método de clase, asociado a la clase en vez de una instancias de la misma. El método main debe ser estático o ’’de clase’’.
  • La palabra reservada public significa que un método puede ser llamado desde otras clases, o que la clase puede ser usada por clases fuera de la jerarquía de la propia clase. Otros tipos de acceso son ”private” o ”protected”.
  • La utilidad de impresión (en pantalla por ejemplo) forma parte de la biblioteca estándar de Java: la clase ‘’’System’’’ define un campo público estático llamado ‘’’out’’’. El objeto out es una instancia de ‘’’PrintStream’’’, que ofrece el método ‘’’println (String)’’’ para volcar datos en la pantalla (la salida estándar).
  • Las aplicaciones autónomas se ejecutan dando al entorno de ejecución de Java el nombre de la clase cuyo método main debe invocarse. Por ejemplo, una línea de comando (en Unix o Windows) de la forma java –cp . Hola ejecutará el programa del ejemplo (previamente compilado y generado “Hola.class”) . El nombre de la clase cuyo método main se llama puede especificarse también en el fichero “MANIFEST” del archivo de empaquetamiento de Java (.jar).

Applets

Las applet Java son programas incrustados en otras aplicaciones, normalmente una página Web que se muestra en un navegador.

// Hola.java
import java.applet.Applet;
import java.awt.Graphics;

public class Hola extends Applet {
    public void paint(Graphics gc) {
        gc.drawString("Hola, mundo!", 65, 95);
    }    
}
 <!-- Hola.html -->
<html>
  <head>
    <title>Applet Hola Mundo</title>
  </head>
  <body>
    <applet code="Hola.class" width="200" height="200">
    </applet>
  </body>
</html>

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 código fuente.

La clase Hola extiende (extends) a la clase Applet, es decir, es una subclase de ésta. La clase Applet permite a la aplicación mostrar y controlar el estado del applet. La clase Applet es un componente del AWT (Abstract Window Toolkit), que permite al applet mostrar una inteterfaz gráfica de usuario o GUI (Graphical User Interface), y responder a eventos generados por el usuario.

La clase Hola sobrecarga el método paint (Graphics) heredado de la superclase contenedora (Applet en este caso), para acceder al código encargado de dibujar. El método paint() recibe un objeto Graphics que contiene el contexto gráfico para dibujar el applet. El método paint() llama al método drawString (String, int, int) del objeto Graphics para mostrar la cadena de caracteres Hola, mundo! en la posición (65, 96) del espacio de dibujo asignado al applet.

La referencia al applet es colocada en un documento HTML usando la etiqueta <applet>. Esta etiqueta o tag tiene tres atributos: code="Hola" indica el nombre del applet, y width="200" height="200" establece la anchura y altura, respectivamente, del applet. Un applet también pueden alojarse dentro de un documento HTML usando los elementos object, o embed, aunque el soporte que ofrecen los navegadores Web no es uniforme.[5][6]

Servlets

Los servlets son componentes de la parte del servidor de Java EE, encargados de generar respuestas a las peticiones recibidas de los clientes.

// Hola.java
import java.io.*;
import javax.servlet.*;

public class Hola extends GenericServlet 
{
    public void service(ServletRequest request, ServletResponse response)
        throws ServletException, IOException
    {
        response.setContentType("text/html");
        PrintWriter pw = response.getWriter();
        pw.println("Hola, mundo!");
        pw.close();
    }
}

Las sentencias import indican al compilador de Java la inclusión de todas las clases públicas e interfaces de los paquetes java.io y javax.servlet en la compilación.

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.

La clase Hola sobrecarga el método service (ServletRequest, ServletResponse), definido por la interfaz servlet para acceder al manejador de la petición de servicio. El método service() recibe un objeto de tipo ServletRequest que contiene la petición del cliente y un objeto de tipo ServletResponse, usado para generar la respuesta que se devuelve al cliente. El método service() puede lanzar (throws) excepciones de tipo ServletException e IOException si ocurre algún tipo de anomalía.

El método setContentType (String) en el objeto respuesta establece el tipo de contenido MIME a "text/html", para indicar al cliente que la respuesta a su petición es una página con formato HTML. El método getWriter() del objeto respuesta devuelve un objeto de tipo PrintWriter, usado como una tubería por la que viajarán los datos al cliente. El método println (String) escribe la cadena "Hola, mundo!" en la respuesta y finalmente se llama al método close() para cerrar la conexión, que hace que los datos escritos en la tubería o stream sean devueltos al cliente.

Aplicaciones con ventanas

Swing es la biblioteca para la interfaz gráfica de usuario avanzada de la plataforma Java SE.

 // Hola.java
 import javax.swing.*;
 
 public class Hola extends JFrame {
     Hola() {
         setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
         add(new JLabel("Hola, mundo!"));
         pack();
     }
 
     public static void main(String[] args) {
         new Hola().setVisible(true);
     }
 }

Las instrucciones import indican al compilador de Java que las clases e interfaces del paquete javax.swing se incluyan en la compilación.

La clase Hola extiende (extends) la clase javax.swing.JFrame, que implementa una ventana con una barra de título y un control para cerrarla.

El constructor Hola() inicializa el marco o frame llamando al método setDefaultCloseOperation (int) heredado de JFrame para establecer las operaciones por defecto cuando el control de cierre en la barra de título 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 máquina virtual y al programa acabar su ejecución. A continuación se crea un objeto de tipo JLabel con el texto "Hola, mundo!", y se añade al marco mediante el método add (Component), heredado de la clase Container. El método pack(), heredado de la clase Window, es invocado para dimensionar la ventana y distribuir su contenido.

El método 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 método setVisible (boolean) de la superclase (clase de la que hereda) con el parámetro a true. Véase que, una vez el marco es dibujado, el programa no termina cuando se sale del método main(), ya que el código del que depende se encuentra en un hilo de ejecución independiente ya lanzado, y que permanecerá activo hasta que todas las ventanas hayan sido destruidas.

Entornos de funcionamiento

El diseño de Java, su robustez, el respaldo de la industria y su fácil 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 informática.

En dispositivos móviles y sistemas empotrados

Desde la creación de la especificación J2ME (Java 2 Platform, Micro Edition), una versión del entorno de ejecución Java reducido y altamente optimizado, especialmente desarrollado para el mercado de dispositivos electrónicos de consumo se ha producido toda una revolución en lo que a la extensión de Java se refiere.

Es posible encontrar microprocesadores específicamente diseñados para ejecutar bytecode Java y software Java para tarjetas inteligentes (JavaCard), teléfonos móviles, buscapersonas, set-top-boxes, sintonizadores de TV y otros pequeños electrodomésticos.

El modelo de desarrollo de estas aplicaciones es muy semejante a las applets de los navegadores salvo que en este caso se denominan MIDlets.

Véase Sun Mobile Device Tecnology

En el navegador web

Desde la primera versión de java existe la posibilidad de desarrollar pequeñas aplicaciones (Applets) en Java que luego pueden ser incrustadas en una página HTML para que sean descargadas y ejecutadas por el navegador web. Estas mini-aplicaciones se ejecutan en una JVM que el navegador tiene configurada como extensión (plug-in) en un contexto de seguridad restringido configurable para impedir la ejecución local de código potencialmente malicioso.

El éxito de este tipo de aplicaciones (la visión del equipo de Gosling) no fue realmente el esperado debido a diversos factores, siendo quizás el más importante la lentitud y el reducido ancho de banda de las comunicaciones en aquel entonces que limitaba el tamaño de las applets que se incrustaban en el navegador. La aparición posterior de otras alternativas (aplicaciones web dinámicas de servidor) dejó un reducido ámbito de uso para esta tecnología, quedando hoy relegada fundamentalmente a componentes específicos para la intermediación desde una aplicación web dinámica de servidor con dispositivos ubicados en la máquina cliente donde se ejecuta el navegador.

Las applets Java no son las únicas tecnologías (aunque sí las primeras) de componentes complejos incrustados en el navegador. Otras tecnologías similares pueden ser: ActiveX de Microsoft, Flash, Java Web Start, etc.

En sistemas de servidor

En la parte del servidor, Java es más popular que nunca, desde la aparición de la especificación de Servlets y JSP (Java Server Pages).

Hasta entonces, las aplicaciones web dinámicas de servidor que existían se basaban fundamentalmente en componentes CGI y lenguajes interpretados. Ambos tenían diversos inconvenientes (fundamentalmente lentitud, elevada carga computacional o de memoria y propensión a errores por su interpretación dinámica).

Los servlets y las JSPs supusieron un importante avance ya que:

  • El API de programación es muy sencilla, flexible y extensible.
  • Los servlets no son procesos independientes (como los CGIs) y por tanto se ejecutan dentro del mismo proceso que la JVM mejorando notablemente el rendimiento y reduciendo la carga computacional y de memoria requeridas.
  • Las JSPs son páginas que se compilan dinámicamente (o se pre-compilan previamente a su distribución) de modo que el código que se consigue una ventaja en rendimiento substancial frente a muchos lenguajes interpretados.

La especificación de Servlets y JSPs define un API de programación y los requisitos para un contenedor (servidor) dentro del cual se puedan desplegar estos componentes para formar aplicaciones web dinámicas completas. Hoy día existen multitud de contenedores (libres y comerciales) compatibles con estas especificaciones.

A partir de su expansión entre la comunidad de desarrolladores, estas tecnologías han dado paso a modelos de desarrollo mucho más elaborados con frameworks (pe Struts, Webwork) que se sobreponen sobre los servlets y las JSPs para conseguir un entorno de trabajo mucho más poderoso y segmentado en el que la especialización de roles sea posible (desarrolladores, diseñadores gráficos, ...) y se facilite la reutilización y robustez de código. A pesar de todo ello, las tecnologías que subyacen (Servlets y JSPs) son substancialmente las mismas.

Este modelo de trabajo se ha convertido en uno de los estándar de-facto para el desarrollo de aplicaciones web dinámicas de servidor.

En aplicaciones de escritorio

Hoy en día existen multitud de aplicaciones gráficas de usuario basadas en Java. El entorno de ejecución Java (JRE) se ha convertido en un componente habitual en los PC de usuario de los sistemas operativos más usados en el mundo. Además, muchas aplicaciones Java lo incluyen dentro del propio paquete de la aplicación de modo que se ejecuten en cualquier PC.

En las primeras versiones de la plataforma Java existían importantes limitaciones en las APIs de desarrollo gráfico (AWT). Desde la aparición de la biblioteca Swing la situación mejoró substancialmente y posteriormente con la aparición de bibliotecas como SWT hacen que el desarrollo de aplicaciones de escritorio complejas y con gran dinamismo, usabilidad, etc. sea relativamente sencillo.


Plataformas soportadas

Una versión del entorno de ejecución Java JRE (Java Runtime Environment) está disponible en la mayoría de equipos de escritorio. Sin embargo, Microsoft no lo ha incluido por defecto en sus sistemas operativos. En el caso de Apple, éste incluye una versión propia del JRE en su sistema operativo, el Mac OS. También es un producto que por defecto aparece en la mayoría de las distribuciones de GNU/Linux. Debido a incompatibilidades entre distintas versiones del JRE, muchas aplicaciones prefieren instalar su propia copia del JRE antes que confiar su suerte a la aplicación instalada por defecto. Los desarrolladores de applets de Java o bien deben insistir a los usuarios en la actualización del JRE, o bien desarrollar bajo una versión antigua de Java y verificar el correcto funcionamiento en las versiones posteriores.

Industria relacionada

Sun Microsystem, como creador del lenguaje de programación Java y de la plataforma JDK, mantiene fuertes políticas para mantener una especificación del lenguaje[1] así como de la máquina virtual[2] a través del JCP. Es debido a este esfuerzo que se mantiene un estándar de facto.

Son innumerables las compañías que desarrollan aplicaciones para Java y/o están volcadas con esta tecnología:

  • La industria de la telefonía móvil está fuertemente influenciada por la tecnología Java.
  • El entorno de desarrollo Eclipse ha tomado un lugar importante entre la comunidad de desarrolladores Java.
  • La fundación Apache tiene también una presencia importante en el desarrollo de bibliotecas y componentes de servidor basados en Java.
  • IBM, BEA, IONA, Oracle,... son empresas con grandes intereses y productos creados en y para Java.

Críticas

Harold dijo en 1995 que Java fue creado para abrir una nueva vía en la gestión de software complejo, y es por regla general aceptado que se ha comportado bien en ese aspecto. Sin embargo no puede decirse que Java no tenga grietas, ni que se adapta completamente a todos los estilos de programación, todos los entornos, o todas las necesidades.

General

  • Java no ha aportado capacidades estándares para aritmética en punto flotante. El estándar IEEE 754 para “Estándar para Aritmética Binaria en Punto Flotante” apareció en 1985, y desde entonces es el estándar para la industria. Y aunque la aritmética flotante de Java (cosa que cambió desde el 13 de noviembre de 2006, cuando se abrió el código fuente y se adoptó la licencia GNU, aparte de la ya existente) se basa en gran medida en la norma del IEEE, no soporta aún algunas características. Más información al respecto puede encontrarse en la sección final de enlaces externos.

El lenguaje

  • En un sentido estricto, Java no es un lenguaje absolutamente orientado a objetos, a diferencia de, por ejemplo, Ruby o Smalltalk. Por motivos de eficiencia, Java ha relajado en cierta medida el paradigma de orientación a objetos, y así por ejemplo, no todos los valores son objetos.
  • El código Java puede ser a veces redundante en comparación con otros lenguajes. Esto es en parte debido a las frecuentes declaraciones de tipos y conversiones de tipo manual (casting). También se debe a que no se dispone de operadores sobrecargados, y a una sintaxis relativamente simple. Sin embargo, J2SE 5.0 introduce elementos para tratar de reducir la redundancia, como una nueva construcción para los bucles ‘’’foreach’’’.
  • A diferencia de C++, Java no dispone de operadores de sobrecarga definidos por el usuario. Los diseñadores de Java tomaron esta decisión puesto que consideraban que, bajo ciertas circunstancias, esta característica podía complicar la lectura y mantenimiento de los programas.

Apariencia

La apariencia externa (el ‘’’look and feel’’’) de las aplicaciones GUI (Graphical User Interface) escritas en Java usando la plataforma Swing difiere a menudo de la que muestran aplicaciones nativas. Aunque el programador puede usar el juego de herramientas AWT (Abstract Windowing Toolkit) que genera objetos gráficos de la plataforma nativa, el AWT no es capaz de funciones gráficas avanzadas sin sacrificar la portabilidad entre plataformas; ya que cada una tiene un conjunto de APIs distinto, especialmente para objetos gráficos de alto nivel. Las herramientas de Swing, escritas completamente en Java, evitan este problema construyendo los objetos gráficos a partir de los mecanismos de dibujo básicos que deben estar disponibles en todas las plataformas. El inconveniente es el trabajo extra requerido para conseguir la misma apariencia de la plataforma destino. Aunque esto es posible (usando GTK+ y el Look-and-Feel de Windows), la mayoría de los usuarios no saben cómo cambiar la apariencia que se proporciona por defecto por aquella que se adapta a la de la plataforma.

Rendimiento

El rendimiento de una aplicación está determinado por multitud de factores, por lo que no es fácil hacer una comparación que resulte totalmente objetiva. En tiempo de ejecución, el rendimiento de una aplicación Java depende más de la eficiencia del compilador, o la JVM, que de las propiedades intrínsecas del lenguaje. El bytecode de Java puede ser interpretado en tiempo de ejecución por la máquina virtual, o bien compilado al cargarse el programa, o durante la propia ejecución, para generar código nativo que se ejecuta directamente sobre el hardware. Si es interpretado, será más lento que usando el código máquina intrínseco de la plataforma destino. Si es compilado, durante la carga inicial o la ejecución, la penalización está en el tiempo necesario para llevar a cabo la compilación.

Algunas características del propio lenguaje conllevan una penalización en tiempo, aunque no son únicas de Java. Algunas de ellas son el chequeo de los límites de arrays, chequeo en tiempo de ejecución de tipos, y la indirección de funciones virtuales.

El uso de un recolector de basura para eliminar de forma automática aquellos objetos no requeridos, añade una sobrecarga que puede afectar al rendimiento, o ser apenas apreciable, dependiendo de la tecnología del recolector y de la aplicación en concreto. Las JVM modernas usan recolectores de basura que gracias a rápidos algoritmos de manejo de memoria, consiguen que algunas aplicaciones puedan ejecutarse más eficientemente.

El rendimiento entre un compilador JIT y los compiladores nativos puede ser parecido, aunque la distinción no está clara en este punto. La compilación mediante el JIT puede consumir un tiempo apreciable, un inconveniente principalmente para aplicaciones de corta duración o con gran cantidad de código. Sin embargo, una vez compilado, el rendimiento del programa puede ser comparable al que consiguen compiladores nativos de la plataforma destino, inclusive en tareas numéricas. Aunque Java no permite la expansión manual de llamadas a métodos, muchos compiladores JIT realizan esta optimización durante la carga de la aplicación y pueden aprovechar información del entorno en tiempo de ejecución para llevar a cabo transformaciones eficientes durante la propia ejecución de la aplicación. Esta recompilación dinámica, como la que proporciona la máquina virtual HotSpot de Sun, puede llegar a mejorar el resultado de compiladores estáticos tradicionales, gracias a los datos que sólo están disponibles durante el tiempo de ejecución.

Java fue diseñado para ofrecer seguridad y portabilidad, y no ofrece acceso directo al hardware de la arquitectura ni al espacio de direcciones. Java no soporta expansión de código ensamblador, aunque las aplicaciones pueden acceder a características de bajo nivel usando bibliotecas nativas (JNI, Java Native Interfaces).

Recursos

JRE

El JRE (Java Runtime Environment, o Entorno en Tiempo de Ejecución de Java) es el software necesario para ejecutar cualquier aplicación desarrollada para la plataforma Java. El usuario final usa el JRE como parte de paquetes software o plugins (o conectores) en un navegador Web. Sun ofrece también el SDK de Java 2, o JDK (Java Development Kit) en cuyo seno reside el JRE, e incluye herramientas como el compilador de Java, Javadoc para generar documentación o el depurador. Puede también obtenerse como un paquete independiente, y puede considerarse como el entorno necesario para ejecutar una aplicación Java, mientras que un desarrollador debe además contar con otras facilidades que ofrece el JDK.

Componentes

  • Bibliotecas de Java, que son el resultado de compilar el código fuente desarrollado por quien implementa la JRE, y que ofrecen apoyo para el desarrollo en Java. Algunos ejemplos de estas bibliotecas son:
    • Las bibliotecas centrales, que incluyen:
      • Una colección de bibliotecas para implementar estructuras de datos como listas, arrays, árboles y conjuntos.
      • Bibliotecas para análisis de XML.
      • Seguridad.
      • Bibliotecas de internacionalización y localización.
    • Bibliotecas de integración, que permiten la comunicación con sistemas externos. Estas bibliotecas incluyen:
      • La API para acceso a bases de datos JDBC (Java DataBase Conectivity).
      • La interfaz JNDI (Java Naming and Directory Interface) para servicios de directorio.
      • RMI (Remote Method Invocation) y CORBA para el desarrollo de aplicaciones distribuidas.
    • Bibliotecas para la interfaz de usuario, que incluyen:
      • El conjunto de herramientas nativas AWT (Abstract Windowing Toolkit), que ofrece componentes GUI (Graphical User Interface), mecanismos para usarlos y manejar sus eventos asociados.
      • Las Bibliotecas de Swing, construidas sobre AWT pero ofrecen implementaciones no nativas de los componentes de AWT.
      • APIs para la captura, procesamiento y reproducción de audio.
  • Una implementación dependiente de la plataforma en que se ejecuta de la máquina virtual de Java (JVM), que es la encargada de la ejecución del código de las bibliotecas y las aplicaciones externas.
  • Plugins o conectores que permiten ejecutar applets en los navegadores Web.
  • Java Web Start, para la distribución de aplicaciones Java a través de Internet.
  • Documentación y licencia.

APIs

Sun define tres plataformas en un intento por cubrir distintos entornos de aplicación. Así, ha distribuido muchas de sus APIs (Application Program Interface) de forma que pertenezcan a cada una de las plataformas:

  • Java ME (Java Platform, Micro Edition) o J2ME — orientada a entornos de limitados recursos, como teléfonos móviles, PDAs (Personal Digital Assistant), etc.
  • Java SE (Java Platform, Standard Edition) o J2SE — para entornos de gama media y estaciones de trabajo. Aquí se sitúa al usuario medio en un PC de escritorio.
  • Java EE (Java Platform, Enterprise Edition) o J2EE — orientada a entornos distribuidos empresariales o de Internet.

Las clases en las APIs de Java se organizan en grupos disjuntos llamados paquetes. Cada paquete contiene un conjunto de interfaces, clases y excepciones relacionadas. La información sobre los paquetes que ofrece cada plataforma puede encontrarse en la documentación de ésta.

El conjunto de las APIs es controlado por Sun Microsystems junto con otras entidades o personas a través del programa JCP (Java Community Process). Las compañías o individuos participantes del JCP pueden influir de forma activa en el diseño y desarrollo de las APIs, algo que ha sido motivo de controversia.

En 2004, IBM y BEA apoyaron públicamente la idea de crear una implementación de código abierto (open source) de Java, algo a lo que Sun, a fecha de 2006, se ha negado.

Extensiones y arquitecturas relacionadas

Las extensiones de Java están en paquetes que cuelgan de la raíz javax: javax.*. No se incluyen en la JDK o el JRE. Algunas de las extensiones y arquitecturas ligadas estrechamente al lenguaje Java son:

  • Java EE (Java Platform, Enterprise Edition; antes J2EE) —para aplicaciones distribuidas orientadas al entorno empresarial

Java en código abierto

Java se ha convertido en un lenguaje con una implantación masiva en todos los entornos (personales y empresariales). El control que mantiene Sun sobre éste genera reticencias en la comunidad de empresas con fuertes intereses en Java (IBM, Oracle) y obviamente en la comunidad de desarrolladores de software libre.

La evolución basada en un comité en el que participen todos los implicados no es suficiente y la comunidad demandaba desde hace tiempo la liberación de las APIs y bibliotecas básicas de la JDK.

En diciembre de 2006, Sun comenzó relanzamiento de su plataforma Java[3] bajo la licencia GPL de GNU.

Alternativas libres

Existen alternativas para el entorno de ejecución y de desarrollo de Java con una gran cobertura de funcionalidades con respecto a las implementaciones comerciales de Sun, IBM, Bea, etc.

Críticas referentes a Java y el software libre

Notar que este artículo fue escrito antes de la liberación del código fuente de Java. En la actualidad la postura de la Free Software Foundation y de Richard Stallman han cambiado, mostrándose partidarios ambos por su uso en software libre.

Véase también

Referencias

Notas

Enlaces externos

Plantilla:Wikibooks

Sun

Tutoriales

  • Computer-Books.us Colección de libros sobre Java disponibles para descarga gratuita.

Certificaciones

Críticas