Home Map Index Search News Archives Links About LF
[Top Bar]
[Bottom Bar]
[Photo of the Author]
Jose M. Fernández

Contenidos:
Introducción
Origen
Obtención e Instalación de Java
Entorno de desarrollo
Características
Comenzar a programar en JAVA
Resumen

Java. Parte I

[Ilustration]

Resumen: Este es el primer artículo en una serie sobre programación con Java. La primera parte está dedicada a describir Java como lenguaje, sus características generales y la localización de las fuentes más importantes de información.




Introducción

Iniciamos aquí una serie de artículos en los cuales describiremos el entorno y el lenguaje de programación Java. Como primer propósito intentare alejarme de los tópicos relacionados con este lenguaje no contare nada sobre la historia del lenguaje, sobre microondas, lavadoras, robles (sí alguien le interesa podrá leerlo en multitud de publicaciones, hasta en revistas del corazón). Tampoco mostraré a Duke (mascota de Java) que es un muñequito narigón en forma de triángulo con unas enormes manazas que apenas te descuides te saluda a ritmo de un soniquete que recuerda a viejas películas americanas de ciencia-ficción.

Hay una cosa en todo esto que es cierta "Java esta de moda", no hay revista que se precie que no hable sobre esto, ni empresa de software que no presente algún producto para desarrollar applets de Java, ni página web que no contenga varias de ella.

Intentaré con esta serie de artículos profundizar y en lo posible aprender (todos juntos) este lenguaje de programación que es simple en lo básico pero con una alta complejidad y difícil de dominar y además está constantemente evolucionando.

Los primeros artículos irán encaminados ha realizar una descripción del lenguaje en general para posteriormente ir analizando en profundidad temas particulares como los applets, trabajos para red, JDBC, beans, etc.

Haré hincapié en que Java es un lenguaje de propósito general, y no solo para realizar applets para pagina Web, aunque ésta es por lo que es conocido no nos podemos quedar en este aspecto ya que proporciona una serie de alternativas que pueden ser más interesantes aun que la propia realización de applets para la red.

Este primer artículo es un poco más descriptivo que practico, en el cual veremos fundamentalmente las características del lenguaje, entorno de desarrollo y solo al final veremos algún ejemplo de un programa Java.

Origen

Java fue concebido por James Gosling, Patrick Naughton, Chis Warth, Ed Frank y Mike Sherindan en Sun Microsystem Inc. en 1.991, en su primera versión que duro unos 18 meses. Entre 1.992 y 1.995 colaboraron en la madurez del prototipo inicial Bill Joy, Arthur Van Hoff, Jonathan Payne, Frank Yellia, Tim Lindolm.

Como podemos observar por las fechas, Java es anterior o al menos simultaneo a la WWW (hasta el año 1.991 Tim Berners Lee no desarrolló el lenguaje HTML).

A Java lo podemos considerar como un lenguaje de propósito general aunque su verdadero auge ha sido originado por su utilización en paginas Web.

La sintaxis de Java es similar a la de C y las características de orientación a objetos de C++. Java en un lenguaje de programación coherente y lógicamente consistente.

Debido a las similitudes con C y C++ se podría pensar que Java es una versión para Internet de C++, pero tiene importantes diferencias teóricas y practicas. Especialmente Java mejora y refina el paradigma de orientación a objetos de C++.

Internet a ayudado a Java a ser un lenguaje universalmente conocido y por su lado Java a tenido un profundo efecto sobre Internet ya que amplia el universo de objetos que pueden moverse libremente por el ciberespacio (programas dinámicos auto-ejecutables).

Obtención e Instalación de Java

Para poder programar en Java necesitaremos varias herramientas, siempre nos estamos refiriendo al entorne GNU/LINUX (por si alguien se despista):

La implementación actual para Linux basado en ELF requiere un núcleo 1.2.13 o posterior.

Utilizaremos un entorno llamado JDK (Java Development Kit).

Netscape versión 2.0.14 o posterior.

Un editor de texto como Xemacs (trabajaremos siempre bajo Xwindows, aunque no sea necesario en algunos casos, aunque sí para los Applets y programas con interfaces gráficos).

