El primer lugar y el más frecuente, donde encontramos al lenguaje Java, es en los exploradores o navegadores de Internet. Veamos cómo llega hasta ahí.
La World Wide Web:
Llamada así por sus siglas WWW, es la aplicación que ha popularizado a Internet, y ha sido la causante de la explosión de la red de redes.
Hablando sencillamente, la WWW basa su existencia en dos aplicaciones: los servidores de Web y los clientes. Los primeros son programas dedicados, instalados en las máquinas nodos de la red, que atienden a todos los pedidos de los clientes. Estos solicitan archivos, recursos de la Web , en general, archivos HTML y gráficos. Los archivos HTML son archivos de texto, que contienen una descripción de lo que vemos como página en nuestro browser. La sigla HTML significa Hypertext Markup Languaje (lenguaje de marcación de hipertexto), y es el lenguaje que describe las páginas Web.
En esas páginas se colocan textos, gráficos y otros recursos. Es trabajo del cliente, nuestro browser, interpretar esa página, mostrarla en pantalla, y reclamar todo lo que se necesite para armarla, como los gráficos y archivos de sonido que la pueden acompañar.
Java en la Web:
Los programas Java son, al fin, otro recurso más, como pueden serlo una página HTML o un archivo gráfico. Al igual que estos últimos viajan desde el servidor a la máquina cliente, y se ejecutan en ésta.
Verá, cuando arme alguna applet, que existe una construcción, la marca HTML <APPLET…>, que especifica un determinado lugar en una página Web, para que el browser posicione y ejecute una aplicación Java. Los archivos Java que viajan son de un tipo: se trata de archivos con extensión .class y contienen las instrucciones Java ya compiladas, no viajan en código fuente. Una applet se compone, como mínimo, de un archivo .class, pero puede requerir más archivos .class (con más código para ejecutar), que el browser recupera, o archivos gráficos, de sonido u otros, que la propia applet se encarga de recuperar.
Máquinas Virtuales:
Se ha mencionado que el lenguaje Java se compila, no pensando en una plataforma o procesador en particular, sino produciendo código (que se denomina bytecodes), destinado a ser interpretado por la llamada máquina virtual Java. Esta máquina no es una única, sino que hay una por cada plataforma y, en realidad, cada browser que implementa Java tiene la suya. Así, el Microsoft Explorer usará su máquina en Windows, mientras que el Netscape Navigator usará la suya, que variará de Windows a UNIX.
Pero todas tienen la misma funcionalidad (o debería esperarse eso). Tanto el usuario como los programadores no deberíamos preocuparnos por las distintas implementaciones. Sin embargo, se escuchan quejas de los desarrolladores, originadas en la pequeñas diferencias que se encuentran tanto entre una implementación y otra, como en el aspecto de la interface gráfica.
Además de la máquina virtual, cada browser instala una serie de clases, ya listas para usar, que Java espera tener disponibles en cualquier plataforma. Esas clases tienen una funcionalidad definida, que no debería sufrir modificaciones.
Netscape y Microsoft:
La empresa Netscape, creadora del Netscape Navigator, soporta Java desde la versión 2 de su browser. Microsoft no se ha quedado atrás y soporta Java desde la versión 2.0 de su browser. Microsoft no se ha quedado atrás (pues no le convenía, dado la mayoría de las páginas contiene – aunque sea – un poquito de Java) y soporta Java desde la versión 3.0 de su Internet Explorer. Ambos browsers instalan y usan su propia máquina virtual Java. No hay diferencias apreciables en las prestaciones de estos dos browsers, respecto de Java.
Hay que hacer algunas aclaraciones: en general, los browsers, de cualquier origen, soportan Java en ambientes que permiten la multitarea y los llamados múltiples hilos de ejecución (multihttrading).
Seguridad:
Debido a la naturaleza de Internet, traer programas desde un lugar lejano y no controlado a nuestra computadora, para ejecutarlo, puede ser riesgoso.
Con respecto a las applets Java debemos quedarnos tranquilos: Sun y los constructores de browsers han implementado una política de seguridad, que impide a una applet, por ejemplo, leer o escribir en nuestro disco, o interferir con otras aplicaciones en ejecución. Es tan grande la seguridad que, como programadores, nos puede llegar a molestar: en una applet nunca podremos grabar un archivo local, con datos transitorios o de configuración.
Nuevos browsers:
Entre Netscape (en múltiples plataformas) y Microsoft (en plataformas Windows) acaparan el mercado de los browsers.
Java sin browsers:
Pero no todo es Internet en Java. Este es un lenguaje de uso general, que sólo incidentalmente cobró popularidad en Internet. Podemos desarrollar aplicaciones Java que se ejecuten en nuestra máquina, sin necesidad de estar conectados a la red, y sin el auxilio de browsers. Mientras los programas Java para Internet y páginas HTML se llaman applets, los que pueden ejecutarse fuera de la red se llaman genéricamente aplicaciones.
Creando el programa:
/*
Primera aplicación Java
Compilar con:
javac HolaMundo.java (y se creará un archivo llamado HolaMundo.class)
Ejecutar con:
java HolaMundo
*/
public class HolaMundo {
public static void main(String[ ] args) {
System.out.print ln("Hola Mundo, mundo");
}
}
Compilando el programa:
javac HolaMundo.java
Ejecutando el programa:
java HolaMundo
Analizando el Código:
Nuestra primera clase:
/* y */: es para hacer comentarios. También se pueden usar dos barras //.
Luego de los comentarios, nos encontramos con la declaración:
public class HolaMundo {
Explicación:
La palabra public es para aclarar que la clase HolaMundo será publica, es decir se podrá
acceder a ella desde otra clase. La palabra class se escribe solamente para darle un nombre
a la clase.
El primer método:
public static void main(String[] args) {
Explicación:
Esto declara nuestra primer rutina. Las funciones y rutinas en Java siempre corresponde a una
clase, y se denominan métodos. El código de arriba define el método main (principal). Al método
anterior se lo declara de tipo void, para indicar que no es una función sino un procedimiento y
se lo define como static (estático). Este calificador indica que no es un método que vaya a
actuar sobre un objeto de la clase HolaMundo, sino que será ejecutado sin necesidad de crear
ningún objeto: es un método de clase (esto queda más claro cuando se estudian clases y objetos
en Java).
El método main recibe un arreglo de Strings como único argumento. Este es un vector de cadenas
de caracteres representa que los parámetros opcionales que le podemos pasar por la línea de
comando. En el ejemplo de arriba no se usaron argumentos.
Escribiendo en pantalla:
Ahora nos encontramos con la sentencia:
System.out.println("Hola, mundo");
< objeto >.<método>(<argumentos>)
Explicación:
Esto mostrará un texto en pantalla (Hola, mundo). El texto System.out hace referencia a un
objeto: el out del paquete System. Este es un objeto que ya está disponible para nuestro uso,
es decir Java nos brinda un serie de clases y objetos ya definidas. Por otro lado la invocación
a un objeto es – como ya se mostró con anterioridad -: <objeto>.<método>(<argumentos>)
Aquí nos encontramos con el método println ("print line"), que toma los parámetros y los imprime
en pantalla.
El método main:
Si volvemos a las instrucciones de ejecución de u programa, vemos que escribimos:
Java HolaMundo
El intérprete busca el archivo HolaMundo.class y comienza a ejecutarlo.
Por convención, cuando al interprete le indicamos una clase a ejecutar, ejecuta un método en particular: el método main. Este es el método que lanza todo el programa. Por eso tuvimos que definirlo. Lo declaramos público justamente para que pueda ser invocado por el intérprete. Lo declaramos estático, porque es invocado directamente, no desde un objeto (como el printl, que es invocado para el objeto System.out). Cuando se arma una applet (programa java a incluir en una página HTML) se puede observar que la forma de lanzar el programa es totalmente distinta. Esta es una de las muchas diferencias entre los aplicaciones Java y applets.
Otra aplicación:
Este programa es sólo un poco más complejo: imprime los factoriales de los primeros diez números naturales.
Factoriales.java
//
// Imprime Factoriales
//
public class Factoriales {
(/** Calculo de Factorial */ static long factorial(int v) {)
if (v>1)
return(v*factorial(v-1));
return(1);
}
public static void main(String[] args) {
int k;
for (k=1;k<=10;k++)
System.out.println(factorial(k));
}
}
Lo compilas: javac Factoriales.java
Lo ejecutas: java Factoriales
Resultado del Programa:
1
2
6
24
120
720
5040
40320
362880
3628800
Analizando el Código:
Explicación:
La novedad en esta aplicación es la definición de un método estático (no necesita de un objeto Factoriales), denominado factorial, que es una función, que devuelve un valor long (entero largo), y recibe como parámetro un valor int (entero). Este método calcula el factorial de un número natural n como n!, siendo:
n!= n * (n-1) * (n-2) * …
Así el factorial de 4 es:
4! = 4*3*2*1 = 24
En este código se puede ver el uso de la estructura if en:
if (v>1)
return(v*factorial(v-1));
que examina si v es mayor que 1. Si es así, devuelve como valor de la función el resultado de multiplicar v por el factorial de v-1.
En el cuerpo del método main tenemos a declaración de una variable:
int k;
Esta sentencia declara una variable k, que será de tipo int (entero), y que es local al método donde está definida.
Tal vez la parte más compleja es la sentencia for:
for (k=1;k<=10;k++)
System.out.println(factorial(k));
Que hace recorrer a la variable k por los valores desde 1 a 10, y envía a imprimir en pantalla el resultado de invocar factorial(k).
Applet Hola, Mundo
HolaMundo.java
//
// Applet: Hola mundo!
// Ejecutar con:
// appletviewer HolaMundo.html
//
import java.applet.*;
import java.awt.Graphics;
public class HolaMundo extends Applet {
public void paint(Graphics g) {
g.drawString("Hola mundo!",20,20);
}
}
Hay que compilarla:
Javac HolaMundo.java (lo que es = a HolaMundo.class)
Hay que ejecutarla:
*Crear un archivo HolaMundo.html (con el código correspondiente, lo que se verá más adelante)
*La ejecutas con: appletviewer HolaMundo.html
Necesitamos de tres ficheros: HolaMundo.java, HolaMundo.class y HolaMundo.html
Ejecutando una applet:
Una applet Java no existe por sí misma (sino dentro de una página .html), por eso debemos invocarla desde una página html que hemos creado. Veamos el siguiente ejemplo (supuestamente hemos creado una página que se llama HolaMundo.html):
<applet
code=HolaMundo.class
width=330
height=170
>
</applet>
Dentro del JDK se encuentra un utilitario que permite ejecutar una applet que se encuentra en una pag. html. Se llama appletveiwer, y en este caso se ejecuta así:
Appletviewer HolaMundo.html
Como parámetro no se le pasa el archivo HolaMundo.java sino que la página HolaMundo.html.
Análisis del Código:
Importando paquetes:
Aparecen las líneas :
import java.applet.*;
import java.awt.Graphics;
Explicación:
La palabra import indica que son declaraciones que le avisan al compilador que este programa, usará: En el caso de java.applet.* todas las clases que pertenecen al paquete (packages) applet (por eso el applet.* – el que produce que se usen todas las clases es el "*"). En el caso de java.awt.Graphics indica que se usará el objeto Graphics del paquete awt.
La línea java.applet.* no posee tanta explicación, pero (aproximadamente) no ocurre lo mismo con la línea java.awt.Graphics, veamos:
La declaración:
import java.awt.Graphics;
afirma que vamos a usar la clase Graphics de las definidas en el paquete java.awt. Este es otro paquete, muy importante, disponible en todas las plataformas Java: es el AWT (Abstract Windows Toolkit), este es el paquete que maneja ventanas e interfaces gráficas, independientes (abstractas) del entorno operativo.
Es un paquete que permite, por ejemplo, definir botones y cajas de texto, portables a Windows, OS/2, Xwindows, o cualquier otro entorno gráfico, siempre usando el mismo código fuente. Si no incluyéramos estas de paquetes, el compilador no sabría resolver nuestras referencias a clases de esos paquetes, como la clase Applet, y la clase Graphics.
Estas clases que usamos son aquellas que nos brinda, de forma predeterminada, Java.
Una clase Applet:
Con el código:
public class HolaMundo extends Applet {
definimos una clase pública (public) de nombre HolaMundo (igual que el nombre del archivo .java)
Pero hay una novedad: extends Applet (herencia). Estas dos palabras declaran que la clase HolaMundo, no es una clase cualquiera, sino una derivada, que extiende de una clase ya definida por Java, la clase Applet (definida en el paquete java.applet). Se dice que la clase HolaMundo hereda todas las propiedades (atributos y métodos) de la clase Applet. Esto es una ventaja que nos brinda la programación orientada/basada a/en objetos: se puede definir nuevas clases basadas en otras ya construidas, por nosotros o por otros (la ayuda mutua es buena). En este caso, la clase Applet es una clase brindada por el entorno Java.
El método paint:
Este es el único método (paint) que definimos para nuestra clase HolaMundo. Este es nuestro primer método no estático: no se aplica a la clase, porque se ejecuta sobre un objeto. El cual lo creará el browser (navegador), en el momento de invocar la clase HolaMundo y así quedaría un objeto – llamémoslo de forma imaginaria – "X". Es decir, el navegador que usemos cargará la clase (Applet) y creará un objeto a partir de esta. Para que el browser controle nuestro objeto usará los métodos de la clase Applet (los puede usar porque los había heredado con anterioridad, por la línea: "public class HolaMundo extends Applet { ").
Justamente, uno de los métodos que usa el navegador es el método paint. El objetivo que tiene este es dibujar el contenido de la applet, una región rectangular que ocupa en la página HTML. El método paint es llamado por el browser, después de que se haya creado el objeto, para mostrar/dibujar su contenido en la página. Y lo llamará de nuevo cada vez que necesita redibujar el rectángulo correspondiente a la applet. Esto puede ocurrir, por ejemplo, si minimizamos, maximizamos, movemos o cambiamos de tamaño a la ventana del browser. Algo que cave aclarar es que, el objeto que crea el browser, invoca otros métodos (además de paint). Pero no necesitamos declararlos porque los hereda de la clase applet (ventaja de la programación orientada a objetos). Algunos métodos que tiene esta clase son :start, run, stop, etc.
Objeto Graphics:
Código:
public void paint(Graphics g) {
Explicación:
El método paint recibe el parámetro g, un objeto de la clase Graphics (g es un objeto de la clase Graphics porque esta necesita "un lugar, g, en donde caer" y, una vez en este comenzar a llevar a cabo su función), la clase Graphics está definida en el paquete java.awt. Ese objeto (g) tendrá la información sobre el dispositivo que se va a dibujar, como cantidad de colores, tamaño, partes disponibles y partes ocultas, entre otros. Así como antes utilizó el objeto System.out para escribir en pantalla, ahora deberemos usar el objeto de la clase Graphics entregado al método paint, para dibujar (escribir) en la zona de la applet.
Usamos el objeto g en la sentencia:
g.drawString("Hola mundo!",20,20);
que invoca al método drawString del objeto g. Este método recibe tres parámetros;
*Primero: es qué texto se mostrará en pantalla.
g.drawString("Hola mundo!",20,20);
*Segundo: es la coordenada x, determina que se escribirá a 20 pixeles, a la derecha del margen izquierdo.
g.drawString("Hola mundo!",20,20);
*Tercero: es la coordenada y, determina que se escribirá a 20 pixeles, abajo del borde superior de la zona asignada a la applet (es como las coordenadas cartesianas).
g.drawString("Hola mundo!",20,20);
La marca <applet>:
En el fichero HTML se tubo que incluir un elemento <applet>. En ese elemento (directiva) se pusieron varios argumentos:
class=HolaMundo.class : este argumento lo usamos para indicarle a la página qué clase tendrá que invocar, en este es HolaMundo.class
width=330 : indica a la applet el ancho (en pixeles) que tendrá disponible para operar y dibujar. En este caso 330 pixeles.
height=170 : indica a la applet el alto (también en pixeles) que tendrá disponible para operar y dibujar. En este caso 170 pixeles.
La directiva applet es la que da lugar a los argumentos, su directiva de cierre es </applet>.
Applet en el browser:
En esta applet se usó el utilitario appletviewer del JDK, para verla funcionando. Pero se puede ver el archivo .html desde nuestro navegador de Internet. Si se dispone de un browser instalado se puede invocar la applet con el siguiente comando: start HolaMundo.html y se nos abrirá nuestro navegador mostrando la applet.
Otra forma es abrirla directamente del menú archivo => abrir. Luego verá los resultados.
Espiando los paint:
A continuación analizaremos otra applet, que sigue mostrando un texto en pantalla, pero que varia cada vez que se invoca el método paint.
Cuenta.java
//
// Applet: Cuenta
// Ejecutar con:
// appletviewer Cuenta.html
//
import java.applet.*;
import java.awt.Graphics;
public class Cuenta extends Applet {
int veces=0; // Contador de eventos paint
public void paint(Graphics g) {
veces=veces+1;
g.drawString("Este es el paint nro. "+veces,20,60);
}
}
Cuenta.html
<applet
code=Cuenta.class
width=330
height=170
>
</applet>
Compilamos con: javac Cuenta.java = Cuenta.class
Invocamos con: appletviewer Cuenta.html
O con: start Cuenta.html (se ejecuta desde el navegador)
Estudiando la applet Cuenta:
Esta applet es muy similar a la applet HolaMundo, pero con una pequeña vuelta de tuerca.
Código:
int veces=0;
Se declara una variable (veces) con el valor 0.
public void paint(Graphics g) {
veces=veces+1;
Cada vez que se ejecuta la línea: public void paint(Graphics g) { se le asigna (por el signo =) a la variable veces su valor actual (veces) más 1.
g.drawString("Este es el paint nro. "+veces,20,60);
es la concatenación (unión) de un texto ("Este es el paint nro.") y la variable entera (int) veces. La cual se incrementa cada vez que se ejecuta el método paint (por la línea: public void paint(Graphics g) {).
La variable veces se declara (int veces=0) y se inicializa a 0 (int veces=0). Luego, cada vez que se ejecuta el método paint, se incrementa, y se muestra en la zona de la applet. Si minimizamos la ventana de la applet, o la tapamos parcial o totalmente con otra ventana, o en algunos casos de cambio de tamaño, veremos que el texto va cambiando. Es una forma de ir investigando el comportamiento de la applet, y la frecuencia de la invocación de paint.
Más sobre las applets:
Más adelante investigaremos cómo colocar elementos en una applet, como cajas de texto editables, listas y botones, entre otros. También aprenderemos a dibujar, , y a colocar imágenes. Hasta podremos animar las imágenes. Pero antes, se debe se debe aprender lo básico, y estudiar el lenguaje Java, para luego lanzarse a esos otros terrenos.
Simplicidad:
Ya se ha mencionado que el equipo original que desarrolló Java lo hizo por necesidad, al no cumplir los lenguaje existentes con todo lo que necesitaban para el proyecto en marcha. Pero, como buenos diseñadores, no inventaron todo de nuevo, sino que se basaron en lo ya hecho y probado. Es por esa razón que el código Java se expresa en archivos de texto comunes, y tiene una apariencia muy familiar para los programadores de C/C++ y para los programadores en general. Los fragmentos del lenguaje que se han visto, lo ejemplifican.
Orientación a objetos:
A primera vista parece que todos los productos nuevos de software tienen algo "orientado a objetos". En el caso de Java, la aplicación de esa calificación es totalmente acertada. De hecho, en Java, todo es un objeto. Se verá que éstos se definen en clases, con atributos y métodos, agrupándose en paquetes, y exponiendo interfaces, permitiendo herencia y polimorfismo, implementando así la tecnología de objetos de una manera muy completa, y a la vez sencilla y agradable. Reconoceremos al estudiar se semántica, que Java es realmente un lenguaje que merece ser llamado "totalmente orientado a objetos".
Soporte de múltiples plataformas:
El proceso de compilación no produce código para un procesador en particular, como en los compiladores C/C++, sino que genera código para un procesador ideal, denominado máquina virtual Java (Java Virtual Machine, o Java VM). La razón de esta conducta es simple: la necesidad de poder ejecutarse en cualquier plataforma, sin necesidad de cambiar el código fuente, ni aun de recompilar. Todo programa Java se traduce en una serie de códigos (llamados bytecodes) para un procesador imaginario, al Java VM, que puede ser implementado fácilmente en cualquier plataforma poderosa. Es así como el lenguaje y sus aplicaciones se independizan de ña máquina destino, a costa de algo de velocidad, provocada por la necesidad de "simular" la Java VM, mediante software.
Veremos que aun los tipos primitivos de datos quedan definidos de un solo golpe, para todas las plataformas. Nos evitamos así las pesadillas de portabilidad, conocidas por los programadores de C/C++, al cambiar, por ejemplo, de ambiente a ambiente, el tamaño de los enteros, o el conjunto de caracteres soportados. En Java, esos problemas no existen: sólo existe una máquina virtual.
Manejo automático de memoria:
Ya se ha mencionado, que el lenguaje Java se compone de objetos. Lo que no se ha descripto, es que esos objetos pueden y deben crearse, y tienen una vida que dura hasta su destrucción. Mientras que la creación de los objetos se deja bajo la voluntad del programador, la destrucción definitiva de un objeto ocurre cuando no es más referenciado por otros objetos del programa. De esta forma, se elimina una de las causas más comunes de error en otros lenguajes, como la destrucción por el programador de objetos aun en uso en el programa, o la falta de destrucción de objetos que ya son inútiles, pues no se usan en el resto de la ejecución, pero que molestan con empleo de recursos. Esta técnica de manejo automático. Esta técnica de manejo automático de memoria ocupada por los objetos se denominan garbage collection, algo así como recolección de basura. En una aplicación Java hay siempre un proceso, ejecutado como un hilo de ejecución separado, que se ocupa de recorrer la memoria donde se encuentran los objetos, y determinan cuáles son pueden liberarse y destruirse. Bye (adiós) punteros y problemas de memoria.
Seguridad:
Todo el que ha trabajado en una computadora personal, se ha topado de una u otra forma con los problemas de virus, o de confidencialidad de los datos. Al parecer Internet, y distribuirse programas por toda las red, el problema de la seguridad ha tomado una nueva dimensión, más grave, ya que actualmente a nuestra máquina pueden llegar aplicaciones hostiles y virus malignos, desde cualquier punto del planeta. Java ha sido adaptado a Internet, pensando mucho en el tema seguridad. Una "applet" java se ejecuta en un entorno, que impide su intromisión en la máquina cliente. No hay, entonces, posibilidad de un virus Java, viajando por toda la red.
Java no se aísla y evoluciona:
Como Java trata de ser un lenguaje de producción, no un lenguaje académico o ideal, o tiene "miedo" de comunicarse con librerías de otros lenguajes. Tiene capacidades definidas para implementar clases y métodos (o funciones), escritos, por ejemplo, en C/C++. Esto nos permite usar lo que ya está hecho, en cada plataforma de implementación. Igualmente, recordemos que Java es un lenguaje de uso general, y muchas de las rutinas y librerías que necesitaremos para un proyecto, pueden ser escritas en Java. Debido al éxito del lenguaje, y a su difusión, cada día aparecen nuevas herramientas y paquetes de clases escritas por otros programadores, listas para ser usadas en nuestro próximo sistema.
Programando para el mundo:
Cuando Ud. Comience a programar en Java, y en especial para la Web, experimentará una sensación, que hasta la llegada de Java, era difícil de encontrar: el hecho de generar aplicaciones que pueden ser ejecutadas por millones de personas, en ambientes disímiles. Sus programas podrán viajar por la red de redes, y ser fruto de satisfacción y diversión. Es un nuevo universo de programación, que apenas comenzamos a explorar.
Bibliografía: "La interpretación de mi aprendizaje (yo he estudiado el lenguaje Java, y, en base a lo entendido/aprendido escribí lo que ha visto y ha leído)"
Autor:
Jairo
Bien, que tenga mucha suerte con el aprendizaje del lenguaje y "Hasta La Próxima (pienso escribir algo más de Java, dado que esto no puede quedar aquí)"….