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.
Es 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 café 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. A
pesar de todas estas teorías, el nombre fue sacado al parecer de una lista
aleatoria de palabras.3
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, Patrick 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.4
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.
·
una reestructuración intensiva del modelo de eventos AWT (Abstract
Windowing Toolkit)
·
clases internas (inner classes)
·
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
·
la palabra reservada (keyword) strictfp
·
reflexión en la
programación
·
Java IDL, una implementación de IDL (Lenguaje de Descripción
de Interfaz) para la interoperabilidad con CORBA
·
Colecciones (Collections)
·
J2SE 1.3 (8 de mayo de 2000)
— Nombre clave Kestrel. Los cambios más
notables fueron:comunicado de prensa 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)
·
se incluyó el Java Naming and
Directory Interface (JNDI) en el paquete de bibliotecas
principales (anteriormente disponible como una extensión)
·
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 JSR 59.
Los cambios más notables fueron: comunicado de prensalista completa de cambios
·
Encadenación de
excepciones Permite a una excepción encapsular la
excepción de bajo nivel original.
·
Java Web Start incluido (El primer lanzamiento ocurrió en marzo de 2001 para J2SE 1.3)
(Especificado en 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.[2]) Desarrollado bajo JSR 176,
Tiger añadió un número significativo de nuevas características comunicado de prensa
·
Plantillas (genéricos) — provee conversión de tipos (type safety) en tiempo de compilación para colecciones y elimina la necesidad de la
mayoría de conversión 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 Integer). (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 Iterable, como la clase
estándar Collection, 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. Su
lanzamiento fue en julio de 2011.
·
Soporte para XML dentro del propio lenguaje.
·
Un nuevo concepto de superpaquete.
·
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 Días y Fechas, la cual reemplazara las
antiguas clases Date y Calendar.
·
Posibilidad de operar con clases BigDecimal usando operandos.
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.
El lenguaje Java se creó con cinco objetivos
principales:
1. Debería usar el
paradigma 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.
SU FILOSOFIA
El lenguaje Java se creó con cinco objetivos
principales:
1. Debería usar el
paradigma 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.
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.java
import javax.swing.JOptionPane;
public class Hola //Declara una clase llamada Hola, que es
descendiente de la clase Object
{
//Entre llaves se declaran los atributos y métodos de la clase
public static void main(String[] args)
//public: indica que el método
main()es público
//void: indica que la función main()
no devuelve ningún valor
//El método main()debe aceptar
siempre como parámetro un vector de strings
{
JOptionPane.showMessageDialog(null, "Hola Mundo");
//Esta línea indica que se va a
ejecutar el método showMessageDialog(), encargado de mostrar
//en un cuadro de diálogo un valor
(en nuestro caso, un String)
//El primer parámetro no es necesario
y podemos usar el valor nulo
//(el parámetro indica el JFrame
asociado, el contenedor o entorno del diálogo a crear)
}
}
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 objetoout 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).
Las applet Java son programas incrustados en otras
aplicaciones, normalmente una página Web que se muestra en un navegador.
// Hello.java
import javax.swing.JApplet;
import java.awt.Graphics;
public class Hello extends JApplet {
public void paint(Graphics g) {
g.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>
Actualmente HTML 5 ha eliminado el uso
de la etiqueta <applet>. Pero todavía existe la forma de usarlo en HTML5.
(Texto en inglés) Java Applets in
HTML5.
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 interfaz 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étodopaint() 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 [5]
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.IOException;
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étodoservice() 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étodoprintln (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
// 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étodomain(), 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.
ENTORNOSA 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 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.
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 debe
No hay comentarios:
Publicar un comentario