JAVA

Que es Java
Características de Java como Lenguaje de programación

En http://java.sun.com se puede leer que Java es:

"Un lenguaje simple. Orientado al objeto, distribuido, interpretado, sólido, seguro, de arquitectura neutral, portable, de lato desempeño, de multihilos y dinámico"

  1. Simple
    Basado en el lenguaje C++ pero donde se eliminan muchas de las características OOP que se utilizan esporádicamente y que creaban frecuentes problemas a los programadores. Esta eliminación de causas de error y problemas de mantenimiento facilita y reduce el coste del desarrollo de software.
  2. Orientado al objeto
    Java da buen soporte a las técnicas de desarrollo OOP y en resumen a la reutilización de componentes de software.
  3. Distribuido
    Java se ha diseñado para trabajar en ambiente de redes y contienen una gran biblioteca de clases para la utilización del protocolo TCP/IP, incluyendo HTTP y FTP. El código Java se puede manipular a través de recursos URL con la misma facilidad que C y C++ utilizan recursos locales (archivos).
  4. Interpretado
    El compilador Java traduce cada fichero fuente de clases a código de bytes (Bytecode), que puede ser interpretado por todas las máquinas que den soporte a un visualizador de que funcione con Java. Este Bytecode no es especifico de una máquina determinada, por lo que no se compila y enlaza como en el ciclo clásico, sino que se interpreta.
  5. Sólido
    El código Java no se quiebra fácilmente ante errores de programación. Así el relaje que existe en la declaración y manejo de tipos en C y C++ se torna en restricciones en Java, donde no es posible la conversión forzada (cast) de enteros en punteros y no ofrece soporte a los punteros que permitan saltarse reglas de manejo de tipos. Así en Java no es posible escribir en áreas arbitrarias de memoria ni realizar operaciones que corrompan el código. En resumen se eliminan muchas de las posibilidades de "trucos" que ofrecía el C y C++.
  6. Seguro
    Como Java suele funcionar en ambiente de redes el tema de seguridad debe interesar en sobremanera. Las mismas características antes descritas que evitan la corrupción de código evitan su manipulación. Actualmente se esta trabajando en encriptar el código.
  7. Arquitectura neutral
    El compilador crea códigos de byte (Bytecode) que se envía al visualizador solicitado y se interpreta en la máquina que posee un interprete de Java o dispone de un visualizador que funciona con Java.
  8. Portable
    Al ser de arquitectura neutral es altamente portable, pero esta característica puede verse de otra manera: Los tipos estándares (int, float ...) están igualmente implementados en todas las máquinas por lo que las operaciones aritméticas funcionaran igual en todas las máquinas.
  9. Alto desempeño
    al ser código interpretado, la ejecución no es tan rápida como el código compilado para una plataforma particular. El compilador Java suele ofrecer la posibilidad de compilar Bytecode en código máquina de determinadas plataformas, y según Sun este código resultar de una eficacia similar a compilaciones de C y C++.
  10. Multihilos
    Java puede aplicarse a la realización de aplicaciones en las que ocurra más de una cosa a la vez. Java, apoyándose en un sistema de gestión de eventos basado en el paradigma de condición y monitores C.A.R. permite apoyar la conducta en tiempo real e interactiva en programas
  11. Dinámico
    al contrario que C++ que exige se compile de nuevo la aplicación al cambiar una clase madre Java utiliza un sistema de interfaces que permite aligerar esta dependencia. Como resultado, los programas Java pueden permitir nuevos métodos y variables en un objeto de biblioteca sin afectar a los objetos dependientes.

Diferencias con C++