Para bajarse el JDK se puede obtener entre otros a partir del nodo: http://www.blackdown.org/java-linux.html desde aquí elegiremos alguna réplica (mirror), para poder realizar la descarga más rápidamente. Hace algunos meses la última versión era la JDK-1.1.3 (con la que realizaré los ejemplos), pero en mi última visita vi la versión 1.1.9, pero "atención" si nos lo bajamos todo son alrededor de 24 Mb., aunque lo estrictamente necesario es aproximadamente 12 Mb (paciencia).

Una vez descomprimido con gunzip y tar no hay ningún problema para empezar a trabajar.

Lo normal será instalarlo en el directorio /usr/local con lo que se nos creará el directorio /JDK1.1.3 y dentro de este a su vez nos encontraremos con varios directorios:

/doc: Documentación oficial en formato HTML

/demo: Programas de demostración Java

/lib: Librerías

/bin: Se encuentran las herramientas propias del JDK.

Dentro del directorio /lib encontraremos el fichero "classes.zip" (no descomprimir este fichero), que contiene todas las clases compiladas que se pueden utilizar por el JDK.

Dentro del directorio raíz encontramos el fichero "src.zip", este contiene todos los ficheros fuentes incluidos en classes.zip. No se pueden compilar y es suministrado por motivos de información.

Entorno de desarrollo

como hemos dicho anteriormente están incluidas en el directorio /bin:

javac: compilador de java, compila programas fuentes en lenguaje java a bytecodes.

Java: interprete java. Ejecuta bytecodes Java.

jre : similar al interprete java (java), pero pensado para usuarios finales los cuales no requieren todas las opciones disponibles.

appletviewer: testea y ejecuta applets.

jdb: depurador.

javap: desensamblador de ficheros compilados en Java.

javadoc: generador de documentación, produce un conjunto de paginas HTML describiendo las clases publicas y protegidas, interfaces, constructores, métodos y campos. También produce una jerarquía de clases y un índice de todos sus miembros.

javah: para añadir métodos nativos (en lenguaje C) a programas Java.

jar: archiva clases y fuentes java en un archivo Jar.

javakey: mantenimiento de firmas digitales.

updateAWT: actualiza los nombres que han cambiado en los métodos de AWT1.02 en una aplicación.

Para poder trabajar sin problemas de directorios, añadiremos el directorio /usr/local/JDK1.1.3/bin a la variable de entorno PATH del usuario que queramos. Si deseamos que este fijada para todos los usuarios, incorporar el directorio a la variable PATH que se fija en el fichero /etc/profile.

Características

Antes de seguir, habría que preguntarse ¿qué es Java?, y como respuesta podemos tener (como en el manual del JDK indica) que son dos cosas, por un lado un lenguaje de programación y por otro una plataforma.

Como lenguaje de programación Java es un lenguaje de alto nivel con las siguientes características (más adelante las veremos en detalle):

  • Es simple
  • Orientado a objeto
  • Distribuido
  • Interpretado
  • Robusto
  • Seguro
  • Arquitectura neutral
  • Portable
  • Multihilo
  • Dinámico
  • Alta resolución

Lo primero que salta a la vista es que Java es interpretado, aunque requiere una compilación previa, generando un código objeto en bytecodes, que es de muy bajo nivel, este código puede ser interpretado en distintas plataformas.

Los bytecodes Java posibilita "escribe una vez, ejecuta siempre". Podemos compilar programas en una plataforma con un compilador Java y los bytecodes generados pueden ser ejecutados en cualquier arquitectura que posea una implementación de la maquina virtual java (JVM). Por ejemplo un programa Java puede ser compilado en una plataforma con Windows NT y ejecutarse sin ningún problema (por lo menos así lo dice la teoría) en un Sun Ultra Solaris.

Una plataforma podría ser el ambiente hardware o software en el cual un programa es ejecutado. La plataforma Java difiere de otras plataformas en que esta es solo software y se ejecuta sobre otra plataforma hardware.

La plataforma Java tiene dos componentes:

  • La maquina virtual Java (JVM)
  • Interfaces de programación de aplicaciones (API)

