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"
- 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.
- Java no da soporte
a struct, union y pointer
- Java no ofrece
typedef ni #define
- No permite la
sobrecarga de operadores.
- No ofrece herencia
múltiple.
- Maneja los comandos
en línea de diferente manera que C++
- Java tienen una
clase String, que permite un mejor manejo que los
arrays de terminación nula del C y C++.
- Java tiene un
sistema automático de asignación y liberación
de memoria (recolector de basura) que mejora
mucho los sistemas del C++
- 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.
- 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).
- 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.
- 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++.
- 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.
- 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.
- 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.
- 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++.
- 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
- 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:
- 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.
- 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.
- 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.
- 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.
- 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.
- 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.
- 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.
- 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.
- 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:
- 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.
- 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.
- Manipuladores de
protocolo
programas que se cargan en el visualizador e
interpretan un protocolo (como pueda ser HTTP).
- Manipuladores de
contenido
un programa cargado en el visualizador y que interpreta
el contenido de determinado tipo de ficheros.
- 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:
- El usuario solicita un
documento HTML al servidor de información.
- El servidor envia el
documento al visualizador del cliente, este documento
tienen una etiqueta app que identifica la referencia a un
applet
- El bytecode (optienido por
compilación de código java) del applet se transfiere al
cliente.
- El visualizador del
cliente, que funciona con Java (tiene una VM) interpreta
el Bytecode y despliega el applet
- 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
- HotJava
Pequeño visualizador de WWW que permite un perfecto
manejo de applets. Se distribuye con el propio Java y se
invoca como hotjava
- 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).
- Compilador de Java
se invoca con javac y produce la
conversión de código Java en Bytecode
- Generador de archivos
fuente y cabecera C
Genera archivos de ambos tipos para elaborar métodos. Se
invoca como javah o javah_g.
- Desamblador de Java
Se invoca con javap e imprime información
sobre un archivo de clase.
- 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.
- Herramienta de perfilado
Se invoca con javaprof y formatea la
opción prof del compilador.
- Documentación
La distribución del compilador incluye gran cantidad de
documentación en formato HTML.
- 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:
- package
java.lang:
características del lenguaje como: objetos,
hilos, excepciones, caracteres, enteros y
cadenas.
- package
java.util:
características como: la cache, vinculador, pila
y vector.
- 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
- 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.
- Los comentarios en Java
pueden tener varios estilos:
- /* comentario */
- // comentario
- /** comentario
extendido
hasta que se encuentre */
- Java ignora los comentarios
y espacios en blanco. La disposición del código es mas
conveniencia de visualización que exigencia
lexicografica.
- Las sangrías y métodos de
presentación son herencia del C y C++.
- Java utiliza ; como
separador de posiciones y {} como agrupador de
posiciones.
- Los nombre de los
identificadores siguen la siguientes reglas:
- Un identificador no
puede ser una palabra clave
- Un nombre debe
empezar con una letra, subrayado _ o signo $
- Después de la
primera letra se puede utilizar cualquier
carácter, a excepción de aquellos reservados
para uso del lenguaje (., + ...)
- La convención de nombres a
de ser coherente y aportar significancia al contexto,
así:
- Emplear sustantivos
para los nombres
- Emplear verbos para
las acciones y métodos.
- Letras mayúsculas
iniciales para nombres de clases.
- Minúsculas para
nombres de métodos.
- Mayúsculas para
distinguir entre palabras en nombres compuestos.
- 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:
- el código anterior se
guarda en un fichero texto cuya extensión es .java
(AplicacionEsencial.java)
- 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.
- 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:
- Comentarios: desde
"/*" hasta que aparece "*/", son
ignorados por el compilador
- 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.
- 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
- 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.
- 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:
- $java
AplicacionEsencial alpha beta
- 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
- Primeras aplicaciones con
Java
- Clases: Herencia
- Paquetes e interfaces
- Gestión de Cadenas
- Gestión de excepciones
- Hilos y sincronización
- Utilidades
- Clases de Entrada y Salida
- Applets
- Ventana Abstracta
- Introducción al
Tratamiento de Imágenes
- Ejemplos