Java es mejor que el C++, por lo que no tiene:

  1. En Java no es posible crear variables globales. Solo las variables estáticas y publicas de algunas clases pueden considerarse como tales, pero esto generalmente, y como en el caso de las variables globales en C++ son síntoma de un mal diseño.
  2. Java no dispone de sentencia goto lo cual permite crear un código más robusto y seguro así como más optimizado. Para cubrir esta falta Java proporciona un tratamiento muy optimizado de excepciones, poderoso y bien definido.
  3. Los punteros son una característica poderosa y peligrosa del C++, en si evitan que ninguna variable sea privada de verdad, ya que es fácil acceder a la mis a través de punteros, los cuales son fuente inacabable de problemas y malfuncionamiento. Java no dispone de tratamiento de punteros. Los vectores o arrays lo son de modo cierto, lo cual evita sobrepasar el mismo o salirse de sus limites.
  4. El manejo de memoria en C se realiza de forma peligrosa a través de punteros obtenidos con la función malloc(), y que se libera explícitamente con free(), esto puede causar errores si el programador no controla perfectamente los pasos en que estas operaciones se realizan. Otro error es el olvido frecuente de liberar memoria, lo cual termina consumiendo los recursos del sistema. Java no dispone de punteros y todos lo objetos se crean con el operador new, el cual asigna espacio en el montículo de memoria a cada objeto. Lo que se obtiene con new es un descriptor del objeto (no una dirección) la dirección real es manejada por el sistema el cual la puede mover o recolocar según necesidad, pero el programador no ha de preocuparse por ello. Lo importante es que el objeto tiene memoria asignada mientras le interese al programa, quedando esta memoria disponible en cuanto este interés cese. No se hará falta llamar a free o delete ya que el recolector de basura realizara esta labor. Este recolector o reciclador de basura se ejecutara cuando el sistema este libre o una asignación no encuentre lugar disponible.
  5. C y C++ disponen de tipos de datos frágiles cuyos limites y características dependen de la implementación y maquina del compilador. Java implementa limites y tamaños sensatos y validos para todo tipo de máquinas y entornos (independientes del Hardware) por lo que es totalmente reproducibles en cualquier plataforma.
  6. En C es posible la realización de casting o conversión de tipos en tiempo de ejecución. En C++ esta operación es peligrosa ya que los objetos son referencias a zonas de memoria y no es posible tener información sobre sí la conversión en posible. En Java los descriptores de los objetos contienen información completa acerca de la clase a la que pertenece el objeto, por lo que pueden realizarse comprobaciones en tiempo de ejecución sobre la compatibilidad de tipos y emitir la excepción correspondiente si no es aplicable la conversión.
  7. En Java no se dispone de archivos de cabecera con los prototipos de las clases. Esto, en principio es una desventaja, hasta que se comprueba que esta habilidad del C++ ha llevado a entornos de compilación prácticamente inmanejables, ya que cada compilación puede tratar estos archivos de formas un tanto complejas. Java no dispone de esta habilidad de archivos de cabecera, el tipo y la visibilidad de la clase se compila en el propio archivo de la clase, siendo tarea del interprete de Java realizar el acceso.
  8. Java no tiene struct ni union, ambos sistemas de encasulamiento y polimorfismo un tanto crípticos e inseguros del C++, unificando todo en un solo concepto de class.
  9. La programación de entornos reales de C y C++ implica un buen conocimiento del manejo del preprocesador y sus trucos, lo cual no es una manera limpia de controlar lo que se compila. Java no dispone de este sistema, pero tienen medios (como la declaración final para constantes) que permiten igual potencia.

Java Genera:

Un programador en Java puede crear:

  1. applets
    programas elementales incluidos en páginas HTML a través de la etiqueta app y que se despliega en el visualizador tras cargarse la página.
  2. Aplicaciones
    programas escritos en Java y que se ejecutan de forma independiente de los visualizadores. Esto se realiza llamando a los interpretes Java con el programa como opción.
  3. Manipuladores de protocolo
    programas que se cargan en el visualizador e interpretan un protocolo (como pueda ser HTTP).
  4. Manipuladores de contenido
    un programa cargado en el visualizador y que interpreta el contenido de determinado tipo de ficheros.
  5. Métodos nativos
    métodos que se declaran en una cierta clase Java pero que se implementan en C.

Java en Operación

Cuando un usuario solicita un applet construido con java ocurre:

  1. El usuario solicita un documento HTML al servidor de información.
  2. El servidor envia el documento al visualizador del cliente, este documento tienen una etiqueta app que identifica la referencia a un applet
  3. El bytecode (optienido por compilación de código java) del applet se transfiere al cliente.
  4. El visualizador del cliente, que funciona con Java (tiene una VM) interpreta el Bytecode y despliega el applet
  5. Como código del applet contiene toda la información necesaria, el usuario tiene una interación total con el applet sin relacionarse de nuevo con el servidor.