JVM es un ordenador abstracto en el cual se pueden ejecutar programas Java compilados. Fue diseñada para ser sencilla y pequeña porque se pretendía que estuviese presente en todos los sitios donde fuese posible. Esta simplicidad ha hecho que rápidamente se extendiera a todas las arquitecturas existentes, logrando una capa software común a todas ellas, por lo que en redes de ordenadores heterogéneos (como lo es Internet) la potabilidad se logra gracias a Java. Como podemos imaginar esta es posiblemente una de las razones del auge imparable de esta tecnología. La maquina virtual no la debemos entender como una capa software sobre un procesador sino como su nombre indica pretender se un ordenador y poco a poco van apareciendo Chips Java que darán apoyo a maquinas reales Java, tarjetas de crédito, decodificadores de TV digital, etc.

Las API es una gran colección de componentes software que proveen al lenguaje de muchas utilidades, tales como interfaces gráficas del usuario (GUI). Están agrupadas en librerías (en terminología Java paquetes). Gracias a estos paquetes podemos escribir en Java muchos tipos de programas distintos, además de las conocidas Applets para Web, podemos diseñar, por ejemplo servidores Web, proxis, servidores de correos, servidores Irc, y prácticamente lo que podamos imaginar tanto en relación con Iternet como no.

Las APIs agrupadas en paquetes las podemos clasificar como:

  • Básicas : objetos, matrices, números, entradas y salidas, estructura de datos, propiedades del sistema, fecha, tiempo, etc.
  • Applets : conjunto de funciones y utilidades usadas par la realización de applets Java.
  • Trabajo en Red: URLs, TCP, UDP, sockets, direccionamiento IP.
  • Internacionalización: ayuda para escribir programas que pueden se adaptados automáticamente a las características locales y pueden ser visualizadas en la lengua propia.
  • Seguridad: de bajo y alto nivel, incluyendo firma digital, claves publicas y privadas, control de acceso y certificados.
  • Componentes software: conocidos como JavaBeans.
  • Bases de datos: proporciona un acceso uniforme a un gran número de bases de datos relacionales.

Además de este núcleo básico de API, podemos disponer de extensiones para 3D, telefonía, animación, etc.

Como vimos al principio de este apartado, Java tenia una serie de características que veremos en detalle:

Es simple:

