Professional Documents
Culture Documents
com/manual-
java/indice_manual_java.php
Lo anterior produce programas que son difíciles de escribir y actualizar por la simple
razón que el problema espacial dista en grandes proporciones del mapeo maquinal;
frente a estas deficiencias han surgido lenguajes más apegados al problema real tales
como: PROLOG donde todo problema es mapeado a una cadena de decisiones o LISP
donde todo problema es convertido a listas.
Aquí es donde los lenguajes orientados a objetos salen a relucir, esto se debe a que
permiten llevar acabo un mapeo más directo con el problema espacial(real). Allan Kay,
describió las 5 principales características de Smalltalk, uno de los primeros lenguajes
orientados a objetos y uno de los lenguajes en los cuales esta basado Java:
Entre los lenguajes orientados a Objetos hoy en día Java figura entre los más utilizados
comparado con sus homólogos, pre-aparición de Java el lenguaje C++ se encontraba en
la cúspide para desarrollos de Software con orientación a Objetos, sin embargo, Java ha
venido suplantando su uso debido a dos características muy especificas que C++ no
ofrece.
Interoperabilidad de Plataforma
Esta característica forma parte del lema Java: "Write once, run everywhere" (Escribalo
una vez, ejecutelo en todos lados), a continuación se ilustra este concepto.
El proceso de creación es muy similar a la de otros lenguajes: una vez creado el Código
Fuente es necesario compilarlo para generar un binario, este binario denominado Byte-
Code en Java lleva por extensión .class, sin embargo, a diferencia de otros lenguajes
este binario (Byte-Code) puede ser ejecutado en diversas plataformas obteniéndose el
mismo resultado final.Esta interoperabilidad de ejecución se debe a que el Byte-Code es
ejecutado en una maquina virtual llamada "Java Virtual Machine", es a través de este
componente que se logra una ejecución idéntica en distintos ambientes.
Hoy en día, existen diversos JVM("Java Virtual Machines") para distintas plataformas y
ambientes que oscilan desde los Sistemas Operativos Linux,Solaris,Windows,HP-UX
hasta productos como Bases de Datos Oracle y Servidores de Aplicaciones BEA; esto
permite que código escrito en Java pueda ser ejecutado en cualquier ambiente
produciéndose los mismos resultados.
Si alguna vez ha programado en el lenguaje C++ debe estar familiarizado con este
concepto, el cual significa que los recursos de memoria ("RAM") han sido agotados en
el sistema. Suponga que ha diseñado un programa que invoca la creación de miles de
instancias , eventualmente su memoria ("RAM") puede fugarse si no ha tomado las
precauciones necesarias para deshacerse/destruir estas instancias de Objetos.
JDK/J2SE.
JDK ("Java Development Kit") y J2SE ("Java 2 Standard Edition") son nombres para el
mismo componente utilizado en ambientes Java, el cual agrupa las diversas
funcionalidades necesarias para desarrollar programas Java.
Hoy en día, existen JDK's/J2SE para diversos ambientes y plataformas, los cuales
ofrecen lo siguiente:
Para este curso se hace uso del JDK/J2SE de Sun Microsystems , aunque claro esta,
cualquier programa generado en este JDK puede ser ejecutado otros ambientes, al igual
que programas compilados en otros JDK's/J2SE pueden ser ejecutados en este ambiente.
El conjunto de Clases base proporcionadas por el JDK/J2SE incluyen clases de uso
común tales como : Manipulación de String's, Fechas y Números así como todas las
funcionalidades base esperadas de un lenguaje computacional como: Ordenamiento y
manipulación de Arreglos, Operaciones matemáticas complejas (Trigonométricas y
Exponenciales) y escritura/lectura de "Streams".
Además de estas Clases base, el JDK/J2SE posee otra serie de Clases especializadas
que también ofrecen la base para la creación de otros componentes Java que incluyen :
Applets, Objetos CORBA , Fragmentos Auditivos, Soporte de Criptografía (Seguridad)
y Manipulación de XML entre otras funcionalidades.
Aunado a las Clases base, el JDK/J2SE incluye una serie de ejecutables utilizados para
diversas tareas como : Creación de ejecutables (Byte-Code), generación de
documentación, creación de "Stubs" y "Skeletons" a través de IDL e inclusive una
implementación de un ORB ("Object Request Broker") para interactuar con ambientes
CORBA, entre otros ejecutables.
JDK 1.4.2
___________|_________________
| | |
bin lib jre
| | ________|__________
java* tools.jar | |
javac* dt.jar bin lib
javap* | ________ ___|___ _________ ________
_______
javah* java* | | | | |
|
javadoc* rt.jar ext security i386 applet
fonts
charsets.jar | / \
| / \
localedata.jar server client
Un Programa Java.
Para entrar en materia es necesario escribir nuestro primer programa Java, el cual ilustra
la sintaxis así como estructura de un programa básico.
Java toma una perspectiva nueva respecto a otros lenguajes, adoptando una convención
a partir de Dominios en Internet, esto es, nuestros programas y por ende librerías
("packages") estarán basados en el nombre de la empresa/dominio para la cual son
diseñados, lo anterior permite evitar la tan conocida Colisión de Nombres en Software.
Esta Colisión de Nombres se da cuando dos Clases llevan el mismo nombre y ambas
requieren ser utilizadas dentro de un programa en particular, empleando Dominios en
Internet se garantiza que el nombre de la Clase/Librería sea única , puesto que es una
característica de Dominios en Internet.
Para que puedan ser asignadas Clases a determinadas librerías es necesario indicar dicha
Librería("Package") en la definición inicial de un programa, además de esto, es
necesario crear una estructura de directorios para generar las determinadas Clases; lo
anterior se ilustra mejor a través de un ejemplo:
La Variable CLASSPATH.
Al utilizar Clases y Librerías en ambientes Java surge otro tema en lo que concierne a
su ubicación: Cuales Clases/Librerías están disponibles al momento de
Compilar/Ejecutar programas Java ? , la respuesta a esta pregunta es la conocida
variable CLASSPATH.
Para definir/alterar esta variable existen dos alternativas: Definirse al nivel de Sistema
en variables de ambientales o al tiempo de invocarse un comando Java, ya sea java o
javac.
Usted ya diseño 300 clases que están siendo re-utilizadas por otros programas, sin
embargo, se le ha solicitado una modificación radical a estos objetos base, cuales
métodos/campos de estas 300 Clases puede modificar sin quebrantar los otros
programas que hacen uso de estas ? Aquí puede surgir un serio problema sino han sido
utilizados los calificadores de acceso acordemente.
Ahora bien, además de los calificadores de acceso que permiten restringir el uso de
métodos/campos a determinadas situaciones, también existen otros calificadores que
afectan directamente la creación y uso de instancias por clase estos calificadores son
static yfinal.
public : Acceso libre .
El uso del calificador public significa que toda definición será accesible de cualquier
punto, ya sea un método, campo o clase. Su uso implica un acceso global, desde luego
el uso de este calificativo en Clases que serán modificadas constantmente es
fuertemente desalentado, ya que puede quebrantar dependencias forjadas en versiones
previas.
El calificador private indica que dicho componente será accesible únicamente dentro
de la Clase en cuestión, si se intenta accesar cualquier elemento de este tipo dentro de
otra Clase será generado un error de compilación.
El uso del vocablo static ha venido siendo utilizado en los métodos principales (main)
de los programas escritos anteriormente, su uso esta relacionado directamente al uso de
instancias en Clases; en ocasiones es necesario o conveniente generar elementos que
tomen un mismo valor para cualquier número de instancias generadas o bien
invocar/llamar métodos sin la necesidad de generar instancias, y es bajo estas dos
circunstancias que es empleado el calificador static.
El primer uso de static puede ser poco evidente, pero tomemos el caso de la Clase
mencionada al inicio de este curso de una Lampara, en caso de requerirse un elemento
como un apagador pudiera resultar sobrado generar una instancia para cada Lampara,
en este caso pudiera ser restringido un apagador a una sola instancia mediante el
calificador static permitiendo que dicho elemento sea utilizado por todas las
instancias de Lampara ahí generadas; desde luego la descripción anterior esta
trivializada, sin embargo, conforme se avance en el presente curso serán ilustrados otros
ejemplos con este mecanismo.
La teoría del concepto static puede ser un poco difícil de digerir, sin embargo, como
fue mencionado anteriormente, conforme avance el curso serán descritos diversos
fragmentos de código para dejar en claro su uso.
De igual manera que la utilización de static el uso de final será ilustrado conforme
se avanze en este curso.
Objetos y Primitivos.
Al diseñar sus primeros programas en Java, pudo notar que todo gira alrededor de
instancias de Objetos que son manipuladas a través de referencias:
Al utilizar referencias en Java estas pueden ser inicializadas sin que pertenezcan a
ninguna instancia de Objeto:
String let;
La declaración anterior genera una referencia, sin embargo, esta no es asociada con
ninguna instancia de Objeto, para llevar acabo este proceso es necesario utilizar el
vocablo new.
La declaración anterior no solo genera una instancia nueva de la Clase String, sino le
asigna un valor inicial ("Algo sencillo") el cual es asignado a la referencia let; este
mecanismo de agregar valores al generar una instancia es llevada acabo a través de
métodos denominados constructores los cuales serán descritos posteriormente.
Nótese que estos primitivos inician con letra minúscula, en la tabla anterior se describen
los rangos de dichos primitivos así como sus respectivos "Wrappers"; estos
"Wrappers" son Clases utilizadas como contra parte de primitivos:
char c = 'x';
Character C = new Character(c);
El uso práctico para emplear "Wrappers" y/o primitivos será explorado en una futura
sección de este curso.
Campos("Fields") y Métodos.
Cuando se define una Clase esta puede contener dos tipos de elementos: Campos
("Fields") o Métodos, los métodos ya fueron descritos en los ejemplos anteriores, sin
embargo , un campo es un objeto o primitivo utilizado para guardar datos en cada
instancia de un objeto :
En Java existen ciertos campos que son definidos como final, y aunque dicho
calificativo puede ser empleado en métodos y Clases su uso más común es en campos,
su significado puede ser descrito con las siguientes palabras: "No puede cambiar"; las
razones por las que es utilizado final pueden ser: Eficiencia o Diseño.
Constructores.
• Utilización de Constructores .
En el caso anterior, dentro del constructor se desea asignar valores a los campos de una
Clase, sin embargo, dentro del constructor son utilizados como parámetros de entrada
los mismos valores, para tener acceso a los campos de la Clase se utiliza el vocablo:
this, al emplear esta sintaxis se esta haciendo alusión a los campos de la Clase.
Aunque sería posible emplear distintos nombres para los valores de entrada, evitando el
uso del vocablo this, la sintaxis con el vocablo this es ampliamente utilizada en el
caso de Constructores mencionado anteriormente, así como Java Beans, un concepto
utilizado en Java para ambientes Web (JSP's/Servlets).
• Utilización de Comentarios .
• Generación de Documentación .
Herencias ("Inheritance")
El uso de Herencias es ampliamente utilizado en diseños Java, inclusive las Clases Base
del JDK lo utilizan extensamente, si observa la documentación de estas Clases, notará
en la parte superior el árbol de Herencias ("Inheritance") para la Clase correspondiente,
donde todas son descendientes de la Clase Base java.lang.Object.
Condicionales if/else.
• break/continue en Ciclos .
Uso de switch.
• Utilización de Switch.
En Java al igual que otros lenguajes existen diversos operadores que son empleados en
diferentes secciones de un programa, a lo largo de los distintos programas escritos en
este Curso se han empleado su gran mayoría, sin embargo, en esta sección se
describirán detalles más precisos acerca de su funcionamiento.
• Asignación de Valores.
Operadores Relacionales.
Operador Significado
< Menor que
> Mayor que
<= Menor que o Igual
>= Mayor que o Igual
== Igual
!= No Igual
Muchos de estos Operadores han sido utilizados a lo largo de este curso, a continuación
se demuestra un uso muy común de estos operadores:
• Utilizando Equivalencias.
Operadores Matemáticos.
Operador Significado
+ Suma
- Resta
= Igual
* Multiplicación
/ División
% Modulo (El residuo de una División)
Java también ofrece una sintaxis para llevar acabo una operación matemática y
asignación en una sola simbología, esta es llevada acabo mediante: "+=","-=","*=","/=";
además de esta sintaxis también existen los operadores de auto-incremento y auto-
decremento que son representados por "++" y "--" respectivamente.
Además de estos operadores matemáticos, el lenguaje también posee una Clase estándar
(en el JDK) para realizar operaciones más complejas, esta Clase bajo el nombre de
java.lang.Math ofrece operaciones trigonométricas, exponenciales y otras más; a
continuación se describen algunos ejemplos empleando dicha clase :
Operadores Lógicos.
Operador Significado
|| O (OR)
&& Y (AND)
! Negación (NOT)
if(t == null)
throw new NullPointerException();
Además de los errores ("Exceptions") ofrecidos en las Clases Base del JDK, es posible
definir errores propietarios para llevar un control más estricto sobre la generación de
errores:
Datos de Entrada
"Streams"
Un "Stream" es un nombre genérico otorgado a un flujo de caracteres en un programa
de computo, puede estar compuesto por los valores residentes en un archivo texto, datos
introducidos interactivamente por un usuario o datos que desean ser colocados en
determinado archivo.
Un "Stream" es la representación más cruda de un juego de datos, pero una manera muy
universal de accesar/guardar datos, inclusive la clase System.out.println utilizada en
la gran mayoría de los programas de este curso también es un "Stream"; en Java existen
diversas Clases utilizadas en conjunción de "Streams", a continuación se describen estas
Clases :
Arreglos.
• Utilización de Arreglos .
Al final de esta sección serán descritas otras metodologías para agrupar datos que
poseen distintas ventajas a emplear un Arreglo.
Polimorfismo
Inicialmente se puede pensar que este código generaría un error debido a que el tipo de
referencia es distinta a la instancia del objeto, sin embargo, el fragmento anterior es
correcto y demuestra el concepto de Polimorfismo; para asentar este tema se describe un
ejemplo más completo:
• Uso de Polimorfismo .
Uso de "Casting"
El termino "Casting" viene de la palabra "Cast" que significa Molde, por lo que el
termino literal es Hacer un Molde, en Polimorfismo se lleva acabo este proceso de
"Casting" implícitamente, una Guitarra se coloca en el molde de un Instrumento, un
Triangulo en el molde de una Figura, sin embargo, en ciertas ocasiones se requiere
realizar un tipo de "Casting" que no es considerado seguro en términos
computacionales.
Clases Abstractas.
Al ser definida una Clase, además de ser declarados los métodos/campos como abstract
también es necesario utilizar el vocablo abstract en la definición de cada Clase.
• Clases Abstractas .
Una de las características de las Clases que Heredan("Inherit") de una Clase abstracta,
es que éstas deben definir los mismos métodos definidos en la Clase Base; en Java
existe otro mecanismo que permite llevar acabo diseños donde se parte de una
Estructura o Cápsula.
Interfases.
Una Interfase es una Clase abstracta llevada al extremo, la cual permite pre-definir el
uso de métodos/campos en futuras clases tal como: Una jerarquía de Instrumentos
restringido al uso de una Interfase Instrumento, o bien, una estructura de Figuras al uso
de la Interfase Figura.
Una Interfase básicamente dice: "Todas las Clases que implementen esta Interfase deben
contener su misma estructura", para definir una Interfase se utiliza el vocablo
interface y para especificar que una Clase debe utilizar determinada Interfase se
utiliza el vocablo implements.
Al ser utilizada una Interfase en una Clase se esta indicando: "La Interfase dicta la
forma/estructura ahora se va describir como debe funcionar", en el siguiente ejemplo se
describe el uso de Interfases:
• Uso de Vectores .
• Uso de "Hashtables" .
Además del uso de Vectores y "Hashtables", también existen otra serie de Clases para el
almacenaje de Objetos, cada una de éstas posee sus ventajas y desventajas para agrupar
elementos comunes; mayores detalles sobre estas estructuras de datos serán descritas a
continuación en el "Collection Framework" de Java.
Collections Framework.
"Threads"
Los diversos programas que han sido diseñados en este curso poseen una característica
común que consiste en realizar sus tareas de una manera monolítica, sin embargo, en
ciertos diseños surge la necesidad de fragmentar la ejecución de un programa en
diversos sub-procesos o tareas, y es precisamente a través de "Threads" que se logra
este comportamiento .
Existen dos maneras para trabajar con "Threads" en una Clase Java :
Los ejemplos descritos a continuación ilustran los conceptos más comunes de "Threads"
en Java :
Además del mecanismo empleado en los ejemplos anteriores para utilizar "Threads",
existe otra manera de emplearlos en el lenguaje Java y ésta es a través de la interfase
java.lang.Runnable; observe el siguiente fragmento :
Lo anterior aplica como regla general en todo uso de "Threads": Mientras no sea
necesario heredar ("inherit") el comportamiento de otra Clase se debe emplear
java.lang.Thread, sin embargo, si se requiere heredar el comportamiento de otra
Clase y tener acceso a "Threads" es necesario emplear la interfase
java.lang.Runnable para garantizar la implementación correcta de un "Thread".
Garbage Collection
System.gc y Runtime.gc
Sin embargo, a pesar de su nombre, el hecho de invocar este método directamente (en
cualquiera de las Clases) no implica que se realice el proceso de "Garbage
Collection" inmediatamente, lo único que logra es expeditar (acelerar) los mecanismos
para iniciar el proceso de "Garbage Collection"; el momento preciso en que es invocado
el proceso de "Garbage Collection" depende del JVM ("Java Virtual Machine"), según
fue descrito anteriormente.
"Assertions"
Ahora bien, aunque también pudieran ser utilizados bloques try/catch para capturar este
tipo de errores, el uso de bloques try/catch implica anticipar un tipo de error (Clase)
además de escribir código extenso, esto a diferencia de una aseveración ("Assertion")
donde es posible definir una condición específica que debe cumplir un programa para
proceder con su ejecución. Los siguientes ejemplos demuestran el uso de este
mecanismo para programas Java
En Java, el uso de "Assertions" es una nueva adición a partir del JDK 1.4, por lo que su
uso requiere de ciertas medidas al compilar y ejecutar programas para garantizar
compatibilidad con versiones anteriores. A continuación se describen los diversos pasos
que deben tomarse para activar aseveraciones al momento de compilar y ejecutar un
programa.
Palabras Reservadas
En Java al igual que otros lenguajes de computo existen varias palabras que se
encuentran reservadas para uso exclusivo en sus estructuras internas, lo anterior implica
que estos términos no pueden ser utilizados para nombres de campos, métodos, clases u
otras estructuras de datos; la mayoría de estas palabras han sido descritas en el
contenido del presente curso, sin embargo, a continuación se ilustra una tabla concisa
que contiene dichas palabras:
while
Java 5 / JDK 5 .
Un caso típico donde son utilizados primitivos es aquel donde se realizan operaciones
matemáticas, esto se debe en parte a la sencillez de generar un primitivo, ya que no
requiere inicialización de objeto mediante new, mismo factor que favorece eficiencia de
ejecución comparado con usar un objeto. Sin embargo, a pesar de las ventajas
presentadas al utilizar primitivos, existen casos -- como el de guardar primitivos en una
colección de objetos -- que requieren conversiones continuas de un primitivo hacia un
objeto y viceversa.
El mecanismo de colocar información dentro del código fuente para fines distintos al de
ejecución no es algo nuevo para Java, el proceso para generar documentación de clases
emplea este mismo mecanismo y ha estado disponible desde las primeras versiones Java
[ Observe el proceso para generación de documentación en Java], sin embargo, lo que
resulta importante de esta funcionalidad en Java 5 es la capacidad de utilizar dicha
información para fines de indicar instrucciones al compilador o JVM ("Java Virtual
Machine").
Uso de Enumeraciones.
Una enumeración es una estructura de datos diseñada para agrupar información estática
y facilitar su acceso de otras clases. Esta funcionalidad ya presente en una serie de
lenguajes de programación, como C++ y Perl, esta siendo debutada en el mundo Java
hasta esta versión 5.
Como sería normal esperar, ante la falta de apoyo directo en el JDK para
enumeraciones, muchos desarrolladores familiarizados con esta técnica han creado sus
propias maneras de simular el comportamiento. Ahora veamos si usted es uno de éstos,
y de ser así, como incorporar la estructura formal de una enumeración a un programa
Java, o de lo contrario, en que casos resulta apropiado utilizarla.
• Uso de enumeraciones .
Al hacer uso de librerías en programas Java, el mecanismo para tener acceso a ellas es a
través del vocablo import, esto es, si deseamos hacer uso de las interfases o clases del
"Collections Framework" debemos colocar la declaración : import java.util.* en la
parte superior de la clase.
Aunque este proceso de acceso es estándar para la mayoría de clases Java, en versiones
previas a Java 5 no es posible utilizarlo en un tipo de clase : Clases estáticas. El acceso a
este tipo de clases en versiones del JDK 1.4 y anteriores requiere que éstas mismas sean
declaradas explícitamente dentro del código central del programa. Observemos un
ejemplo.