Software para la manipulación de Java

  1. HotJava
    Pequeño visualizador de WWW que permite un perfecto manejo de applets. Se distribuye con el propio Java y se invoca como hotjava
  2. Interprete de Java
    Se invoca con el comando java y debe de disponerse del propio de la plataforma existente. Ocupa alrrededor de 40 Kb (175 con todas las bibliotecas).
  3. Compilador de Java
    se invoca con javac y produce la conversión de código Java en Bytecode
  4. Generador de archivos fuente y cabecera C
    Genera archivos de ambos tipos para elaborar métodos. Se invoca como javah o javah_g.
  5. Desamblador de Java
    Se invoca con javap e imprime información sobre un archivo de clase.
  6. Generador de documentos
    Imprime documentación sobre una clase Java. Estas páginas, visualizables como HTML se encuentran en cantidad de sitios con información sobre aplicaciones Java. Se invoca como javadoc.
  7. Herramienta de perfilado
    Se invoca con javaprof y formatea la opción –prof del compilador.
  8. Documentación
    La distribución del compilador incluye gran cantidad de documentación en formato HTML.
  9. Interfaz de Programación
    Son un conjunto de clases que se distribuyen con el código fuente del Java y que los programadores pueden utilizar. Esto se agrupa en tres paquetes que contienen completa documentación y que incluyen:
    1. package java.lang: características del lenguaje como: objetos, hilos, excepciones, caracteres, enteros y cadenas.
    2. package java.util: características como: la cache, vinculador, pila y vector.
    3. package java.io: características de entrada/salida como: flujos de datos de salida, de impresión y de entrada de texto.

Especificaciones de la Máquina virtual de Java