En Java hay un número reducido de formas claras para abordar una tarea dada. Ofrece toda la funcionalidad de un lenguaje potente pero sin las características menos usadas y más confusas de estas. Hereda la sintaxis de C/C++ y muchas de las características orientadas a objetos de C++. Todos los programadores que conozcan C/C++ no tendrán ningún problema para aprender Java. Elimina algunas características de estos lenguajes, entre los que destacan:

  • Aritmética de punteros
  • Registros (struct)
  • Definición de tipos (typedef)
  • Macros (#define)
  • Necesidad de liberar memoria (free)
  • No hay herencia múltiple
  • No hay sobrecarga de operadores
  • No hay estructura un uniones
Es orientado
a objetos:
Java es un lenguaje diseñado partiendo de cero, como resultado de esto se realiza una aproximación limpia, útil y pragmática a los objetos. El modelo de objeto de Java es simple y fácil de ampliar.
Es distribuido: Java fue diseñado con extensas capacidades de interconexión TCP/IP. De hecho permite a los programadores acceder a la información a través de la red con tanta facilidad como a los ficheros locales.
Es robusto: Java es fuertemente tipado, por lo que permite comprobar el código en tiempo de compilación. Además también comprueba el código en tiempo de ejecución. La liberación de memoria se realiza de forma automática, ya que se proporciona un recolector de basura automático para los objetos que no se utilizan. Java asimismo proporciona una gestión de excepciones orientada a objetos. Un programa escrito correctamente todos los errores de ejecución pueden y deben ser gestionados por el programa.
Es de
arquitectura
neutral:
El principal objetivo de los diseñadores de Java era "escribir una vez, ejecuta en cualquier sitio, en cualquier momento y para siempre". El código Java se compila a un código de bytes de alto nivel independiente de la maquina. Este código esta diseñado para ejecutarse en cualquier máquina con un sistema run-time (interprete) el cual si es dependiente de esta.
Es seguro:

Las necesidades de la informática distribuida exigen los mayores niveles de seguridad para los sistemas operativos clientes. Java proporciona seguridad a través de varias características de su entorno en tiempo de ejecución:

  • Un verificador de bytecodes
  • La disposición de memoria en tiempo de ejecución
  • Restricciones de acceso a los archivos.

Aunque el compilador solo genere código correcto el interprete lo vuelve a verificar para asegurarse que el código no ha sido cambiado (intencionadamente o no) entre el momento de la compilación y la ejecución. Además el interprete Java determina la disposición de la memoria para las clases. Se puede considerar a Java uno de las aplicaciones más seguras para cualquier sistema.

Es portable: Además de la portabilidad básica para ser de arquitectura neutral Java también implementa unos estándares de portabilidad, los enteros son siempre enteros, el sistema de interfaces de usuario lo constituye un sistema abstracto de ventanas, por lo que es independiente de la arquitectura en la que se implemente (UNIX, PC, Mac).
Es interpretado: Para poder conseguir uno de los objetivos básicos de Java, que es la independencia de plataforma, el compilador de Java genera un código intermedio (bytecodes). Este código puede ser ejecutado en cualquier sistema que posea un interprete. Esta característica puede llevarnos a pensar en los posibles problemas de rendimiento. Aunque por este mismo motivo los desarrolladores del lenguaje diseñaron con mucho cuidado el código intermedio de manera que fuese sencillo traducirlo directamente a código máquina nativo para conseguir un rendimiento alto.
Es multihilo: En Java se puede escribir programas que hagan varias cosas a la vez y de una forma fácil y robusta.
Es dinámico : Java no intenta enlazar todos los módulos que componen una aplicación hasta el tiempo de ejecución. Esto permite enlazar dinámicamente el código de una forma segura y conveniente.

Después de esta parrafada (no es más que lo oficial de Java) habrá que (otra vez) preguntarse por Java en el mundo GNU/Linux. Anteriormente hablamos de un JDK para Linux, esto no es más que una implementación comercial de la original desarrollada por Sun Microsystem (aunque de libre disposición).

Existen herramientas como el compilador GUAVAC (http://HTTP.CS.Berkeley.EDU/~engberg/guavac) bajo licencia GPL, con el que se puede compilar cualquier fuente Java sin ningún tipo de problemas. Destacaremos asimismo una maquina virtual llamada KAFFE (http://www.kaffe.org) , bajo licencia Berkeley. Estos dos proyectos están bastante avanzados aunque todavía necesitan las librerías de clases de Java de Sun (de libre disposición de momento) para tener un sistema de desarrollo completo.

Existen también proyectos en fases iniciales para crear entornos de desarrollo rápidos y visuales de aplicaciones Java.

Hay un gran movimiento en la red alrededor de la tecnología Java y GNU, con el objetivo de desarrollar herramientas completas, de libre distribución e independientes de Sun. Con lo que podemos hacernos una idea de la importancia de Java, y cuando la moda pase seguro que algo quedará (bastante diría yo).

Comenzar a programar en JAVA

Una vez vistos todas las características generales de lenguaje, veremos un programa real. Como dije en la introducción de este articulo quisiera apartarme lo más posibles de tópicos, es decir no haremos el primer programa saludando al mundo, en lugar de esto veremos en nuestra pantalla un cuadro de las dimensiones que queramos (un poco más complicado pero sin pasarse):

Fichero Cuadro.Java
class Cuadro {
  public static void main (String args[]) {
    int l ,a;
    if (args.length == 2) {
      l = Integer.valueOf(args[0]).intValue();
      a = Integer.valueOf(args[1]).intValue();
    }
    else {
      l= 20;
      a= 15;
    }
    for (int i=l; i>0; i--){
      System.out.print("*");
    }
    System.out.print("\n");
    for (int i= a-2; i>0; i--){
      System.out.print("*");
      for(int j=l-2; j>0; j--) {
        System.out.print(" ");
      }
      System.out.print("*\n");
    }
    for (int i=l; i>0; i--){
      System.out.print("*");
    }
    System.out.print("\n");
  }
}

La primera cosa a tener en cuenta es que el nombre que le damos al archivo fuente es muy importante, ya que este se define como una "unidad de compilación". Puede ser un archivo que contiene una o más definiciones de clase. El compilador espera que estos archivos tengan la extensión ".Java" (4 caracteres) por lo que algunos sistemas como DOS o Windows 3.1 no lo soportan.

Como vemos en el ejemplo el nombre de la clase definida también coincide con el nombre del archivo fuente y no es por casualidad, en Java, todo el código tiene que estar dentro de una clase. Por convenio, el nombre de la clase tiene que coincidir con el nombre del archivo que contiene el programa. Además Java es sensible al contesto (diferencia las mayúsculas de las minúsculas).

Para compilar el ejemplo, desde la línea de comando escribiremos:

> javac cuadro.java

El compilador Java (si todo ha ido bien) creará un archivo cuadro.class que contiene, naturalmente, el código binario (bytecode) y este podrá ser ejecutado por el interprete:

> java cuadro

Cuando compilamos código fuente de Java, cada clase individualmente es colocada en un archivo que tiene el mismo nombre que la clase. Esta es la razón por lo cual es buena practica llamar a los archivos fuentes de la misma forma que a la clase que contiene ya que así el nombre del archivo fuente coincidirá con el nombre del archivo.class.

Aunque nuestro ejemplo cuadro.java es bastante simple nos ayudará a comprender los elementos fundamentales de un programa Java y sobre todo la estructura de un programa.

Lo primero a tener en cuenta es que este ejemplo no es un applet para incluir en una pagina HTML sino un programa independiente que se ejecuta con el interprete desde la línea de comandos.

La primera línea del programa es:

class cuadro {

En esta línea se emplea la palabra reservada class para declarar que se va a definir una nueva clase, "cuadro" es el identificador del nombre de la clase. La definición de la clase completa incluyendo todos sus miembros están entre dos llaves ({}), las más generales. Notar que en Java toda la actividad de un programa ocurre dentro de la clase.

En la siguiente línea:

public static void main (String args[]) {

Lo primero que podemos destacar es el método main(). Todas las aplicaciones Java comienzan su ejecución llamado a este método (como en C/C++). A continuación comentaremos algunos conceptos que posteriormente (en otros artículos) detallaremos aunque lo haremos de pasada solo para comprender el ejemplo.

La palabra clave public permite controlar la visibilidad de las clases miembro. Cuando una clase se declara como public, ésta puede ser utilizada por código definido fuera de su clase. static permite que el método main() sea llamado sin necesidad de instanciar la clase. void indica que no devuelve ningún valor. Para enviar información a un método se realiza por variables especificadas entre los paréntesis que siguen al nombre del método, en nuestro caso declaramos un parámetro llamado arg que es una matriz de instancias de la clase String.

Naturalmente todo el código del método esta también entre llaves. En la línea:

 int l, a ;

como todo programa que se precie declaramos dos variables de tipo entero. En Java cada variable hay que declararla previamente. Como podemos observar cada instrucción se termina en ";" .

El resto de las líneas articulan un pequeño algoritmo en el cual:

  1. Comprobamos si se han proporcionado parámetros o no
    If (args.length==2)
    
  2. Si hay parámetros, se asignaran estos a las variables a y l :
      l = Integer.valueOf(args[0]).intValue();
      a = Integer.valueOf(args[1]).intValue();
    
  3. En caso contrario se iniciaran las variables con dos valores por defectos:
      l = 20;
      a = 15;
    
  4. El resto del programa no es más que las instrucciones necesarias para pintar por pantalla el cuadro. Podemos destacar:
    System.out.print()
    

    donde print() imprime la cadena que se pasa como parámetro. System es una clase predefinida que permite el acceso al sistema y out es el flujo de salida que esta conectado a la consola. Y también,

    for (int i=l; i>0; i--)
    

    Como podemos imaginar se comporta como esperamos de él, tiene mucha similitud (es igual) que en C/C++ y otros muchos lenguaje.

Una practica que podíamos hacer con este pequeño ejemplo, aparte de compilarlo y ejecutarlo, es comprobar que es de arquitectura neutral ya que si el programa compilado cuadro.class lo ejecutamos bajo Windows 95 (sin que sirva de precedente) comprobaremos que se comporta de la misma forma que bajo Linux.

Resumen

Hemos relatado los aspectos generales del lenguaje de programación Java. No hemos hecho nada más que empezar y nos queda un largo camino de dos artículos más para realizar una descripción completa (y no muy amplia) de este lenguaje. El siguiente articulo veremos entre otros: la definición y tipos de variables, instrucciones básicas, clases, etc. En fin la mayor parte de las especificaciones del lenguaje.

Daré en cada artículo las referencias, publicaciones y direcciones en las que he basado en mucho o en poco esta serie de artículos.

Referencias


Texto original en Castellano


Páginas web mantenidas por Miguel Ángel Sepúlveda
© Jose M. Fernandez 1998
LinuxFocus 1998