Un documento disponible en el sitio de Java de Sun Microsystems (http://java.sun.com/), llamado The Virtual Machine (la maquina virtual) especifica la manera en que esta diseñado el lenguaje Java para intercambiar contenido ejecutable a través de redes. El objetivo de estas especificaciones es describir a Java como un lenguaje abierto, no propietario, que puede ser implementado por muchas compañías y venderse como un paquete.

La especificación da la maquina virtual de Java (VM) describe la manera en que opera Java en términos abstractos. Esto deja que los detalles de la implementación dependan de los programadores que creen compiladores e interpretes de Java. La especificación de la máquina virtual de Java también define de manera concreta el formato de intercambio específico para el código Java. A esto se llama Especificación de Intercambio de Java.

La otra parte de las especificaciones de la Virtual Machine define las abstracciones que se pueden dejar al instalador, las que no se relacionan con el intercambio de código de Java. Entre estas se incluye, por ejemplo, el manejo de las áreas de tiempo de ejecución de datos, algoritmos de recolección de basura, la implementación del compilador y de otro software de ambiente de Java, así como la puesta optima de los algoritmos en el código Java compilado.

Características generales del lenguaje

  1. Java es sensible a mayúsculas y minúsculas. Por convención los nombres de las clases comienzan con mayúscula y los métodos y objetos con minúscula.
  2. Los comentarios en Java pueden tener varios estilos:
  3. Java ignora los comentarios y espacios en blanco. La disposición del código es mas conveniencia de visualización que exigencia lexicografica.
  4. Las sangrías y métodos de presentación son herencia del C y C++.
  5. Java utiliza ; como separador de posiciones y {} como agrupador de posiciones.
  6. Los nombre de los identificadores siguen la siguientes reglas:
    1. Un identificador no puede ser una palabra clave
    2. Un nombre debe empezar con una letra, subrayado _ o signo $
    3. Después de la primera letra se puede utilizar cualquier carácter, a excepción de aquellos reservados para uso del lenguaje (., + ...)
  7. La convención de nombres a de ser coherente y aportar significancia al contexto, así:
    1. Emplear sustantivos para los nombres
    2. Emplear verbos para las acciones y métodos.
    3. Letras mayúsculas iniciales para nombres de clases.
    4. Minúsculas para nombres de métodos.
    5. Mayúsculas para distinguir entre palabras en nombres compuestos.
  8. Lo anterior es practica en la OOP, pero el programador podra generar las convenciones oportunas, pero con significado y valor añadido.

Una aplicación esencial

/**
mi primera aplicación Java
  @autor jmrr
  @version 1.1.0
*/
Class AplicacionEsencial {
   Public static void main (String args[]) {
   System.out.println("Hola Mundo");
   }
}

Lo anterior representa el codigo de un progrma Java que se compilara y ejecutara de la siguiente forma:

  1. el código anterior se guarda en un fichero texto cuya extensión es .java (AplicacionEsencial.java)
  2. este se compila llamando a javac. El resultado de esta compilación es un fichero con el nombre de la clase contenida y la extensión .class (AplicacionEsencial.class). El nombre del fichero fuente (.java podra ser cualquiera pero dado que el resultado de la compilación adquiere el nombre de la clase contenida en el mismo, es buena practica el llamar al fichero fuente con el mismo nombre.
  3. El fichero obtenido puede ser llamado como argumento del interprete para su ejecución:

$ javac AplicacionEsencial.java

$ java AplicacionEsencial.class

Hola Mundo

$

Las partes del programa anterior son:

  1. Comentarios: desde "/*" hasta que aparece "*/", son ignorados por el compilador
  2. La palabra clave class que seguida del nombre de la clase a definir y de la llave de apertura "{" da comienzo a la definición de la misma.
  3. Cuerpo de la clase que contendrá métodos, operaciones y datos de la clase. En nuestro caso solo contienen un método, el que todas las aplicaciones han de tener: main
  4. La línea: "Public static void main (String args[]) {" da comienzo al metodo main, las palabras clave que anteceden al nombre indican formas expecificas para este y su explicación se hara a posteriori.
  5. Despues de main se declara los parametros de este metodo (String args[]) que en este caso conta de un array de cadenas decaracteres cuyo nombre es args. Esta aplicación no hace uso de estos parametros, pero todos los metodos main han de declarar tal lista, ya que representa la teorica linea de comandos que podria acompañar a la llamada a la clase:
  6. $java AplicacionEsencial alpha beta
  7. Entre las llaves de apertura y cierre se encuentra en cuerpo del método o lista de sentencias que le implementan, en nuestro caso una única llamada al método println.

Un applet esencial

El applet es la clave para conectar el codigo Jacçva con un visualizador. Son programas a los que hace referencia una página HTML por medio de la etiqueta app, programa que es interpretado por el visualizador compaible Java.

La principal diferencia entre el applet y una aplicación es que aquel no se puede ejecutar independientemente de un visualizador. Y la razón para ello es que carece de un método main.

/**
mi primer applet Java
  @autor jmrr
  @version 1.1.0
*/
import browser.Applet;
import awt.Graphics;
Class AppletEsencial extends Applet {
  Public void init () {
  Resize(600,300);
  }
  Public void paint(Graphics context) {
    Context.drawString("Hola Mundo", 50, 100);
  }
}

Como en el caso de aplicación se define una clase, anteriormente a lo cual se importa código necesario que queda disponible para el applet. Estos dos imports (browser.Applet y awt.Graphics)son parte de la interfaz de programación de aplicaciones (API) que contienen paquetes de clases de utilidad en la escritura de aplicaciones y applets. La documentación completa de estos paquetes se puede encontrar en el http://java.sun.com.

Sigue la declaración del applet (Class AppletEsencial extends Applet) que identifica este como subclase de la clase Applet, con lo cual los objetos de AppletEsencial heredan muchas de sus características y funcionalidad.

El cuerpo del applet contiene dos metodos: init que inicia el tamaño del applet y paint que genera la presentación visual del applet. El método paint incluye un parámetro requerido (context) que es de tipo Graphics y se utiliza en el cuerpo para ser el objeto del dibujo en las coordenadas dadas por la función drawString.

Este codigo se coloca en el fichero AppletEsencial.java y se compila, pero el resultado (AppletEsencial.class) no se podra ejecutar con el interprete.

$ javac AppletEsencial.java

$ java AppletEsencial.class

In class AppletEsencial: void main(String argv[]) is not defined.

$

El interprete busca un metodo main para iniciar la ejecución y este no existe.

Para visualizar el applet se hace necesario crear una página HTML que contenga una etiqueta app que haga referencia al applet creado (Applet Esencial.class) y determine la localización del mismo (URL) relativa o absoluta.

<HTML>
  <!—-Proposito: presentar el primer applet -->
  <!—-Autor: jmrr -->
  <HEAD>
    <TITLE>Interfase para AppletEsencial</TITLE>
  </HEAD>
  <BODY>
    <P>Prototipo de applet:<APP Class="AppletEsencial">
  </BODY>
</HTML>

Al abrir esta pagina con el visualizador, el applet será llamado y se ejecutara apareciendo la cadena "hola mundo" en la página.

Por defecto las clases son buscadas en un directorio llamado classes que colgara del directorio donde se encuentra la página HTML.

Extensiones a las aplicaciones esenciales

Generalidades del lenguaje