Você está na página 1de 78

Programacin Java Bsico

OBJETOS, JAVA Y JDK EL PROCESO DE ABSTRACCIN, LENGUAJES COMPUTACIONALES Y OBJETOS. JAVA Y SUS CARACTERSTICAS JDK/J2SE. COMPOSICIN, CLASES Y LIBRERAS ("PACKAGES"). UN PROGRAMA JAVA. LIBRERAS ("PACKAGES") Y JAR'S. ARCHIVOS JAR ("JAVA ARCHIVES") LA VARIABLE CLASSPATH. CALIFICADORES DE ACCESO: PUBLIC, PRIVATE, PROTECTED, STATIC Y F INAL. VARIABLES, CONSTRUCTORES, MTODOS Y COMENTARIOS. OBJETOS Y PRIMITIVOS. CAMPOS ("FIELDS") Y MTODOS. SIGNIFICADO DE RETURN CONSTRUCTORES CONSTRUCTOR OBLIGATORIO MTODOS Y PARMETROS POR REFERENCIA GENERACIN DE DOCUMENTACIN (VA COMENTARIOS) HERENCIA, INTERFACES Y POLIMORFISMO HERENCIA ("INHERITANCE") POLIMORFISMO USO DE "CASTING" INTERFACES Y CLASES ABSTRACTAS. INTERFACES. HERENCIAS MLTIPLES CONDICIONALES, OPERADORES, CICLOS, ARREGLOS CONDICIONALES IF/ELSE USO DE LOS CICLOS FOR Y WHILE SINTAXIS DEL CICLO WHILE USO DE SWITCH OPERADORES MATEMTICOS, RELACIONALES Y LGICOS Daniel Oliva Bianco 2009

3 3 5 7 9 9 11 15 16 19 22 22 24 25 26 27 27 28 33 33 36 40 41 43 45 48 48 50 51 53 56 1

Programacin Java Bsico OPERADORES RELACIONALES. OPERADORES MATEMTICOS ARREGLOS (ARRAYS). VECTORES, HASHTABLES Y OTRAS ESTRUCTURAS DE DATOS. VECTORES HASHTABLES OPERADORES, ERRORES Y DATOS DE ENTRADA/"STREAMS". DEFINICIN DE ERRORES Y BLOQUES TRY/CATCH/FINALLY. DEFINICIN DE ERRORES PROPIETARIOS DATOS DE ENTRADA "STREAMS" 58 59 60 63 63 66 68 68 70 72 74

Daniel Oliva Bianco 2009

Programacin Java Bsico

Objetos, Java y JDK


El Proceso de Abstraccin, Lenguajes Computacionales y Objetos.
Todo lenguaje de programacin ofrece un proceso de abstraccin sobre un concepto extrado del mundo real, en otras palabras, un lenguaje permite un mapeo entre un problema espacial (real) hacia uno maquinal que ser aquel ejecutado por una computadora. Es en esta capacidad de abstraccin es que reside la facilidad/complejidad de generar programas funcionales capaces de resolver el problema espacial. El lenguaje ensamblador es una abstraccin de la maquina ejecutora ("procesador"); lenguajes como Fortran, Basic y C son abstracciones de este mismo lenguaje ensamblador, sin embargo, aunque estos ltimos ofrecen un avance sobre el lenguaje ensamblador, estos an requieren de procesos de abstraccin considerables. Lo anterior produce programas que son difciles de escribir y actualizar por la simple razn que el problema espacial dista en grandes proporciones del mapeo maquinal; frente a estas deficiencias han surgido lenguajes ms 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 a cabo un mapeo ms directo con el problema espacial (real). Chitral Somapala, describi las 5 principales caractersticas de Smalltalk, uno de los primeros lenguajes orientados a objetos y uno de los lenguajes en los cuales est basado Java:

Todo es un objeto: Considere un objeto una variable especial, no solamente guarda datos, sino tambin se pueden hacer solicitudes a este Objeto en s. En teora, cualquier elemento en el problema espacial (real) (edificios, servicios, automviles, u otra entidad) puede ser representado como un objeto en un programa. Un programa es un conjunto de Objetos, envindose mensajes entre s: Para realizar una solicitud a un Objeto es necesario enviarle un mensaje. Concretamente se puede pensar que un mensaje es una solicitud para llamar una funcin que pertenece a cierto objeto. Cada Objeto tiene su memoria, conformada por otros Objetos: En otras palabras, es posible generar un tipo de Objeto nuevo agrupando Objetos existentes. De esta manera se pueden armar estructuras complejas en un programa, escondidas detrs de la simplicidad de Objetos. Todo Objeto tiene su Tipo: En este sentido Tipo se refiere a clase, donde cada Objeto es una instancia de una clase en cuestin. La caracterstica ms importante de una clase es el tipo de mensajes que pueden ser enviados a ella. Todo Objeto de un mismo tipo puede recibir los mismos mensajes: Esto implica que si un Objeto es del tipo Circulo, un Objeto del tipo Figura ser capaz de recibir mensajes de Circulo, puesto que un Circulo es una Figura. Este concepto forma parte medular de todo lenguaje orientado a Objetos y ser explorado en una seccin especfica de este curso.
3

Daniel Oliva Bianco 2009

Programacin Java Bsico

En la grfica anterior se puede observar una clase conformada por una lmpara (problema espacial real) a la cual pueden ser enviados distintos mensajes tales como: prender, apagar, girar y cambiar; para crear un Objeto de esta clase y ser utilizado dentro de un programa es necesario generar una instancia del mismo, esto se demuestra a continuacin:
Lampara candil = new Lampara(); candil.prender();

El primer rengln genera una instancia de la clase Lampara la cual es asignada a la referencia candil; en la segunda lnea, a travs de esta referencia se manda llamar el mtodo prender() definido en la misma clase; a travs de referencias es posible generar distintos Objetos del mismo tipo cada uno con su propio comportamiento:
Lampara candil = new Lampara(); Lampara manual = new Lampara(); Lampara jardin = new Lampara(); candil.prender(); candil.girar(); manual.apagar(); jardin.prender(); jardin.elevar(); candil.apagar();

Lo anterior demuestra una de las principales caractersticas de los lenguajes orientados a Objetos, sin embargo, a continuacin se describen las caractersticas especificas del Lenguaje Java y porque es considerado uno de los ms avanzados en su ramo.

Daniel Oliva Bianco 2009

Programacin Java Bsico

Java y sus caractersticas


Entre los lenguajes orientados a Objetos hoy en da Java figura entre los ms utilizados comparado con sus homlogos, pre-aparicin de Java el lenguaje C++ se encontraba en la cspide para desarrollos de Software con orientacin a Objetos, sin embargo, Java ha venido suplantando su uso debido a dos caractersticas muy especificas que C++ no ofrece.

Interoperabilidad de Plataforma
Esta caracterstica forma parte del lema Java: "Write once, run everywhere" (Escrbalo una vez, ejectelo en todos lados), a continuacin se ilustra este concepto.

El proceso de creacin es muy similar a la de otros lenguajes: una vez creado el Cdigo Fuente es necesario compilarlo para generar un binario, este binario denominado Byte-Code en Java lleva por extensin .class, sin embargo, a diferencia de otros lenguajes este binario (Byte-Code) puede ser ejecutado en diversas plataformas obtenindose el mismo resultado final. Esta interoperabilidad de ejecucin se debe a que el Byte-Code es ejecutado en una maquina virtual llamada "Java Virtual Machine", es a travs de este componente que se logra una ejecucin idntica en distintos ambientes. Hoy en da, 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 cdigo escrito en Java pueda ser ejecutado en cualquier ambiente producindose los mismos resultados.

Daniel Oliva Bianco 2009

Programacin Java Bsico

Recoleccin de Basura ("Garbage Collection")


En la seccin anterior se pudo observar como son generadas distintas instancias de Objetos a travs de una referencia, sin embargo, el uso de esta metodologa trae consigo otra pregunta: Que se hace con estas instancias una vez que ya no son utilizadas? La importancia de este concepto se debe al uso de memoria en una computadora, es lgico que estas instancias de Objetos requieren memoria ("RAM") para mantener su informacin, ahora bien, tambin tiene sentido asumir que la memoria ("RAM") es limitada en todo sistema, esto trae consigo el problema denominado "fuga de memoria" ("memory leak"). 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 diseado un programa que invoca la creacin de miles de instancias, eventualmente su memoria ("RAM") puede fugarse si no ha tomado las precauciones necesarias para deshacerse/destruir estas instancias de Objetos. En el mundo Java, esta administracin explicita de instancias de Objetos no es necesaria debido al proceso de "Garbage Collection"; este mecanismo a travs del JVM ("Java Virtual Machine") inspecciona constantemente la memoria empleada por Java, lo cual le permite ir eliminando las instancias de Objetos que han dejado de ser utilizadas en un programa, en el proceso despreocupndose de la destruccin de Objetos. Aunque el concepto de recoleccin de basura ("Garbage Collection") posee una infinidad de detalles en su fondo, es conveniente saber que este proceso es llevado automticamente por Java, y que es una facilidad no ofrecida en otros lenguajes como C++

Daniel Oliva Bianco 2009

Programacin Java Bsico

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 da, existen JDK's/J2SE para diversos ambientes y plataformas, los cuales ofrecen lo siguiente:

Un compilador Java, capaz de generar Byte-Code. Un JVM ("Java Virtual Machine"), capaz de ejecutar Byte-Code. Un conjunto de clases base utilizadas para generar programas Java. Otras utileras para administrar cdigo escrito en Java.

Para este curso se hace uso del JDK/J2SE de Sun Microsystems , aunque claro est, 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 comn tales como : Manipulacin de String's, Fechas y Nmeros as como todas las funcionalidades base esperadas de un lenguaje computacional como: Ordenamiento y manipulacin de Arreglos, Operaciones matemticas complejas (Trigonomtricas y Exponenciales) y escritura/lectura de "Streams". Adems de estas clases base, el JDK/J2SE posee otra serie de clases especializadas que tambin ofrecen la base para la creacin de otros componentes Java que incluyen: Applets, Objetos CORBA, Fragmentos Auditivos, Soporte de Criptografa (Seguridad) y Manipulacin de XML entre otras funcionalidades. Aunado a las clases base, el JDK/J2SE incluye una serie de ejecutables utilizados para diversas tareas como: Creacin de ejecutables (Byte-Code), generacin de documentacin, creacin de "Stubs" y "Skeletons" a travs de IDL e inclusive una implementacin de un ORB ("Object Request Broker") para interactuar con ambientes CORBA, entre otros ejecutables.

Daniel Oliva Bianco 2009

Programacin Java Bsico

La estructura de directorios del JDK/J2SE es la siguiente:


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

Como se puede observar, la estructura se encuentra dividida en tres grandes partes:


bin : Incluye los ejecutables para la generacin de programas Java. lib : Contiene las libreras (Clases) base empleadas en la generacin de la gran

mayora de programas Java. jre : Incluye el ambiente necesario para ejecutar programas Java, el cual a su vez se encuentra sub-dividido en distintos directorios. Dependiendo de la manera en que haya instalado la documentacin del JDK, se recomienda observarla en estos momentos para que se familiarice con sus clases Base.

Daniel Oliva Bianco 2009

Programacin Java Bsico

Composicin, clases y Libreras ("Packages").


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 bsico. En base a su ambiente, abra un Editor de Textos para generar el siguiente ejemplo.

Cdigo Fuente Basico.java

public class Basico { public static void main(String args[]) { System.out.println("Un despliegue de Datos"); } }

Programa Java Introduccin Basico.java


La primer caracterstica de un programa Java es que este debe definir una clase que lleve por nombre el mismo nombre del archivo fuente, en este caso el archivo Basico.java debe incluir una definicin de una clase llamada Basico, ntese que ambos nombres coinciden en su sintaxis, esto es, ambos inician con letra mayscula lo cual es una convencin llevada a cabo para la definicin de clases. Para definir una clase se utiliza el vocablo class as como un calificador de acceso, en este caso se utiliza el calificador public, el uso y variacin de calificadores ser descrito posteriormente cuando se aborde el tema de libreras ("packages") donde es de influencia su uso. Dentro de la definicin de la clase se deben incluir los respectivos mtodos que podrn ser invocados. En el caso del programa Basico.java nicamente es definido el mtodo main, dicho mtodo es invocado por "default" al ejecutarse el programa (Clase). Ntese que el mtodo inicia con letra minscula, esta es otra convencin utilizada para diferenciarse de las distintas clases. La definicin del mtodo indica lo siguiente:

Primeramente se definen los calificadores del mtodo en este caso siendo public static Posteriormente se define el valor de retorno del mtodo: void, lo cual indica que no ser retornado ningn valor
9

Daniel Oliva Bianco 2009

Programacin Java Bsico


Le sigue el nombre del mtodo: main Dentro de parntesis se incluyen los parmetros de entrada para el mtodo (String args[]). Finalmente la clase/Mtodo System.out.println enva un mensaje a la pantalla

Mtodo principal main


El mtodo principal main de una clase Java es inalterable, es este sentido inalterable se refiere a sus caractersticas:

Siempre debe incluir los calificadores: public y static. Nunca puede retornar un valor como resultado, por ende, siempre debe indicar el valor void como retorno. Su parmetro de entrada siempre ser un arreglo de String's (String[]) el cual es tomado de la lnea de comandos o una fuente alterna.

Aunque no es un requerimiento definir el mtodo main dentro de toda clase Java, dicho mtodo representa el nico mecanismo automtico para realizar tareas al invocarse una clase, esto es, al momento de ejecutarse determinada clase siempre ser ejecutado todo el contenido dentro de dicho mtodo. Para generar una clase compilada (Byte-Code) se utiliza el comando javac :

$ javac Basico.java

Lo anterior genera un archivo llamado Basico.class; para ejecutar este Byte-Code es empleado el comando java:

$ java Basico

Al invocar el comando anterior ser ejecutada la clase Basico.class. Ntese que el comando java recibe el nombre de la clase sin la extensin .class.

Daniel Oliva Bianco 2009

10

Programacin Java Bsico

Libreras ("Packages") y JAR's.


Conforme empieza a crecer un desarrollo de Software surge la necesidad de reutilizar ciertos componentes que ya han sido escritos, as como dar cierta estructura para mantener una organizacin de cdigo; al igual que otros lenguajes, esta organizacin se lleva a cabo mediante libreras, denominadas "packages" en el mundo Java . Java toma una perspectiva nueva respecto a otros lenguajes, adoptando una convencin a partir de Dominios en Internet, esto es, nuestros programas y por ende libreras ("packages") estarn basados en el nombre de la empresa/dominio para la cual son diseados, lo anterior permite evitar la tan conocida Colisin de Nombres en Software. Esta Colisin 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/Librera sea nica, puesto que es una caracterstica de Dominios en Internet. Para que puedan ser asignadas clases a determinadas libreras es necesario indicar dicha Librera ("Package") en la definicin inicial de un programa, adems de esto, es necesario crear una estructura de directorios para generar las determinadas clases; lo anterior se ilustra mejor a travs de un ejemplo: En base a su ambiente, abra un Editor de Textos para generar el siguiente ejemplo.

Estructura de Directorios para utilizar Libreras ("Packages")


Para utilizar "Packages" en Java es necesario generar una estructura de directorios que lleven la misma secuencia de las libreras que desean disearse, observe:

+-com+| +-test +| +-escritura+| +-graficas+| +-correo+| +-errores+| +-auxiliares+-

Lo anterior demuestra una estructura para las libreras del dominio com.test , se debe mencionar que no existe ninguna restriccin en el nmero de directorios anidados, esto es, es posible que existan libreras de 5 o 10 niveles de profundidad, esta sub-clasificacin se
Daniel Oliva Bianco 2009 11

Programacin Java Bsico

va realizando en base a los requerimientos de las libreras y es dentro de cada sub-directorio donde son colocadas las distintas clases. Adems de la generacin de estos directorios, se debe incluir un calificador de la librera en el cdigo fuente de cada clase:
package com.test.escritura;

Lo anterior sera incluido en todos los programas pertenecientes a la librera ("Package") com.test .escritura, debe mencionarse que este calificador debe ser la primer declaracin en todo programa Java (Salvo no vaya a ser incluido en libreras); recuerde que adems de este calificador el programa debe estar colocado en la estructura de directorios correspondiente, lo anterior es sumamente importante al llevarse acabo la compilacin para la generacin de Byte-Code

Cdigo Fuente Pantalla.java


La siguiente clase define dos mtodos que pueden ser utilizados para imprimir resultados a pantalla: La siguiente clase debe ser colocada bajo la estructura de directorios com/test/escritura, en base a su ambiente (Linux o Windows) por favor genere dicha estructura para colocar esta clase
package com.test.escritura; public class Pantalla { public static void sinSalto(String s) { System.out.print(s); } public static void conSalto(String s) { System.out.println(s); } }

Primeramente se declara la librera ("package") a la que ser asignada el programa a travs del vocablo package. Se define la clase con los respectivos mtodos sinSalto y conSalto. NOTA: Recuerde que este programa debe residir dentro del directorio com/test/escritura/. NOTA 2: Observe que esta clase no posee el mtodo principal main.

Para compilar esta clase basta ejecutar el comando:


$ javac Pantalla.java

Daniel Oliva Bianco 2009

12

Programacin Java Bsico

Lo anterior genera el archivo de ByteCode: Pantalla.class. En la siguiente seccin ser diseado un programa que haga uso de esta librera ("package").

Utilizacin de Libreras ("Packages")


En base a su ambiente, abra un Editor de Textos para generar el siguiente ejemplo. Para emplear Libreras ("Packages") en un programa es necesario importarlas, esto es llevado a cabo mediante el calificativo import como se demuestra a continuacin:
import com.test.graficas.Recuadro;

La declaracin anterior permite que la clase Recuadro de la librera ("Package") com.test.graficas est disponible en el programa en cuestin, las caractersticas del uso de import son las siguientes:

Se debe declarar al inicio de un programa, antes de la definicin de la clase, aunque posterior a la definicin de package (si existiese) . Se pueden utilizar un nmero ilimitado de import. Es posible importar todas las clases de una librera a travs de un asterisco (*).

Cdigo Fuente MandaPantalla.java


La siguiente clase manda llamar mtodos definidos en la clase Pantalla.java. La siguiente clase debe ser colocada bajo la estructura de directorios com/test/auxiliares, en base a su ambiente (Linux o Windows) por favor genere dicha estructura para colocar esta clase
package com.test.auxiliares; import com.test.escritura.*; public class MandaPantalla { public static void main(String args[]) { Pantalla primera = new Pantalla(); primera.conSalto("Esto es un renglon CON salto de linea"); primera.conSalto("Esta linea tambien tiene salto"); primera.sinSalto("Lnea Continua"); primera.sinSalto("Lnea Continua"); primera.conSalto("Esta lnea si tiene salto!"); primera.sinSalto("Termina sin salto"); System.out.println(" Se termina el uso de funciones"); } }

Primeramente se declara la librera ("package") a la que ser asignada el programa a travs del vocablo package.
13

Daniel Oliva Bianco 2009

Programacin Java Bsico


Posteriormente se importan las clases que sern utilizadas en el programa a travs del vocablo import. Se define el mtodo main dentro del cual se genera una instancia de la clase Pantalla (aquella importada) y sobre la que posteriormente se mandan llamar los distintos mtodos a travs de su referencia.

La compilacin (Generacin de Byte-Code) de esta clase requiere que esta sea llevada a cabo bajo el directorio raz de la estructura de clases, esto es, aunque esta clase radique dentro del directorio com/test/auxiliares es necesario llevar a cabo la compilacin desde la raz (./com), lo anterior se debe a que esta clase requiere ubicar (importar) las clases de la Librera ("Package") com/test/escritura; los detalles de esta rutina sern descritos en la seccin de CLASSPATH.

Para ejecutar este programa tambin se requiere descender al directorio raz de la librera ("Package"), razn que tambin est relacionada con la variable CLASSPATH y ser descrita a fondo en su seccin.

Daniel Oliva Bianco 2009

14

Programacin Java Bsico

Archivos JAR ("Java Archives")


Una vez acumuladas un nmero substancial de clases en una Librera("Package") ser necesario colocarlas en una estructura que permita una distribucin fcil y prctica, esto es, si ha generado 100 o 500 clases sera muy imprctico distribuir la estructura de directorios a un tercero para ser utilizada, para este problema han sido diseados los archivos JAR ("Java Archives"). Una archivo JAR es simplemente un archivo comprimido que incluye una estructura de directorios con clases, lo anterior permite:

Distribuir/Utilizar clases de una manera eficiente a travs de un solo archivo. Declarar dichas clases de una manera ms eficiente en la variable CLASSPATH.

Generacin de Archivo JAR


Para generar un archivo JAR es necesario colocarse bajo el directorio raz de la estructura de directorios donde residen las clases:
$ jar cvf test .jar *

Al ejecutar el comando anterior se genera una archivo JAR llamado test .jar con todos los archivos .class que residen en la estructura de directorios.

Observar contenido de Archivo JAR


Para observar el contenido de un archivo JAR, se utiliza un comando similar:
$ jar tvf test .jar

El comando anterior despliega el contenido del archivo JAR test .jar; NOTA: Este comando nicamente despliega el contenido.

Extraccin de Archivo JAR


En ocasiones es conveniente extraer el contenido de un archivo JAR para llevar acabo modificaciones, esto se realiza a travs del siguiente comando:
$ jar xvf test .jar

El comando anterior genera una estructura de directorios con el contenido del archivo JAR test .jar. En la siguiente seccin se describe como son utilizados estos archivos JAR en la compilacin/ejecucin de programas Java.

Daniel Oliva Bianco 2009

15

Programacin Java Bsico

La Variable CLASSPATH.
Al utilizar clases y Libreras en ambientes Java surge otro tema en lo que concierne a su ubicacin: Cuales clases/Libreras estn disponibles al momento de Compilar/Ejecutar programas Java? , la respuesta a esta pregunta es la conocida variable CLASSPATH. A travs de esta variable se indica donde residen las clases/Libreras ("Packages") de nuestro ambiente, en ella se definen los directorios base de clases as como cualquier archivo JAR que requiera ser cargado al compilar/ejecutar programas Java. 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.

Observando la Variable de Entorno CLASSPATH


Para observar la variable CLASSPATH en un ambiente Unix/Linux se utiliza el siguiente comando:
$ set | egrep CLASSPATH CLASSPATH=/usr/local/jdk/lib/tools.jar:/root/mislibrerias/:.:

Para observar la variable CLASSPATH en un ambiente Windows NT/2000/XP se utiliza el siguiente comando:
Seleccione: Start- Settings -Control Panel y el icono System. En Windows NT: Seleccione el Tab Environment En Windows 2000/XP : Seleccione el Tab Advanced Posteriormente entre en Variables de Entorno ("Environment Variables"). Localize "CLASSPATH" en las variables del usuario ("User Variables") y variables de Sistema ("System Variables").

Como se puede observar en el despliegue anterior, los valores de la variable CLASSPATH se encuentran separados por dos puntos (:) [ o punto y coma (;) para Windows], el valor de CLASSPATH declarado anteriormente significa:

El archivo JAR llamado tools.jar bajo el directorio /usr/local/jdk/lib estar accesible al compilar/ejecutar programas Java. Las estructuras de directorios ubicados bajo /root/mislibrerias tambin sern localizadas al invocar el JVM ("Java Virtual Machine"). Finalmente la ltima declaracin en CLASSPATH (:.:) indica que toda estructura de directorios residente en el directorio actual de compilacin/ejecucin ser accesible.

Daniel Oliva Bianco 2009

16

Programacin Java Bsico

Modificar la Variable Ambiental CLASSPATH

Para modificar el valor de la variable ambiental CLASSPATH en un sistema Unix/Linux se utilizara el siguiente comando:

$ export CLASSPATH=/root/test .jar:$CLASSPATH

Para modificar el valor de la variable ambiental CLASSPATH en un sistema Windows NT/2000/XP se utilizara el siguiente comando:

C:> set CLASSPATH=C:\test .jar;%CLASSPATH%;.;

El comando anterior modifica el valor de la variable CLASSPATH agregando el archivo JAR (test .jar), el termino $CLASSPATH (%CLASSPATH% en Windows) indica el valor previo de la variable, lo cual permite mantener los valores preexistentes. Cabe mencionar que al modificar la variable CLASSPATH de esta manera, ser nicamente el Shell existente el cual reflejar estos cambios, esto es, si usted posee otros programas que hacen uso de Java ser necesario modificar el valor de CLASSPATH al nivel de sistema, lo anterior en Sistemas Unix se hace modificando el archivo /etc/profile o el perfil del usuario ~/.bashrc, de la siguiente manera:
CLASSPATH="/usr/local/mislibrerias" export CLASSPATH

La modificacin de la variable CLASSPATH a nivel de sistema para ambientes Windows es llevada a cabo de la siguiente manera:

Seleccione: Start- Settings -Control Panel y el icono System. En Windows NT: Seleccione el Tab Environment En Windows 2000/XP : Seleccione el Tab Advanced Posteriormente entre en Variables de Entorno ("Environment Variables"). Localize o genere la variable "CLASSPATH" en variables de Sistema ("System Variables").

Daniel Oliva Bianco 2009

17

Programacin Java Bsico

Utilizando la variable CLASSPATH al invocarse comando.

java

javac

y otro

En ocasiones es necesario cargar/ubicar ciertas libreras ("packages")/clases que solo sern utilizadas ocasionalmente, por lo que modificar la variable CLASSPATH al nivel de ambiente sera innecesario, para esto pueden ser pasados parmetros al tiempo de invocar los comandos java o javac:
$ javac [Linux] -classpath "$CLASSPATH:.:/lib/postgresql.jar" Conexion.java

C:> javac [Windows]

-classpath

"%CLASSPATH%;C:\test o

.jar;.;

Conexion.java

$ javac -cp "$CLASSPATH:.:/lib/postgresql.jar" Conexion.java [Linux] C:> javac -cp "%CLASSPATH%;C:\test .jar;.; Conexion.java [Windows]

A travs del flag classpath o cp se indica que al momento de llevarse acabo la compilacin de la clase Conexion.java, sea cargado el archivo JAR postgresql.jar adems del valor actual ($CLASSPATH en Linux o %CLASSPATH% en Windows) de la variable ambiental CLASSPATH. Este mismo mecanismo puede ser utilizado para los diversos comandos Java, lo cual permite ubicar/cargar libreras ("packages")/Clases al momento de ejecucin.

Daniel Oliva Bianco 2009

18

Programacin Java Bsico

Calificadores de acceso: Public, Private, Protected, Static y Final.


El uso de calificadores de acceso en Java tiene sus bases en el uso de libreras ("packages"), al ser diseado un programa existen diversas funciones/mtodos y variables dentro de ste, algunas de estas requerirn ser modificadas conforme incrementen las necesidades del programa, mientras otras permanecern inmviles, la importancia de estos cambios requiere que sean utilizados calificadores para permitir/negar el acceso a ciertos segmentos del programa, analicemos el siguiente caso: Usted ya diseo 300 clases que estn siendo re-utilizadas por otros programas, sin embargo, se le ha solicitado una modificacin radical a estos objetos base, cuales mtodos/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, adems de los calificadores de acceso que permiten restringir el uso de mtodos/campos a determinadas situaciones, tambin existen otros calificadores que afectan directamente la creacin y uso de instancias por clase estos calificadores son static y final.

public: Acceso libre .


El uso del calificador public significa que toda definicin ser accesible de cualquier punto, ya sea un mtodo, campo o clase. Su uso implica un acceso global, desde luego el uso de este calificativo en clases que sern modificadas constantemente es fuertemente desalentado, ya que puede quebrantar dependencias forjadas en versiones previas.

private: Solo en la misma clase .


El calificador private indica que dicho componente ser accesible nicamente dentro de la clase en cuestin, si se intenta acceder cualquier elemento de este tipo dentro de otra clase ser generado un error de compilacin. El calificador private suele utilizarse en clases que sern modificadas continuamente, esto permite evitar futuros quebrantos en otras clases como fue mencionado al inicio.

protected: clases Heredadas y misma clase.


El uso de protected es utilizado bajo los conceptos de Herencias ("Inheritance"), aunque este tema ser descrito en otra seccin, mediante protected es posible acceder a elementos de la clase heredada ("Inherited"), excepto a aquellos que utilicen el calificador private. En otras palabras, si determinada clase hijo hereda el comportamiento de una clase padre, la clase hijo tendr acceso a todos aquellos campos/mtodos definidos como protected en padre, pero no aquellos declarados como private en padre.

Daniel Oliva Bianco 2009

19

Programacin Java Bsico

Ningn Calificador: clase en Librera y misma clase .


Finalmente, cuando no es empleado ninguno de los calificadores de acceso mencionados anteriormente los elementos son considerados amigables, esto implica que todo campo/mtodo carente de calificador ser accesible dentro de todas clases pertenecientes a su misma librera ("package").

static: Una sola instancia .


El uso del vocablo static ha venido siendo utilizado en los mtodos principales (main) de los programas escritos anteriormente, su uso est relacionado directamente al uso de instancias en clases; en ocasiones es necesario o conveniente generar elementos que tomen un mismo valor para cualquier nmero de instancias generadas o bien invocar/llamar mtodos 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 descripcin anterior esta trivializada, sin embargo, conforme se avance en el presente curso sern ilustrados otros ejemplos con este mecanismo. La segunda situacin para el uso de static puede ser ejemplificada perfectamente a travs del mtodo main Java, el mtodo main puede ser llamado automticamente al invocarse la respectiva clase debido a que no se encuentra asociado con ningn tipo de instancia, esto implica que su comportamiento siempre ser el mismo independientemente de la instancia que realza su llamada. Dos aspectos caractersticos de utilizar el calificador static en un elemento Java son los siguientes:

No puede ser generada ninguna instancia (Uso de new) de un elemento static puesto que solo existe una instancia. Todos los elementos definidos dentro de una estructura static deben ser static ellos mismos, o bien, poseer una instancia ya definida para poder ser invocados. NOTA: Lo anterior no implica que no puedan ser generadas instancias dentro de un elemento static; no es lo mismo llamar/invocar que crear/generar.

La teora del concepto static puede ser un poco difcil de digerir, sin embargo, como fue mencionado anteriormente, conforme avance el curso sern descritos diversos fragmentos de cdigo para dejar en claro su uso.

Daniel Oliva Bianco 2009

20

Programacin Java Bsico

final: Una sola instancia y definitiva.


El calificador final estrechamente relacionado con el uso de static implica una asignacin nica y definitiva al elemento de una clase. A diferencia de static que implica una sola instancia, el trmino final lleva dicha instancia a una definicin nica y como su nombre lo implica final. Generalmente final es utilizado en aquellos elementos que no sern modificados al momento de ejecutarse ("Run-Time") un programa o clase , a travs de final se asigna un valor que no podr ser modificado bajo ninguna circunstancia al momento de ejecucin ("Run-Time), en efecto logrando un nivel de eficiencia en ejecucin. De igual manera que la utilizacin de static el uso de final ser ilustrado conforme se avance en este curso.

Daniel Oliva Bianco 2009

21

Programacin Java Bsico

Variables, Constructores, Mtodos y Comentarios.


Objetos y Primitivos.
Al disear sus primeros programas en Java, pudo notar que todo gira alrededor de instancias de Objetos que son manipuladas a travs de referencias:
Lampara candil = new Lampara(); candil.prender();

Al utilizar referencias en Java estas pueden ser inicializadas sin que pertenezcan a ninguna instancia de Objeto:
String let;

La declaracin anterior genera una referencia, sin embargo, esta no es asociada con ninguna instancia de Objeto, para llevar a cabo este proceso es necesario utilizar el vocablo new.
String let = new String("Algo sencillo")

La declaracin 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 a cabo a travs de mtodos denominados constructores los cuales sern descritos posteriormente. El hecho de generar instancias de objetos es un proceso involucrado (hablando en trminos computacionales ms no en sintaxis) , es por esto que Java ofrece un mecanismo simple para definir estructuras de datos como alternativa a utilizar clases/Objetos, dichas estructuras son conocidas como primitivos. Aunque estrictamente hablando un primitivo no es una clase a travs de un primitivo se facilita el uso de valores comnmente utilizados en lenguajes de programacin, donde el generar una instancia de clase resultara en un proceso tardado y mecnico.

Daniel Oliva Bianco 2009

22

Programacin Java Bsico

En la siguiente tabla se describen los diversos primitivos disponibles en el lenguaje Java:


Tipo Primitivo boolean char byte short int long float double void de Tamao 16-bit 8-bit 16-bit 32-bit 64-bit 32-bit 64-bit Valor Mnimo Unicode 0 -128 -215 -231 -263 IEEE754 IEEE754 Valor Mximo Unicode 216- 1 +127 +215-1 +231-1 +263-1 IEEE754 IEEE754 Valor Default false `\u0000' (null) (byte) 0 (short) 0 0 0L 0.0f 0.0d "Wrapper" Boolean Character Byte Short Integer Long Float Double Void

Ntese que estos primitivos inician con letra minscula, 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);

La primer lnea genera un primitivo el cual es asignado a la variable c, posteriormente se genera una instancia de la clase Character (Ntese el uso del vocablo new); el uso de "Wrappers" (Objetos) para primitivos es empleado bajo ciertas circunstancias, sin embargo, vale mencionar que existen diversos mecanismos para convertir de clases tipo Objeto ("Wrappers") a primitivos y viceversa.

Daniel Oliva Bianco 2009

23

Programacin Java Bsico

Campos ("Fields") y Mtodos.


Cuando se define una clase esta puede contener dos tipos de elementos: Campos ("Fields") o Mtodos, los mtodos 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 base a su ambiente, abra un Editor de Textos para generar el siguiente ejemplo.

Cdigo Fuente Automoviles.java


public class Automoviles { int cantidad; boolean doble_traccion; public static void main(String args[]) { Automoviles ford = new Automoviles(); ford.cantidad = 3; Automoviles vw = new Automoviles(); vw.cantidad = 2; Automoviles jeep = new Automoviles(); jeep.doble_traccion = true; System.out.println("Autos Ford: " + ford.cantidad + " Doble Traccion: " + ford.doble_traccion); System.out.println("Autos Volkswagen: " + vw.cantidad + " Doble Traccion: " + vw.doble_traccion); System.out.println("Autos Jeep: " + jeep.cantidad + " Doble Traccion: " + jeep.doble_traccion); } }

Clase Automoviles

Como en todo programa Java, primeramente se define la clase a travs del vocablo class. Inmediatamente despus son definidos dos campos ("fields") dentro de la clase, en este caso primitivos; al ser definidos los campos al nivel de clase (y no dentro de un mtodo como el ejemplo anterior) se garantiza que los campos puedan ser manipulados de cualquier mtodo de la clase. Se define el mtodo principal main y dentro de este se generan tres instancias de la clase; ntese que a travs de las referencias de cada instancia son manipulados los valores de los campos ("fields"). Posteriormente, se imprimen a pantalla los valores de las diversas instancias con sus respectivos campos("fields"); ntese que aquellas instancias que no asignaron valores a sus campos("fields"), reciben un valor "default" (primitivos)

En Java existen ciertos campos que son definidos como final, y aunque dicho calificativo puede ser empleado en mtodos y clases su uso ms comn es en campos, su significado
Daniel Oliva Bianco 2009 24

Programacin Java Bsico

puede ser descrito con las siguientes palabras: "No puede cambiar"; las razones por las que es utilizado final pueden ser: Eficiencia o Diseo. Al utilizarse final en variables (primitivos) estas toman un valor constante al llevarse acabo la compilacin, lo anterior permite mayor eficiencia al momento de ejecutarse un programa ("Run-Time"), ahora bien, cuando es utilizado final en referencias de Objetos se restringe que dicha referencia sea utilizada para apuntar hacia otro Objeto, esto permite realizar un diseo que prohbe a la referencia ser re-asignada, el uso del vocablo final ser explorado en otra seccin de este curso. En ciertos mtodos es utilizado el vocablo return que permite indicar el valor de retorno para un mtodo:

Cdigo Fuente Fecha.java


import java.util.*; public class Fecha { public Date hoy() { Date a = new Date(); return a; } public static void main(String[] args) { Fecha tiempo = new Fecha(); System.out.println(tiempo.hoy()); } }

Clase Fecha

Se importan las clases de la librera java.util.*, donde se encuentra la clase Date empleada para manipular fechas en Java. Como en todo programa Java, se define la clase a travs del vocablo class. Es definido un mtodo llamado hoy que retorna la fecha actual mediante un Objeto Date. Se define el mtodo principal main y dentro de este se genera una instancia de la clase, mandndose llamar el mtodo hoy.

Significado de return
El uso del vocablo return no es obligatorio en la gran mayora de mtodos definidos en Java, sin embargo, tiene dos usos principales:

Primeramente es una manera de indicar que el mtodo en cuestin ha terminado.

Daniel Oliva Bianco 2009

25

Programacin Java Bsico

Cuando en determinado mtodo se manipula ms de una instancia/primitivo del mismo tipo que ser retornado, se emplea el vocablo return para evitar ambigedad.

Constructores
Un Constructor es un mtodo especial en Java empleado para inicializar valores en Instancias de Objetos, a travs de este tipo de mtodos es posible generar diversos tipos de instancias para la clase en cuestin; la principal caracterstica de este tipo de mtodos es que llevan el mismo nombre de la clase, a continuacin se describen varios ejemplos utilizando constructores:

Cdigo Fuente Arboles.java.


public class Arboles {

public Arboles() { System.out.println("Un rbol genrico"); } public Arboles(String tipo) { System.out.println("Un rbol tipo " + tipo); } public Arboles(int altura) { System.out.println("Un rbol de " + altura + " metros"); } public Arboles(int altura,String tipo) { System.out.println("Un " + tipo + " de " + altura + " metros"); } public static void Arboles arbol1 Arboles arbol2 Arboles arbol3 Arboles arbol4 } } main(String args[]) { = new Arboles(4); = new Arboles("Roble"); = new Arboles(); = new Arboles(5,"Pino");

Clase Arboles

Como en todo programa Java, primeramente se define la clase a travs del vocablo class. Posteriormente son definidos 4 Constructores; ntese que cada uno recibe el mismo nombre de la clase y posee distintos argumentos de entrada. Dentro del mtodo principal (main) son generadas cuatro instancias de la clase, como se puede observar, al ser generada la instancia a travs del vocablo new se pasa un parmetro, y es dependiendo de este parmetro que es llamado el
26

Daniel Oliva Bianco 2009

Programacin Java Bsico

Constructor correspondiente, el cual a su vez invoca la clase System.out.println que imprime a pantalla.

Constructor Obligatorio
En los ejemplos anteriores del curso se pudo notar que no se hizo uso de Constructor alguno, y la razn es que el compilador lleva a cabo esta definicin de Constructor vaco detrs de los escenarios, sin embargo, existe una situacin en la que es necesario definir un Constructor vaco y esta es cuando se hace uso de otros constructores. Lo anterior significa que si el compilador observa un mtodo con el mismo nombre de la clase con argumentos (Constructor), deber existir un mtodo vaco por el mismo nombre, esto de cierta manera salvaguarda a un programador al momento de definir mtodos que no vayan a ser definidos errneamente como Constructores.

Mtodos y Parmetros por Referencia


Cuando son utilizados Constructores puede surgir la necesidad de inicializar algn campo perteneciente a la clase, esto trae consigo otro detalle en lo que concierne la asignacin de valores dentro de un mtodo, la razn se debe a que dentro de un mtodo puede surgir el requerimiento de acceder campos definidos en la clase, observe:

public Class Cableado { int longitud; String tipo; public Cableado(String tipo, int longitud) this.tipo = tipo this.longitud = longitud; } .... .... } {

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 parmetros de entrada los mismos valores, para tener acceso a los campos de la clase se utiliza el vocablo: this, al emplear esta sintaxis se est haciendo alusin a los campos de la clase. Aunque sera 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).

Daniel Oliva Bianco 2009

27

Programacin Java Bsico

Generacin de Documentacin (Va Comentarios)


En muchos lenguajes el mantener documentacin acerca de las clases/Mtodos escritos es una tarea que requiere un esfuerzo adicional, ya que por una parte debe mantenerse el cdigo funcional mientras se debe generar documentacin acerca de la funciones; en muchas ocasiones esta documentacin ni existe, en Java la generacin de Documentacin es llevada en conjuncin del cdigo a travs de comentarios. A travs de comentarios colocados en cada clase/Mtodo es posible generar documentacin de una manera inmediata y concisa en formato de documentos HTML / XHTML, a continuacin se describe un ejemplo:

Comentarios en Java
Primeramente vale hacer mencionar los tipos de comentarios utilizados en Java, existen dos tipos de comentarios puros como tal:

/* Este es un comentario que expande diversas lineas, sin embargo, este no ser incluido en la documentacin */ // // Este es un comentario de linea nicamente Tampoco ser incluido en la documentacin

Los dos tipos de comentarios anteriores son utilizados como gua dentro del cdigo fuente, esto es, a partir de ellos no son generados ningn tipo de documentacin, cualquier palabra entre /* y */ es considerada comentario, al igual que todo rengln que inicie con //. Para que un comentario sea contemplado en la generacin de documentacin se utiliza la siguiente sintaxis

/** Un comentario para clase */ public class pruebaDocs { /** Un comentario para Variables public int i; /** A comentario para mtodo */ public void f() {} }

*/

Todo elemento colocado entre los elementos /** */ ser contemplado en la generacin de documentacin, dependiendo de la ubicacin de este comentario ser generada la

Daniel Oliva Bianco 2009

28

Programacin Java Bsico

documentacin, esto es, si aparece antes de un elemento class es considerado documentacin para la clase y as sucesivamente. Existe otra sintaxis especfica para definir los elementos dentro de los comentarios, la cual se ilustra a continuacin:

import java.util.*; /** * Programa que Despliega la Fecha. * @author Juan Sanchez * @author jsanchez@test .com * @version 1.7 */ public class PruebaFecha { /** Punto de Entrada nico para clase * @param args Arreglo de String's * @return Sin valor de retorno * @exception exceptions Ningn error (Excepcin) definida */ public static void main(String[] args) { System.out.println("Hoy es: "); System.out.println(new Date()); } }

Los elementos que inician con el smbolo @ son utilizados para indicar parmetros especficos dentro de la documentacin; los anteriores son algunos elementos que pueden ser utilizados al definir documentacin. En la siguiente seccin sern ilustrados otros elementos @, as como el proceso para generar la documentacin HTML / XHTML del cdigo fuente Java.

Otros parmetros (@) para Comentarios en Java


Los siguientes parmetros tambin son utilizados al generar documentacin para cdigo Java: Elemento Uso

@see <Nombre Elemento utilizado para hacer referencia a otras clases, de la clase> genera un link HTML / XHTML hacia la clase en cuestin. @throws Empleado para indicar la clase utilizada al generarse un <Nombre de la Error. La definicin de clases para Errores ser descrita en clase> otra seccin. @deprecated Este parmetro es utilizado para indicar que una clase ha sido repuesta por otra ms reciente; al ser indicado este

Daniel Oliva Bianco 2009

29

Programacin Java Bsico

parmetro en una clase/Mtodo el compilador (javac ) generar un aviso, indicando que la clase/Mtodo ha sido repuesta. Adems de los parmetros anteriores tambin es posible escribir lenguaje HTML / XHTML entre los elementos /** */ , lo anterior permite generar listas enumeradas, dar mayor estilo a la documentacin y cualquier otro formato disponible en HTML / XHTML . A continuacin se ilustran dos clases escritas anteriormente, con los respectivos comentarios para generar documentacin: Clase Pantalla.java
package com.test .escritura; /** * Programa con mtodos auxiliares para salto de linea * y linea continua * @author Juan Sanchez * @author jsanchez@test .com * @version 1.3 */ public class Pantalla { /** Mtodo para linea continua * @params Un String * @return Sin valor de retorno * @exception exceptions Ningn error (Excepcin) definida */ public static void sinSalto(String s) { System.out.print(s); } /** Mtodo para salto de linea * @params Un String * @return Sin valor de retorno * @exception exceptions Ningn error (Excepcin) definida */ public static void conSalto(String s) { System.out.println(s); } }

Clase MandaPantalla.java
package com.test .auxiliares; import com.test .escritura.*; /** * Programa para demostracin de import en la clase * @author Juan Sanchez

Daniel Oliva Bianco 2009

30

Programacin Java Bsico


* @author jsanchez@test .com * @version 1.6 * @see com.test .escritura.Pantalla */ public class MandaPantalla { /** Punto de Entrada nico para clase * <ul> * <li>Utiliza mtodo sinsalto * <li>Utiliza mtodo consalto * </ul> * @param args Arreglo de String's * @return Sin valor de retorno * @exception exceptions Ningun error (Excepcin) definida */ public static void main(String args[]) { Pantalla primera = new Pantalla(); primera.conSalto("Esto es un rengln CON salto de linea"); primera.conSalto("Esta linea tambin tiene salto"); primera.sinSalto("Linea Continua"); primera.sinSalto("Linea Continua"); primera.conSalto("Esta linea si tiene salto!"); primera.sinSalto("Termina sin salto"); System.out.println(" Se termina el uso de funciones"); } }

Generacin de Documentacin
El comando javadoc posee una gran cantidad de parmetros para generar documentacin, a continuacin se describe su uso ms bsico:

$ mkdir docs $ javadoc -d docs/ -version -author -use *.java com/test /escritura/*.java com/test /auxiliares/*.java

El primer paso antes de generar cualquier documentacin Java es crear un directorio donde residir la documentacin, en este caso se ha generado un directorio llamado docs. Posteriormente es invocado el comando javadoc con los siguiente parmetros: o -d docs: Indica el directorio donde ser depositada la documentacin (docs). o -version: Implica que al ser generada la documentacin sea desplegado el nmero de versin, de ser definido en la clase. o -author: En caso de ser definido el parmetro autor, este aparecer en la documentacin. o -use: Es el parmetro utilizado para indicar los directorios donde residen las clases sobre las que ser generada la documentacin, en este caso se est indicando el directorio presente (*.java) y los directorios com/test /escritura y com/test /auxiliares.
31

Daniel Oliva Bianco 2009

Programacin Java Bsico

Al terminar este proceso ser generada la documentacin de las distintas clases dentro del directorio docs; para observar otros parmetros que puede tomar el comando javadoc basta ejecutar: javadoc -help.

Daniel Oliva Bianco 2009

32

Programacin Java Bsico

Herencia, Interfaces y Polimorfismo


Herencia ("Inheritance")
Uno de las partes medulares en un lenguaje orientado a Objetos es el uso de Herencias ("Inheritance") , el cual permite reutilizar clases existentes con todas las funcionalidades/comportamientos ya diseadas en ellas; en Herencias el trmino reutilizable toma otro sentido al utilizado en la secciones anteriores al importarse clases (import), uno ms complejo y poderoso, observe:

El primer diagrama UML ("Universal Markup Language") muestra 3 clases (Guitarra, Piano, Saxofn) que heredan de una clase Base (Instrumento),mientras el segundo diagrama muestra 2 clases (Circulo, Triangulo) que heredan de una clase Base (Figura); este mecanismo permite que nuevas clases hereden el comportamiento de una clase Base ya depurada y funcional, en el proceso teniendo acceso a los mtodos/campos ya creados con anterioridad ; a continuacin se describe un ejemplo que hace uso de herencia:

Cdigo Fuente MiniComponente.java


class Radio { private String r = new String("Radio: "); public void agrega(String a) { r += a; } public void imprimir() { System.out.println(r); } public void frecuencia() { agrega(" frecuencia() "); } public void volumen() { agrega(" volumen() "); } public void modelo() { agrega(" modelo() "); } public static void main(String[] args) {

Daniel Oliva Bianco 2009

33

Programacin Java Bsico


Radio x = new Radio(); x.frecuencia() ; x.volumen(); x.modelo(); x.imprimir(); } } public class MiniComponente extends Radio { // Cambiar el metodo ("Override") public void volumen() { agrega( " MiniComponente.volumen() "); super.volumen(); // Llamar la version de la clase Base } // Agregar metodo public void equalizador() { agrega(" equalizador() "); } public static void main(String[] args) { MiniComponente x = new MiniComponente(); x.frecuencia(); x.volumen(); x.modelo(); x.equalizador(); x.imprimir(); System.out.println("Probar la clase Base: "); Radio.main(args); } }

Definicin de Dos clases y Herencias ("Inheritance").


Como se puede observar, han sido definidas dos clases en el mismo archivo fuente llamado MiniComponente.java, el hecho que existan dos clases en el mismo archivo fuente no influye en ningn factor, en este caso se opto por dicho diseo debido a razones didcticas, aunque bien se pudo haber realizado el diseo de este manera por razones administrativas, de cualquier manera, ntese que se sigue cumpliendo la caracterstica de una clase Java: debe ser definida al menos una clase con el mismo nombre del archivo fuente. Entrando al problema espacial ("real"), es posible afirmar que todo MiniComponente incluye un Radio (AM/FM) entre sus dispositivos, debido a esto se ha decidido reutilizar (Heredar) el comportamiento de una clase Base de Radio, a continuacin se describe la clase Radio.

Clase Radio.

Como cualquier clase Java se utiliza el vocablo class, sin embargo, no se utiliza ningn calificador de acceso, por lo que esta clase solo ser accesible internamente (O al paquete "package" si fuera incluida en alguno);esto es lo que se refiere como acceso amigable, descrito en la seccin de Calificadores. Se define un campo tipo String con la referencia r, el cual es asignado un valor inicial de "Radio: ".
34

Daniel Oliva Bianco 2009

Programacin Java Bsico

El primer mtodo llamado agrega, toma como valor de entrada un String y su funcin es concatenar diversos String's, ntese que se utiliza el operador +=; a travs de este operador es posible concatenar diversos elementos, en esta definicin se est declarando que el String de entrada (a) debe ser concatenado con el String r el cual es el campo definido en la clase. Los mtodos frecuencia, volumen y modelo hacen uso del mtodo agrega concatenando distintos valores. Finalmente el mtodo imprimir hace uso de la clase System.out.println para enviar a pantalla el valor del String r (el campo de la clase). En el mtodo principal ( main ) se genera una instancia de la clase Radio, posteriormente a travs de la respectiva referencia se mandan llamar los distintos mtodos de la clase.

Una vez compilado el cdigo fuente, es posible ejecutar la clase Radio a travs del comando java Radio y observar los resultados iniciales.

Clase MiniComponente.

Al definir esta clase se utiliza el vocablo extends que implica Herencia ("Inheritance"), seguido de ste se indica la clase que ser heredada ("Inherited"), en este caso Radio. El primer mtodo definido se llama volumen, ntese que en la clase Radio tambin existe un mtodo con este nombre, dentro de esta clase se est modificando el comportamiento de dicho mtodo, esto es conocido como override en lenguajes orientados a Objetos. Dentro de este mismo mtodo, inicialmente se hace una llamada al mtodo agrega, si observa el resto de la composicin de esta clase notar que no existe ninguno por este nombre, sin embargo, dentro de la clase Base existe dicho mtodo, en este caso se est haciendo uso de los mtodos de la clase Base. La segunda llamada en este mtodo es: super.volumen, el vocablo super indica una llamada hacia la clase Base (Radio), a travs de esta lnea se est realizando una llamada hacia el mtodo volumen definido en Radio; el vocablo super es utilizado en los casos donde surge una ambigedad de nombres entre la clase heredada y base. Se define un mtodo nuevo llamado equalizador, que tambin hace uso del mtodo agrega. Dentro del mtodo principal main se genera una instancia de la clase MiniComponente, seguido de diversas llamadas a distintos mtodos, ntese que aquellos no definidos dentro de la clase, son llamados con la implementacin de la clase Base. En el ltimo paso del mtodo main se realiza una llamada hacia el otro mtodo main definido en la clase Radio.

Una vez compilado el cdigo fuente, es posible ejecutar la clase MiniComponente a travs del comando java MiniComponente y observar los resultados iniciales as como las variaciones de comportamiento en la clase Radio.
Daniel Oliva Bianco 2009 35

Programacin Java Bsico

El uso de Herencias es ampliamente utilizado en diseos Java, inclusive las clases Base del JDK lo utilizan extensamente, si observa la documentacin 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.

Polimorfismo
El concepto de Polimorfismo es uno de los fundamentos para cualquier lenguaje orientado a Objetos, las mismas races de la palabra pueden ser una fuerte pista de su significado: Poli = Multiple, morfismo= Formas, esto implica que un mismo Objeto puede tomar diversas formas. A travs del concepto de Herencias ("Inheritance") es posible ilustrar este comportamiento:

El poder manipular un Objeto como si ste fuera de un tipo genrico otorga mayor flexibilidad al momento de programar con Objetos, el trmino Polimorfismo tambin es asociado con un concepto llamado Late-Binding (Ligamiento Tardo), observe el siguiente fragmento de cdigo:
Figura a = new Circulo(); Figura b = new Triangulo();

Inicialmente se puede pensar que este cdigo generara 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 ms completo:

Daniel Oliva Bianco 2009

36

Programacin Java Bsico

Cdigo Fuente Musica.java


import java.util.*; class Instrumento { public void tocar() { System.out.println("Instrumento.tocar()"); } public String tipo() { return "Instrumento"; } public void afinar() {} } class Guitarra extends Instrumento { public void tocar() { System.out.println("Guitarra.tocar()"); } public String tipo() { return "Guitarra"; } public void afinar() {} } class Piano extends Instrumento { public void tocar() { System.out.println("Piano.tocar()"); } public String tipo() { return "Piano"; } public void afinar() {} } class Saxofon extends Instrumento { public void tocar() { System.out.println("Saxofon.tocar()"); } public String tipo() { return "Saxofon"; } public void afinar() {} } // Un tipo de Guitarra class Guzla extends Guitarra { public void tocar() { System.out.println("Guzla.tocar()"); } public void afinar() { System.out.println("Guzla.afinar()"); } } // Un tipo de Guitarra class Ukelele extends Guitarra { public void tocar() { System.out.println("Ukelele.tocar()"); } public String tipo() { return "Ukelele"; } }

Daniel Oliva Bianco 2009

37

Programacin Java Bsico


public class Musica { // No importa el tipo de Instrumento, // seguir funcionando debido a Polimorfismo: static void afinar(Instrumento i) { // ... i.tocar(); } static void afinarTodo(Instrumento[] e) { for(int i = 0; i < e.length; i++) afinar(e[i]); }

public static void main(String[] args) { Instrumento[] orquesta = new Instrumento[5]; int i = 0; // Up-casting al asignarse el Arreglo orquesta[i++] = new Guitarra(); orquesta[i++] = new Piano(); orquesta[i++] = new Saxofon(); orquesta[i++] = new Guzla(); orquesta[i++] = new Ukelele(); afinarTodo(orquesta); } }

Clase Musica
En el cdigo fuente de Musica.java son diseadas diversas clases que demuestran el uso de Polimorfismo:
Instrumento: Es utilizada como la clase Base para el resto de clases y en ella son definidos tres mtodos: tocar,tipo y afinar. Guitarra: Hereda ("Inherit") de la clase Instrumento y redefine ("Override") los

mtodos de sta. Piano: Hereda ("Inherit") de la clase Instrumento y redefine ("Override") los mtodos de sta. Saxofon: Hereda ("Inherit") de la clase Instrumento y redefine ("Override") los mtodos de sta. Guzla: Hereda ("Inherit") de la clase Guitarra y redefine ("Override") los mtodos de sta. Ukelele: Hereda ("Inherit") de la clase Guitarra y redefine ("Override") los mtodos de sta.

Las definiciones de la clase principal Musica son descritas en los siguientes incisos:

Daniel Oliva Bianco 2009

38

Programacin Java Bsico

El primer mtodo definido en esta clase llamado afinar toma como valor de entrada una referencia del tipo Instrumento, sobre la cual es invocado el mtodo tocar. Un segundo mtodo nombrado afinarTodo toma como valor de inicia un arreglo de Instrumento, el cual es procesado por un ciclo que a su vez manda llamar el mtodo afinar con los respectivos valores del arreglo. Dentro del mtodo principal se define lo siguiente: o Primeramente se genera un arreglo de Instrumento para 5 Objetos. o Se inicializa un primitivo i con un valor de cero. o A travs de la referencia orquesta son asignados distintos Objetos al arreglo, ntese que aunque el arreglo es de tipo Instrumento es posible asignar los Objetos: Guitarra, Piano, Saxofon, Guzla, Ukelele. o Finalmente se invoca el mtodo afinarTodo con la referencia que representa el arreglo de Instrumento.

Al ser ejecutado este programa se obtienen los siguientes resultados:


$ java Musica Guitarra.tocar() Piano.tocar() Saxofon.tocar() Guzla.tocar() Ukelele.tocar()

Lo interesante de este resultado reside en la manera que fue realizada la invocacin de mtodos, el mtodo que realiza las llamadas hacia las diversas clases es afinar dentro de la clase Musica, observe que este mtodo toma como valor inicial una referencia del tipo Instrumento y se invoca el mtodo tocar. Sin embargo, al ser invocado el mtodo tocar a pesar de ser a travs de una referencia Instrumento es invocado el mtodo de clase acordemente, esto es, se llama el mtodo de la clase especifica; lo anterior es una labor de Polimorfismo ya que ocurre el comportamiento adecuado a pesar de realizarse las llamadas a travs de una clase general (Instrumento). El uso de Polimorfismo posee ciertos detalles que no fueron descritos en el ejemplo anterior, uno de estos, que tambin tiene implicaciones en otros componentes es: Casting.

Daniel Oliva Bianco 2009

39

Programacin Java Bsico

Uso de "Casting"
El trmino "Casting" viene de la palabra "Cast" que significa Molde, por lo que el termino literal es Hacer un Molde, en Polimorfismo se lleva a cabo este proceso de "Casting" implcitamente, 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 trminos computacionales. Anteriormente se mencion que el "Casting" llevado a cabo con Polimorfismo es implcito, esto se debe a que no se requiere de sintaxis especial, simplemente se convierte una Guitarra a un Instrumento, sin embargo, para llevar una transformacin en sentido opuesto se requiere de sintaxis adicional para mantener la seguridad de transformacin; analicemos: mientras se puede asegurar que un Triangulo es una Figura ("Up-Casting"), una Figura no necesariamente es un Triangulo, claro est que lo puede ser, pero en Java se requiere definir explcitamente esta operacin ("Down-Casting"). El uso prctico de "Down-Casting" ser explorado en la seccin de Vectores y "Hashtables".

Daniel Oliva Bianco 2009

40

Programacin Java Bsico

Interfaces y clases Abstractas.


Clases Abstractas.
Al ser utilizado Herencias y/o Polimorfismo es muy comn que en la clase Base existan mtodos diseados nicamente con el propsito de ofrecer una gua para las clases heredadas, en Java existe un vocablo que permite prohibir el uso de mtodos en clases Base, este calificativo es: abstract. Al ser definido un mtodo como abstract se restringe que ste sea llamado directamente, cuando una clase contiene un mtodo de este tipo a sta se le llama: clase Abstracta. Al ser definida una clase, adems de ser declarados los mtodos/campos como abstract tambin es necesario utilizar el vocablo abstract en la definicin de cada clase.

Cdigo Fuente Musica2.java


import java.util.*; abstract class Instrumento { public abstract void tocar(); public String tipo() { return "Instrumento"; } public abstract void afinar(); } class Guitarra extends Instrumento { public void tocar() { System.out.println("Guitarra.tocar()"); } public String tipo() { return "Guitarra"; } public void afinar() {} } class Piano extends Instrumento { public void tocar() { System.out.println("Piano.tocar()"); } public String tipo() { return "Piano"; } public void afinar() {} } class Saxofon extends Instrumento { public void tocar() { System.out.println("Saxofon.tocar()"); } public String tipo() { return "Saxofon"; } public void afinar() {} } // Un tipo de Guitarra class Guzla extends Guitarra { public void tocar() {

Daniel Oliva Bianco 2009

41

Programacin Java Bsico


System.out.println("Guzla.tocar()"); } public void afinar() { System.out.println("Guzla.afinar()"); } } // Un tipo de Guitarra class Ukelele extends Guitarra { public void tocar() { System.out.println("Ukelele.tocar()"); } public String tipo() { return "Ukelele"; } } public class Musica2 { // No importa el tipo de Instrumento, // seguir funcionando debido a Polimorfismo: static void afinar(Instrumento i) { // ... i.tocar(); } static void afinarTodo(Instrumento[] e) { for(int i = 0; i < e.length; i++) afinar(e[i]); }

public static void main(String[] args) { // Declarar un Arreglo SIN INSTANCIAS es vlido en clases Abstractas Instrumento[] orquesta = new Instrumento[5]; // Generar una INSTANCIA de una la clase Abstracta no es valido // Instrumento nuevo = new Instrumento(); int i = 0; // Up-casting al asignarse el Arreglo orquesta[i++] = new Guitarra(); orquesta[i++] = new Piano(); orquesta[i++] = new Saxofon(); orquesta[i++] = new Guzla(); orquesta[i++] = new Ukelele(); afinarTodo(orquesta); } }

Clase Musica2
La clase anterior es idntica aquella definida en el ejemplo de Polimorfismo, sin embargo, la clase Base de Instrumento fue definida como abstract, algunos detalles de esta definicin:

Daniel Oliva Bianco 2009

42

Programacin Java Bsico


Ntese que los mtodos definidos como abstract no contienen ningn tipo de cdigo dentro de ellos, inclusive no declaran ni llaves ({ }). Cuando es definido ms de un mtodo como abstract, es necesario que la clase como tal sea definida tambin como abstract.

La caracterstica de hacer una clase/Mtodo abstract reside en que no puede ser generada una instancia de la misma, este comportamiento se demuestra en el mtodo principal (main)

Aunque dentro del mtodo sea generado un Arreglo de esta clase abstracta, recuerde que un arreglo es nicamente un contenedor de Objetos, esto permite que sea generado sin ningn error. Dentro de comentarios se encuentra la generacin de una instancia del tipo Instrumento la cual generara un error al ser compilada la clase.

Una de las caractersticas de las clases que heredan de una clase abstracta, es que stas deben definir los mismos mtodos definidos en la clase Base; en Java existe otro mecanismo que permite llevar acabo diseos donde se parte de una Estructura o Cpsula.

Interfaces.
Una Interface es una clase abstracta llevada al extremo, la cual permite pre-definir el uso de mtodos/campos en futuras clases tal como: Una jerarqua de Instrumentos restringido al uso de una Interface Instrumento, o bien, una estructura de Figuras al uso de la Interface Figura. Una Interface bsicamente dice: "Todas las clases que implementen esta Interface deben contener su misma estructura", para definir una Interface se utiliza el vocablo interface y para especificar que una clase debe utilizar determinada Interface se utiliza el vocablo implements. Al ser utilizada una Interface en una clase se est indicando: "La Interface dicta la forma/estructura ahora se va describir como debe funcionar", en el siguiente ejemplo se describe el uso de Interfaces:

Cdigo Fuente Musica3.java


import java.util.*; interface Instrumento { // Constante al compilar, automticamente static y final int i = 5; // Mtodos Automticamente Pblicos void tocar(); String tipo(); void afinar(); }

Daniel Oliva Bianco 2009

43

Programacin Java Bsico


class Guitarra implements Instrumento { public void tocar() { System.out.println("Guitarra.tocar()"); } public String tipo() { return "Guitarra"; } public void afinar() {} } class Piano implements Instrumento { public void tocar() { System.out.println("Piano.tocar()"); } public String tipo() { return "Piano"; } public void afinar() {} } class Saxofon implements Instrumento { public void tocar() { System.out.println("Saxofon.tocar()"); } public String tipo() { return "Saxofon"; } public void afinar() {} } // Un tipo de Guitarra class Guzla extends Guitarra { public void tocar() { System.out.println("Guzla.tocar()"); } public void afinar() { System.out.println("Guzla.afinar()"); } } // Un tipo de Guitarra class Ukelele extends Guitarra { public void tocar() { System.out.println("Ukelele.tocar()"); } public String tipo() { return "Ukelele"; } } public class Musica3 { // No importa el tipo de Instrumento, // seguir funcionando debido a Polimorfismo: static void afinar(Instrumento i) { // ... i.tocar(); } static void afinarTodo(Instrumento[] e) { for(int i = 0; i < e.length; i++) afinar(e[i]); }

Daniel Oliva Bianco 2009

44

Programacin Java Bsico

public static void main(String[] args) { // Declarar un Arreglo SIN INSTANCIAS es Abstractas Instrumento[] orquesta = new Instrumento[5]; int i = 0; // Up-casting al asignarse el Arreglo orquesta[i++] = new Guitarra(); orquesta[i++] = new Piano(); orquesta[i++] = new Saxofon(); orquesta[i++] = new Guzla(); orquesta[i++] = new Ukelele(); afinarTodo(orquesta); } }

vlido

en

clases

Clase Musica3
La clase anterior es idntica aquella definida en los ltimos dos ejemplos, sin embargo, la clase Base de Instrumento fue definida como una interface a travs del vocablo interface, algunos detalles de esta definicin:

Ntese que los mtodos definidos dentro de la interface no contienen ningn tipo de cdigo dentro de ellos, inclusive no declaran ni llaves ({ }). A diferencia de los mtodos definidos en clases Abstractas, los mtodos definidos en Interfaces no utilizan ningn calificador de acceso (public, private, protected). Cuando una clase hace uso de una Interface esta utiliza la palabra implements, adems es necesario definir todos los mtodos definidos en la Interface dentro de la clase.

En la siguiente seccin se describe el uso de Interfaces para Herencias Mltiples ("Multiple Inheritance").

Herencias Mltiples
Una caracterstica especifica de Interfaces que no es posible a travs de clases Abstractas es el uso de Herencias Mltiples, este concepto reside en disear clases que adoptan el comportamiento de ms de una clase, a continuacin se describe su uso:

Cdigo Fuente Cardiologo.java


import java.util.*;

interface PuedeCurar { void curar(); } interface PuedeConsultar {

Daniel Oliva Bianco 2009

45

Programacin Java Bsico


void consultar(); } interface PuedeRecetar{ void recetar(); } class Cirujano { public void operar() { System.out.println("Cirujano.operar()"); } } class Medico extends Cirujano implements PuedeCurar, PuedeConsultar, PuedeRecetar { public void curar() { System.out.println("Medico.curar()"); } public void consultar() { System.out.println("Medico.consultar()"); } public void recetar() { System.out.println("Medico.recetar()"); } } class Cardiologo { static void r(PuedeCurar x) { x.curar(); } static void s(PuedeConsultar x) { x.consultar(); } static void t(PuedeRecetar x) { x.recetar(); } static void u(Cirujano x) { x.operar(); } public static void main(String[] args) { Medico m = new Medico(); r(m); s(m); t(m); u(m); } }

En este archivo fuente son definidas tres Interfaces y tres clases las cuales son descritas a continuacin: Interfaces PuedeCurar, PuedeConsultar, PuedeRecetar. Cada una de estas interfaces define un mtodo el cual deber ser implementado en las respectivas clases que hagan uso de las interfaces. Clase Cirujano. Esta clase simplemente define un mtodo llamado operar que imprime un mensaje a pantalla. Clase Medico. Contiene la mayor parte de cdigo funcional de este archivo fuente:

Es definida al igual que cualquier otra clase con el vocablo class.


46

Daniel Oliva Bianco 2009

Programacin Java Bsico


Se utiliza el vocablo extends para heredar ("Inherit") el comportamiento de la clase Cirujano. Seguido se implementan las interfaces PuedeCurar, PuedeConsultar, PuedeRecetar a travs de implements, esto obliga a que sean definidos los mtodos de las diversas interfaces. Son escritas las diversas implementaciones de los mtodos de cada interface, los cuales envan un mensaje a pantalla.

Clase Cardiologo.

Dentro del mtodo principal (main) de esta clase se genera una instancia de la clase Medico. A travs de dicha referencia son invocados los diversos mtodos locales r,s,t,u. El mtodo r manda llamar la funcin curar, ntese que aunque el dato de entrada aparece como PuedeCurar (Interface) la invocacin se lleva acabo directamente de la clase Medico. El mtodo s manda llamar la funcin consultar, ntese que aunque el dato de entrada aparece como PuedeConsultar (Interface) la invocacin se lleva acabo directamente de la clase Medico. El mtodo t manda llamar la funcin recetar, ntese que aunque el dato de entrada aparece como PuedeRecetar (Interface) la invocacin se lleva acabo directamente de la clase Medico. El mtodo u invoca la funcin operar disponible en la clase Cirujano.

Cabe mencionar que el uso de Interfaces es ampliamente utilizado en EJB's ("Enterprise Java Beans") uno de los principales componentes de J2EE ("Java 2 Enterprise Edition").

Daniel Oliva Bianco 2009

47

Programacin Java Bsico

Condicionales, Operadores, Ciclos, Arreglos


Condicionales if/else
En Java al igual que otros lenguajes son utilizados condicionales que permiten controlar el flujo de ejecucin en un programa, los tres principales tipos son el conocido if/else,while y for; a continuacin se describen varios ejemplos con el uso de if/else:

Cdigo Fuente Condicional.java


public class Condicional { static int analisis(int prueba, int objetivo) { int resultado = 0; if(prueba > objetivo) resultado = +1; else if(prueba < objetivo) resultado = -1; else resultado = 0; // Prueba igual a Objetivo return resultado; } public static void main(String[] args) { System.out.println(analisis(7, 3)); System.out.println(analisis(3, 7)); System.out.println(analisis(7, 7)); } }

Clase Condicional.java

Primeramente se declara la clase a travs del vocablo class. Es definido un mtodo llamado anlisis el cual retorna una respuesta en base a las operaciones del condicional if/else; una caracterstica de este mtodo es que utiliza el calificativo static, esto se debe a que es llamado directamente del mtodo principal main el cual tambin es static; debido a que el vocablo static es empleado en mtodos que no requieren instancias, si se realiza un llamado hacia determinado mtodo de uno static ste tambin deber ser static, esto garantiza un posible error al invocar mtodos estticos. Dentro del mtodo principal (main) es invocado el mtodo anlisis en tres ocasiones, imprimiendo los respectivos resultados a pantalla.

Uso de llaves ({ }) en Ciclos.


Una caracterstica del ciclo if/else as como los otros ciclos disponibles en Java es el uso de llaves { }, en el ejemplo anterior pudo notar que no fueron utilizadas llaves { } para
Daniel Oliva Bianco 2009 48

Programacin Java Bsico

delimitar las condicionales, al no emplearse este mecanismo, se asume que el ciclo o condicional tendr efecto nicamente en la lnea contigua a su inicio. Aunque es recomendable utilizar llaves ({ } ) para incrementar la legibilidad del cdigo, es importante sealar que esta sintaxis de no utilizar llaves ({ } ) es vlida y muy comn (Lamentablemente) . Existe otra variacin de if/else que agrupa las condicionales en una sola expresin :
if (expresion Boolean ? operacin verdadera: operacin falsa)

A continuacin se describe un ejemplo empleando esta variacin de if/else.

Codigo Fuente Tercia.java


public class Tercia { public static int trio(int r) { return r < 10 ? r*3: r*22; } public static void main(String args[]) { System.out.println(trio(2)); System.out.println(trio(20)); } }

Clase Tercia

Es definido un mtodo llamado tro el cual hace uso de la variante if/else; la expresin boolean es r < 10, si esta expresin resulta verdadera es ejecutada la operacin r*3, caso contrario r*22. Dentro del mtodo principal main es invocado el mtodo tro en dos ocasiones, enviando a pantalla los respectivos resultados.

Daniel Oliva Bianco 2009

49

Programacin Java Bsico

Uso de los Ciclos for y while


El uso de Ciclos en lenguajes de programacin es un concepto ampliamente utilizado, a continuacin se describe el uso del ciclo for y while:

Sintaxis del Ciclo for


La Sintaxis empleada por el ciclo for es la siguiente:
for (valores de entrada ; condicin de terminacin ; iteracin por ciclo)

Las tres partes del ciclo se encuentran separadas por ; (punto y coma) La primer parte del ciclo especifica valores previos a su inicio. La segunda parte indica la condicin de terminacin para el ciclo, la cual est directamente relacionada con los valores iniciales. Finalmente, la ltima parte especifica cmo sern manipulados los valores iniciales en cada iteracin del ciclo.

Cada parte del ciclo debe incluir al menos un elemento, a la cual es posible agregar otros elementos a partir de una , (coma).

Cdigo Fuente PruebaFor.java


public class PruebaFor { public static void main(String[] args) { for(int i = 1, j = i + 10; i < 5; i++, j = i * 2) { System.out.println("i= " + i + " j= " + j); } } }

Clase PruebaFor

Se inicia este programa con la clsica definicin de class. Se define el mtodo principal (main), el uso de corchetes ([]) al lado de la clase String indica un Arreglo de String's. Se define el ciclo for con las siguientes caractersticas: o Dos variables iniciales (primitivos) i y j. o La condicin para terminar el ciclo es definida cuando el valor de la variable i sea menor 5. o Cada iteracin de ciclo el valor de la variable i debe ser incrementado en uno (++) y el valor de j debe ser igualado a dos veces el valor de i. Dentro del Ciclo se utiliza la clase System.out.println para imprimir los valores de las variables i y j en cada iteracin de ciclo.

Daniel Oliva Bianco 2009

50

Programacin Java Bsico

Sintaxis del Ciclo while


La Sintaxis empleada por el ciclo while es la siguiente:
while (condicin de terminacin)

Consta de un solo elemento que indica la condicin de terminacin para un Ciclo.

Cdigo Fuente PruebaWhile.java


public class PruebaWhile { public static void main(String[] args) { double r = 0; while(r < 0.99d) { r = Math.random(); System.out.println(r); } } }

Clase PruebaWhile

Se inicia este programa definiendo la clase en cuestin. Se define el mtodo principal (main), el uso de corchetes ([]) al lado de la clase String indica un Arreglo de String's. Se define un primitivo del tipo double con valor inicial de 0 (cero). El ciclo while utiliza la condicin de terminacin hasta que el valor de la variable d sea asignado un valor mayor a 0.99; la d al final del numero indica un nmero (primitivo) del tipo double . Dentro del ciclo, el valor de la variable es modificado con un nmero aleatorio a travs de la funcin Math.random (proporcionada en las clases Base del JDK), que toma como valor de entrada un nmero (primitivo). Es impreso a pantalla (va System.out.println) el valor de la variable r.

Daniel Oliva Bianco 2009

51

Programacin Java Bsico

En ciertas ocasiones surge la necesidad de interrumpir un ciclo si ocurre determinada condicin, o bien, saltar una iteracin en ciertas circunstancias, este comportamiento se logra a travs de los vocablos break y continue, a continuacin se describe su uso:

Cdigo Fuente BreakYContinue.java


public class BreakYContinue { public static void main(String[] args) { for(int i = 0; i < 100; i++) { if(i == 74) break; // Fuera de Ciclo if(i % 9 != 0) continue; // Siguiente Iteracin System.out.println(i); } int i = 0; // Un ciclo "infinito": while(true) { i++; int j = i * 27; if(j == 1269) break; // Fuera del Ciclo if(i % 10 != 0) continue; // Regreso al Inicio del Ciclo System.out.println(i); } } }

Clase BreakYContinue
La clase nicamente contiene cdigo en su mtodo principal (main) descrito a continuacin:

Se inicia un ciclo for con cien iteraciones empleando la variable i, cada iteracin es impreso el valor la variable a pantalla, salvo los siguientes casos: o Si el valor de la variable i equivale a 74 se termina todo el ciclo debido al vocablo break. o Si la variable i no es mltiplo de 9 se interrumpe la iteracin actual debido al vocablo continue. Antes de iniciarse un ciclo while se reinicializa la variable i a cero. Dentro del ciclo se imprimen los valores de la variable i en cada iteracin, excepto en los siguientes casos: o Si el valor de la variable j equivale a 1269 se termina todo el ciclo debido al vocablo break. o Si la variable i no es mltiplo de 10 se interrumpe la iteracin actual debido al vocablo continue.

Daniel Oliva Bianco 2009

52

Programacin Java Bsico

Uso de switch
A travs de un Switch se posible definir una serie de tareas cada una asignada a una lista de valores, este tipo de estructura es ideal cuando se requieren condicionales que lleven ms de dos valores, en lugar de anidar grupos de condicionales if/else es posible lograr el mismo comportamiento a travs de un switch:

Sintaxis del switch.


La Sintaxis empleada por un switch es la siguiente:
switch (variable) { case <posible valor>: Instrucciones: case <posible valor>: Instrucciones: case <posible valor>: Instrucciones: case <posible valor>: Instrucciones: case <posible valor>: Instrucciones: default: Instrucciones ;

break; break; break; break; break;

Dada una variable de entrada esta se define seguido del vocablo switch. Se abre una llave para iniciar los posibles valores que pueda tomar dicha variable. Los juegos de valores son iniciados con case seguido del posible valor de la variable, posteriormente es definido un juego de instrucciones que sern ejecutados en caso de corresponder con el valor de la variable y finalmente (opcional) se utiliza vocablo break para salir de ciclo case. Un valor opcional es la definicin de la linea default, cuyas instrucciones sern ejecutadas en caso que la variable del switch no coincida con los valores definidos.

Cdigo Fuente Meses.java


public class Meses { public static void main(String[] args) { int month = 8; switch (month) { case 1: System.out.println("Enero"); break; case 2: System.out.println("Febrero"); break; case 3: System.out.println("Marzo"); break; case 4: System.out.println("Abril"); break; case 5: System.out.println("Mayo"); break; case 6: System.out.println("Junio"); break; case 7: System.out.println("Julio"); break; case 8: System.out.println("Agosto"); break; case 9: System.out.println("Septiembre"); break; case 10: System.out.println("Octubre"); break; case 11: System.out.println("Noviembre"); break; case 12: System.out.println("Diciembre"); break; } } }

Daniel Oliva Bianco 2009

53

Programacin Java Bsico

Clase Meses

Se define un primitivo con valor de 8, el cual es utilizado como variable para un switch. Dentro del switch son definidos valores del 1 al 12, los cuales tienen como instruccin imprimir a pantalla el valor del mes correspondiente.

Cuando se describi la Sintaxis de un switch se mencion que el uso de break al final de cada declaracin (case) era opcional, esto se debe a la posibilidad que exista ms de un valor que deba ejecutar las mismas instrucciones, a continuacin se describe este caso:

Cdigo Fuente Meses2.java


public class Meses2 { public static void main(String[] args) { int mes = 10; int ao = 2002; int numDias = 0; switch (mes) { case 1: case 3: case 5: case 7: case 8: case 10: case 12: numDias = 31; break; case 4: case 6: case 9: case 11: numDias = 30; break; case 2: if ( ((ao % 4 == 0) && !(ao % 100 == 0)) || (ao % 400 == 0) ) numDias = 29; else numDias = 28; break; } System.out.println("Numero de Dias = " + numDias); } }

Daniel Oliva Bianco 2009

54

Programacin Java Bsico

Clase Meses2
En esta clase el uso de switch vara, ya que son agrupados distintos valores, al omitir el uso del vocablo break; el uso de break en un switch es crtico ya que al no ser definido puede ocasionar un comportamiento errtico, ya que al no indicarse se continan evaluando los distintos valores restantes en un switch, posiblemente causando un comportamiento no deseado. Finalmente, vale mencionar que las datos que se puede evaluar a travs de un switch son solo primitivos, esto es, no se puede definir un juego de String's y comparar sus valores, para este tipo de situaciones (String u otro Objeto) se requiere usar condicionales if/else anidadas.

Daniel Oliva Bianco 2009

55

Programacin Java Bsico

Operadores Matemticos, Relacionales y Lgicos


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 mayora, sin embargo, en esta seccin se describirn detalles ms precisos acerca de su funcionamiento. Antes de entrar en el uso de Operadores, a continuacin se describe un ejemplo que demuestra el comportamiento de Asignacin de valores para el lenguaje Java:

Cdigo Fuente Asignacion.java


class Numero { int i; } public class Asignacion { public static void main(String[] args) { Numero n1 = new Numero(); Numero n2 = new Numero(); n1.i = 15; n2.i = 45; System.out.println("a) n1.i: ", n2.i: " n1 = n2; System.out.println("b) n1.i: ", n2.i: " n1.i = 27; System.out.println("c) n1.i: ", n2.i: " } }

" + n1.i + + n2.i); " + n1.i + + n2.i); " + n1.i + + n2.i);

Clase Asignacion

En el cdigo fuente son definidas dos clases, una de ellas (Numero) simplemente contiene un campo, mientras la segunda (Asignacion) incluye la lgica central del programa. Dentro del mtodo principal (main) de la clase principal (Asignacion) es definida la siguiente secuencia de eventos: o Primeramente se generan dos instancias de la clase Numero a las cuales son asignadas las referencias n1 y n2. o A travs de dichas referencias son asignados los valores correspondientes al campo i de la clase. o Se imprime a pantalla el valor de cada campo de las dos instancias. o Se asigna el valor de n2 a la instancia de n1. o Se imprime a pantalla el valor de cada campo de las dos instancias. o Se modifica el valor del campo en la instancia n1 al valor de 27.
56

Daniel Oliva Bianco 2009

Programacin Java Bsico


o

Se imprime a pantalla el valor de cada campo de las dos instancias.

Aunque el comportamiento del programa anterior parece predecible, para muchas personas no familiarizadas con lenguajes orientados a Objetos puede resultar una sorpresa, la ejecucin del programa anterior da como resultado:

a) n1.i: 15, n2.i: 45 b) n1.i: 45, n2.i: 45 c) n1.i: 27, n2.i: 27

Los primeros resultados no presentan sorpresa alguna, puesto que simplemente se imprimen los valores recin asignados; la segunda impresin puede resultar confusa y esto se debe a la asignacin n1 = n2. Al utilizar la sintaxis n1 = n2, se est indicando que la referencia n1 apunte hacia aquella de n2; al ser llevada a cabo esta asignacin el valor n1.i cambia efectivamente hacia el mismo de n2.i. El comportamiento anterior se debe a que fueron utilizadas referencias en la asignacin de valores, la instancia de n1 fue efectivamente perdida, a partir de ese punto ambas referencias apuntan hacia la instancia del Objeto n2; este mecanismo en Java es denominado aliasing y suele ser un poco difcil de entender para aquellos que inician en este lenguaje. La tercer impresin es llevada a cabo despus de la asignacin n1.i = 27, al llevar a cabo este proceso el valor n1.i ser modificado, as como el valor de n2.i, puesto que ambas referencias apuntan hacia la misma instancia. Para evitar aliasing y mantener las dos instancias de Objetos se utilizara una asignacin ms explcita: n1.i = n2.i; en la siguiente seccin se observar un comportamiento de equivalencia que tambin puede resultar inusual para un programador no familiarizado con el lenguaje Java.

Daniel Oliva Bianco 2009

57

Programacin Java Bsico

Operadores Relacionales.
A travs de operadores relacionales es posible llevar a cabo un proceso de comparacin entre dos elementos en un programa, siendo su caracterstica principal el generar un resultado verdadero o falso; dichos operadores relacionales se muestran a continuacin: 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 continuacin se demuestra un uso muy comn de estos operadores:

Cdigo Fuente Equivalencia.java


public class Equivalencia { public static void main(String[] args) { Integer n1 = new Integer(75); Integer n2 = new Integer(75); System.out.println(n1 == n2); System.out.println(n1 != n2); } }

Clase Equivalencia

La clase anterior genera dos instancias de la clase Integer, las cuales son inicializadas con un valor de 75. Es llevada a cabo una comparacin entre ambas referencias. Aunque el comportamiento del programa anterior parece predecible, los resultados de este programa son falso (false) y verdadero (true), este resultado se debe a que la comparacin realizada por el programa es en base a referencias, para llevar a cabo el comportamiento deseado se utiliza la siguiente variacin:
public class Equivalencia2 { public static void main(String[] args) { Integer n1 = new Integer(75); Integer n2 = new Integer(75); System.out.println(n1.equals(n2)); } }

Daniel Oliva Bianco 2009

58

Programacin Java Bsico

En el ejemplo anterior se hace uso del mtodo equals, a travs de este mtodo disponible en toda clase es llevado a cabo una comparacin entre el valor del Objeto en s; cabe mencionar que los operadores relacionales "==" y "!=" funcionan acordemente ( o como aparentemente se pensara ) con primitivos, es solo cuando se utilizan clases cuando es necesario utilizar el mtodo "equals" para llevar a cabo una comparacin al nivel de Objetos.

Operadores Matemticos
En Java se encuentran disponibles los mismos operadores matemticos que en otros lenguajes, mencionados a continuacin: Operador + = * / % Significado Suma Resta Igual Multiplicacin Divisin Modulo (El residuo de una Divisin)

Java tambin ofrece una sintaxis para llevar a cabo una operacin matemtica y asignacin en una sola simbologa, mediante: "+=","-=","*=","/="; adems de esta sintaxis tambin existen los operadores de auto-incremento y auto-decremento que son representados por "++" y "--" respectivamente. Adems de estos operadores matemticos, el lenguaje tambin posee una clase estndar (en el JDK) para realizar operaciones ms complejas, esta clase bajo el nombre de java.lang.Math ofrece operaciones trigonomtricas, exponenciales y otras ms.
Operadores Lgicos.

Los operadores lgicos para el lenguaje Java son los siguientes: Operador || && ! Significado O (OR) Y (AND) Negacin (NOT)

Daniel Oliva Bianco 2009

59

Programacin Java Bsico

Arreglos (Arrays).
Un uso muy comn en diseos de Software es agrupar distintos valores relacionados entre s en una sola variable, lo cual permite una manipulacin ms eficiente de datos; en el lenguaje Java existen diversos mecanismos para agrupar datos en conjunto, una de ellas que ha venido siendo utilizada a lo largo de los distintos programas en este curso es denominada: Arreglo. A travs de un Arreglo es posible generar agrupaciones de cualquier tipo de Objeto simplemente agregando una simbologa de corchetes , ya sea seguido de la definicin de clase o bien la referencia en cuestin, a continuacin se describen diversos ejemplos ms amplios de Arreglos:

Cdigo Fuente Arreglo.java


En el siguiente cdigo fuente se demuestra el uso de Arreglos con clases Generadas (Propias) y primitivos, dividida en dos secciones.

class Clip {} public class Arreglo { public static void main(String[] args) { // Arreglos de Objetos Clip[] a; // Referencia Nula Clip[] b = new Clip[5]; Clip[] c = new Clip[4]; // Inicializacin Dinmica con Ciclo for(int i = 0; i < c.length; i++) c[i] = new Clip(); // Inicializacin al Crearse Arreglo Clip[] d = { new Clip(), new Clip(), new Clip() }; // Inicializacin Dinmica a = new Clip[] { new Clip(), new Clip() }; System.out.println("a.length=" + a.length); System.out.println("b.length = " + b.length); // Las referencia dentro del Arreglo // son automticamente inicializadas a "null" for(int i = 0; i < b.length; i++) System.out.println("b[" + i + "]=" + b[i]); System.out.println("c.length = " + c.length); System.out.println("d.length = " + d.length); a = d; System.out.println("a.length = " + a.length);

Daniel Oliva Bianco 2009

60

Programacin Java Bsico

Primeramente se define una clase denominada Clip la cual simplemente consta de su declaracin, seguido se encuentra la definicin de la clase principal Arreglo que contiene solo su mtodo principal (main), dentro de este mtodo se define lo siguiente:

En la primera seccin son definidas tres referencias en manera de Arreglo para la clase Clip; la primera declaracin nicamente define la referencia, mientras las siguientes lneas definen dos referencias asignndose un arreglo de 5 y 4 Objetos respectivamente. Posteriormente son inicializados los distintos arreglos; en el primer caso se emplea un ciclo el cual asigna un Objeto a cada valor del arreglo, seguido se genera un nuevo arreglo el cual es inicializado en la misma declaracin, finalmente se lleva a cabo la inicializacin de la referencia a En esta ltima seccin son impresos los distintos valores de los respectivos arreglos, en estas declaraciones se hace uso del mtodo interno length, dicho mtodo est disponible para cualquier tipo de arreglo e indica la longitud del mismo; adems de esto son impresos los valores del arreglo b, los cuales por "default" son asignados un valor de null; adems de lo anterior, un detalle relevante es la asignacin a = d , como fue demostrado en un ejemplo anterior, este tipo de asignacin hace que la referencia a apunte hacia los Objetos de la referencia d, por lo que el ltimo valor del arreglo(referencia) a equivale a 3.

A continuacin se describe el resto del Cdigo Fuente para el programa:


// Arreglo de Primitivos int[] e; // Referencia Nula int[] f = new int[5]; int[] g = new int[4]; // Inicializacin Dinmica con Ciclo for(int i = 0; i < g.length; i++) g[i] = i*i; // Inicializacin al Crearse Arreglo int[] h = { 11, 47, 93 }; // Error Compilacin: Variable(Arreglo) no inicializada // System.out.println("e.length=" + e.length); System.out.println("f.length = " + f.length); // Los primitivos dentro del Arreglo // son inicializados a cero: for(int i = 0; i < f.length; i++) System.out.println("f[" + i + "]=" + f[i]); for(int i = 0; i < g.length; i++) System.out.println("g[" + i + "]=" + g[i]); System.out.println("h.length = " + h.length); e = h; System.out.println("e.length = " + e.length); e = new int[] { 1, 2 }; System.out.println("e.length = " + e.length); } }

Daniel Oliva Bianco 2009

61

Programacin Java Bsico

En la primera seccin son definidas tres variables en manera de Arreglo para primitivos int; la primera declaracin nicamente define la variable, mientras las siguientes lneas definen dos variables asignndose un arreglo de 5 y 4 primitivos respectivamente. Posteriormente son inicializados los distintos arreglos; en el primer caso se emplea un ciclo el cual asigna valores al arreglo g, seguido se genera un nuevo arreglo el cual es inicializado en la misma declaracin. En esta ltima seccin son impresos los distintos valores de los respectivos arreglos: o La primer declaracin (ntese el uso de comentarios) intenta imprimir la longitud del arreglo e, esto generara un error de compilacin debido a que el arreglo e no ha sido inicializado. o Posteriormente se imprime el tamao del arreglo f. o Se imprimen los valores de los arreglos f y g, seguido de la longitud del arreglo h, los cuales como cualquier primitivo int son asignados un valor de 0 (cero) por "default". o Se asigna el valor del arreglo h al arreglo e. o Debido a la asignacin anterior, es posible utilizar el mtodo length sobre el arreglo e, el cual tomar el mismo valor del arreglo h. o Son redefinidos-reinicializados los valores del arreglo e con dos nuevos primitivos. o Finalmente se imprime la nueva longitud del arreglo e.

Al final de esta seccin sern descritas otras metodologas para agrupar datos que poseen distintas ventajas a emplear un Arreglo.

Daniel Oliva Bianco 2009

62

Programacin Java Bsico

Vectores, Hashtables y otras estructuras de Datos.


Algunas de las principales caractersticas de Arreglos en Java son las siguientes:

Es necesario definir el tamao de un Arreglo antes de ser utilizado, este se hace con la intencin de administrar el uso de memoria, pero a su vez presenta la restriccin de utilizar Arreglos en estructuras de datos cambiantes. Un arreglo nicamente puede incluir Objetos/primitivos del mismo tipo, si bien esto permite un control ms estricto sobre estructura de datos, restringe una posible mezcla de elementos comunes que difieran en su clase.

Vectores
A diferencia de un Arreglo, un Vector es un tipo de Objeto que permite almacenar objetos (referencias) de cualquier tipo, que adems de ofrecer estas facilidades, tambin es posible que su tamao incremente conforme las necesidades del programa lo requieran; aparentemente este es un contenedor de Objetos ideal para toda situacin, sin embargo, su uso puede ser un poco deficiente ya que requiere mayor uso de memoria que un arreglo de Objetos, el siguiente ejemplo demuestra el uso de esta clase:

Cdigo Fuente ArticulosOficina.java


En el siguiente cdigo fuente se demuestra el uso de Vectores:

import java.util.Vector; class Clip {} class Lapiz {} class Pluma {} class Silla {} class SillaReclinable {} public class ArticulosOficina { public static void main(String[] args) { // Un arreglo de Clips Clip[] c = new Clip[5]; // Un objeto de Lapiz Lapiz l = new Lapiz(); // Un arreglo de Plumas Pluma[] p = new Pluma[7]; // Un arreglo de Sillas Silla[] s = {

Daniel Oliva Bianco 2009

63

Programacin Java Bsico


new Silla(), new Silla(), new Silla() }; // Un Objeto Tipo String String deptF = new String("Finanzas"); String deptV = new String("Ventas"); // Definir Dos Vectores Vector ciudad1 = new Vector(3); Vector ciudad2 = new Vector(4,5); //Iniciar asignacin de Objetos a Vectores //Un Vector puede tomar cualquier tipo de Objeto ciudad1.add(deptF); ciudad1.add(c); ciudad1.add(l); ciudad2.add(deptV); ciudad2.add(c); ciudad2.add(l); System.out.println("Vector ciudad1 " elementos ciudad1.capacity()); System.out.println("Vector ciudad2 " elementos ciudad2.capacity()); tiene " + ciudad1.size() + y una capacidad de " tiene " + ciudad2.size() + y una capacidad de "

// Asignar otros valores para ver incremento de capacidad ciudad1.add(p); ciudad1.add(s); ciudad2.add(p); ciudad2.add(s); System.out.println("Despus de agregar otros System.out.println("Vector ciudad1 tiene " + " elementos y una ciudad1.capacity()); System.out.println("Vector ciudad2 tiene " + " elementos y una ciudad2.capacity()); elementos: "); ciudad1.size() + capacidad de " ciudad2.size() + capacidad de "

String deptExtraido = (String) ciudad1.elementAt(0); Silla[] sillaExtraida = (Silla[]) ciudad1.elementAt(4); System.out.println("El departamento de " + deptExtraido + " en la ciudad1 tiene " + sillaExtraida.length + " sillas"); SillaReclinable[] sr = new SillaReclinable[12]; ciudad2.insertElementAt(sr,4); deptExtraido = (String) ciudad2.elementAt(0);

// La siguiente extraccin generara un error // porque este elemento del Vector ya no es una clase Silla

Daniel Oliva Bianco 2009

64

Programacin Java Bsico


// sillaExtraida = (Silla[]) ciudad2.elementAt(4); SillaReclinable[] ciudad2.elementAt(4); sillaRecExtraida = (SillaReclinable[])

System.out.println("El departamento de " + deptExtraido + " en la ciudad2 tiene sillaRecExtraida.length + " sillas"); } }

"

Primeramente se definen varias clases que constan nicamente de su declaracin: Clip, Lapiz, Pluma, Silla, SillaReclinable seguido se encuentra la definicin de la clase principal ArticulosOficina que contiene solo su mtodo principal (main), dentro de este mtodo se define lo siguiente:

Se definen diversas instancias de las clases declaradas con anterioridad, unas de ellas en manera de arreglos y otras como un solo objeto. Posteriormente se definen dos vectores, a travs de distintos constructores; la primer instancia indica que su espacio inicial ser para tres objetos, mientras la segunda instancia para cuatro objetos, donde el 5 indica la capacidad de incremento (delta) cuando se requiera espacio para ms objetos. Son asignados tres objetos a los Vectores y se imprime a pantalla el tamao y capacidad de ambos. Son asignados otros dos objetos a los Vectores y se imprime a pantalla su tamao y capacidad, con lo que puede corroborarse la manera en que incrementan su tamao. Son extrados del primer Vector dos elementos, ntese que dicha extraccin requiere que sea realizado un "Casting" explicito, lo cual es llevado a cabo a travs de parntesis ( ) ; esto se debe a que la extraccin es llevada a cabo de una clase genrica (Vector) hacia una ms especifica ya sea String o Silla[] ("DownCasting"). Es reasignado un valor del segundo vector a travs del mtodo insertElement, el cual toma como valor de entrada el ndice a substituirse. Son extrados del segundo Vector dos elementos, para posteriormente imprimirse a pantalla sus valores.

Daniel Oliva Bianco 2009

65

Programacin Java Bsico

Hashtables
Otro elemento que es ampliamente empleado en programacin es la utilizacin de listas de valores con determinados conceptos, esto es conocido como key-value lists y en el mundo Java recibe el nombre de "Hashtable", a continuacin se describe un ejemplo de "Hashtable's":

Cdigo Fuente Direccion.java


import java.util.*; public class Direccion { public static void main(String[] args) { Hashtable direccion = new Hashtable();

Integer ocho = new Integer(8000); direccion.put("calle","Primavera"); direccion.put("numero", ocho); direccion.put("colonia"," La Silla "); direccion.put("ciudad"," Monterrey "); direccion.put("estado"," Nuevo Leon "); direccion.put("pais","Mexico"); String miciudad String miestado String micalle = Integer minumero = (String) direccion.get("ciudad"); = (String) direccion.get("estado"); (String) direccion.get("calle"); = (Integer) direccion.get("numero");

System.out.println("Direccion: " + micalle + " " + minumero); System.out.println("Lugar: " + miciudad + "," + miestado); } }

Clase Direccion
Esta clase nicamente contiene su mtodo principal (main) el cual contiene las siguientes funcionalidades:

Se define una clase Hashtable con la referencia direccion. Posteriormente se define un nmero Integer; este es un de los casos donde deben ser utilizados "Wrappers" para primitivos, puesto que el elemento ser integrado a un contenedor ("Hashtable") en forma de Objeto es necesario convertir ("Wrap") el primitivo como Objeto. A travs del mtodo put son colocados diversos juegos de datos en el "Hashtable", el primer elemento indica el nombre ("key") del elemento, mientras el segundo indica el Objeto/Valor de este nombre ("key"); ntese los Objetos/Valores pueden ser de cualquier tipo, en este ejemplo se colocan diversos Strings y la referencia del Objeto Integer. Mediante el mtodo get son extrados algunos valores del "Hashtable" mediante el correspondiente nombre ("key").
66

Daniel Oliva Bianco 2009

Programacin Java Bsico

Ntese que dicha extraccin requiere que sea realizado un "Casting" explicito, lo cual es llevado a cabo a travs de parntesis ( ); esto se debe a que la extraccin es llevada a cabo de una clase genrica ("Hashtable") hacia una ms especifica ya sea String o Integer ("Down-Casting"). Finalmente son impresos a pantalla algunos valores extrados del "Hashtable".

Adems del uso de Vectores y "Hashtables", tambin existen otra serie de clases para el almacenaje de Objetos, cada una de stas posee sus ventajas y desventajas para agrupar elementos comunes.

Daniel Oliva Bianco 2009

67

Programacin Java Bsico

Operadores, Errores y Datos de Entrada/"Streams".


Definicin de Errores y Bloques try/catch/finally.
Aunque el tiempo ideal para encontrar errores es al momento de compilar un programa, esto no siempre es posible y por esta razn han sido diseados mecanismos para encontrarlos al momento de ejecucin ("Run-Time").La metodologa ms comn para trabajar con errores en lenguajes de programacin es interrumpir el flujo de ejecucin e invocar otro cdigo que maneje el error en cuestin; en el lenguaje Java a la ocurrencia de errores se le denomina "Exceptions" y al procesamiento de errores "try/catch". Como habra de esperarse, al encontrarse un error ("Exception") en Java es necesario invocar una clase que realiza las respectivas tareas, para mandar llamar este tipo de clases es necesario utilizar el vocablo throws; suponiendo que desea atrapar un error si determinada variable no ha sido inicializada, se utilizara la siguiente sintaxis:
if(t == null) throw new NullPointerException();

Al utilizar una definicin similar a la anterior, se asume que ya se conoce el tipo de error que puede ser generado en el programa, sin embargo, este no siempre es el caso y por esta razn en Java se define una Zona Especifica donde puede ser generado un error y a su vez atrapado, esta Zona "Protegida" es el conocido bloque try/catch/finally, a continuacin se describe la sintaxis de este bloque:

Sintaxis del Bloque try/catch


try { // Cdigo que pueda generar } catch(Tipo1 id1) { // Manejar "Exception's" } catch(Tipo2 id2) { // Manejar "Exception's" } catch(Tipo3 id3) { // Manejar "Exception's" }

Errores ("Exception's") para la clase Tipo1 para la clase Tipo2 para la clase Tipo3

La primer seccin del Bloque es iniciada con el vocablo try y una llave ({) que indica el principio de la zona protegida, dentro de esta primer seccin es colocado todo cdigo que pueda generar algn tipo de error, al terminar esta seccin se define un grupo de estructuras con el elemento catch. Como se puede observar en la ilustracin, cada vocablo catch es seguido de un parntesis que contiene una clase as como una referencia, estos son considerados los Datos de Entrada para cada seccin catch; el tipo de clases definidas dentro de cada seccin catch depende del nmero de "Exceptions" que pueden ser generadas por el programa; lo anterior

Daniel Oliva Bianco 2009

68

Programacin Java Bsico

permite definir un nmero ilimitado de "Exceptions" cada uno con su propio cdigo para manejar el error. Para todo Bloque try/catch debe ser definida al menos una seccin catch; si son definidos ms de dos clases para errores ("Exceptions") estas deben ser declaradas de ms a menos especifica, siendo la menos especifica la clase java.lang.Throwable; es de esta clase que son Heredadas todo "Exception" en Java, esto ser descrito en la siguiente seccin de este curso.

Sintaxis del Bloque try/catch/finally


Para los Bloques try/catch existe una variacin que consiste en agregar una seccin denominada finally, dicha estructura estara compuesta de la siguiente manera:

try { // Cdigo que pueda generar Errores ("Exception's") } catch(Tipo1 id1) { // Manejar "Exception's" para la clase Tipo1 } catch(Tipo2 id2) { // Manejar "Exception's" para la clase Tipo2 } catch(Tipo3 id3) { // Manejar "Exception's" para la clase Tipo3 } finally { // Actividades que siempre ocurren }

La utilizacin de finally es empleada dentro de un Bloque try/catch para realizar tareas que deben ser ejecutadas independientemente del comportamiento de errores. Cuando se atrapa un error ("Exception") un programa queda inconcluso, es esta terminacin abrupta la que puede causar que algn recurso/mecanismo permanezca asignado o mal utilizado; a travs de una seccin finally se garantiza que sea ejecutado un juego de instrucciones independientemente del tipo de error que pueda ocurrir; un uso muy comn para una seccin finally consiste en liberar conexiones hacia Bases de Datos que pudieran haber sido asignadas en la seccin try.

Daniel Oliva Bianco 2009

69

Programacin Java Bsico

Definicin de errores propietarios


Adems de los errores ("Exceptions") ofrecidos en las clases Base del JDK, es posible definir errores propietarios para llevar un control ms estricto sobre la generacin de errores:

Cdigo Fuente DefinirErrores.java


class MiError extends Exception { public MiError() {} public MiError(String msg) { super(msg); } } public class DefinirErrores { public static void f() throws MiError { System.out.println("Generando Error explcitamente en f()"); throw new MiError("Originado en f()"); } public static void g() throws MiError { System.out.println("Generando Error explcitamente g()"); throw new MiError("Originado en g()"); } public static void main(String[] args) { try { f(); } catch(MiError e) { e.printStackTrace(System.err); } try { g(); } catch(MiError e) { e.printStackTrace(System.err); } } }

En el archivo fuente anterior son diseadas dos clases: MiError que define un error ("Exception") propietario y DefinirErrores que hace uso de esta clase.

Clase MiError

Esta clase hereda el comportamiento de Exception, esto permite utilizar funcionalidades ya definidas en esta clase. NOTA: Aunque la clase base de todo error ("Exception") es java.lang.Throwable, generalmente se opta por java.lang.Exception ya que posee mayores funcionalidades (mtodos); inclusive si observa la documentacin del JDK, notar que la clase java.lang.Exception
70

Daniel Oliva Bianco 2009

Programacin Java Bsico

hereda el comportamiento de la clase java.lang.Throwable, en efecto teniendo acceso a cualquiera de los mtodos/campos disponibles en la clase Base. Son definidos dos constructores para esta clase: o Uno de estos recibe un String como valor de entrada y a su vez manda llamar la clase Base (Exception) a travs del vocablo super. o Otro es el constructor sin argumentos que debe ser declarado al emplearse ms de un constructor.

Clase DefinirErrores

Esta clase define dos mtodos llamados f() y g(), una caracterstica especifica de estos mtodos es que utilizan el vocablo throws seguido de una clase, esta sintaxis es obligatoria para los mtodos que puedan generar errores, debe hacerse fuerte nfasis que esto es independiente de las declaraciones hechas en los bloques try/catch, es simplemente una sintaxis para los mtodos capaces de generar errores. Dentro de cada mtodo f() y g() es generado un error con la clase MiError explcitamente. En el mtodo principal (main) son definidos dos bloques try/catch, en uno de estos es llamado el mtodo f() y en otro el mtodo g(). Al ser llamada la funcin de cada bloque, se genera un error del tipo MiError puesto que cada funcin invoca explcitamente este error. Cuando se detecta (atrapa) el error se entra en la seccin catch donde es invocada la funcin printStackTrace va la referencia e. NOTA: El mtodo printStackTrace fue heredado de la clase Exception. La clase/mtodo System.err representa el "Stream" de salida para cualquier error generado en un programa Java.

Daniel Oliva Bianco 2009

71

Programacin Java Bsico

Datos de Entrada
A lo largo de los diversos mtodos definidos en los distintos programas, se ha podido observar que estos definen sus Datos de Entrada seguido del nombre del mismo dentro de un parntesis (calificadores nombre_del_metodo (datos_de_entrada)). La sintaxis de los datos de entrada se compone de dos partes: El tipo de clase/Primitivo, seguido de la referencia empleada dentro del mtodo; por "default" los mtodos principales (main) en Java deben especificar un Arreglo de String's en su definicin, esto con la intencin de recibir parmetros al momento de ser llamada la clase, a continuacin se describe un ejemplo que hace uso de este mecanismo:

Cdigo Fuente Nombres.java


public class Nombres { public static void main(String[] args) { System.out.println("Su nombre es: " + args[0]); System.out.println("Sus apellidos son: " + args[1] args[2]); } }

"

" +

Clase Nombres.

Se inicia este programa con la clsica definicin de clase. Se define el mtodo principal (main), el uso de corchetes ([]) al lado de la clase String indica un Arreglo de String's. Se imprimen dos mensajes a pantalla a travs de la clase System.out.println. o El primer mensaje imprime el primer valor del arreglo de entrada, a travs de su referencia args; ntese que este primer valor es indicado con el nmero cero, esta es Sintaxis de arreglos la cual ser descrita a fondo en otra seccin. o El segundo mensaje imprime el segundo y tercer valor del arreglo. Ejecucin de clase Nombres. Los valores de entrada para el mtodo main son tomados directamente de la lnea de ejecucin del programa, por lo que una vez compilada la clase (javac Nombres.java) la ejecucin sera llevada a cabo de la siguiente manera: $ java Nombres Chuck Pepe Norris

En este caso el primer valor del arreglo de String's sera el Nombre Chuck, mientras el segundo y tercero serian Pepe y Norris respectivamente; inclusive si no proporciona ningn argumento ser generado un error ("Exception"), a continuacin se describe este mismo programa con un bloque try/catch para manejar el error de una manera apropiada: Cdigo Fuente NombresBlock.java
72

Daniel Oliva Bianco 2009

Programacin Java Bsico

public class NombresBlock { public static void main(String[] args) { try { System.out.println("Su nombre es: " + args[0]); System.out.println("Sus apellidos son: " + args[1] args[2]);

"

" +

} catch (ArrayIndexOutOfBoundsException ex) { System.out.println("Esta tratando de accesar datos fuera del Arreglo"); } catch (Exception ex) { System.out.println("Ocurri un error genrico"); } } }

Clase NombresBlock.

La nica diferencia entre esta clase y aquella descrita anteriormente es el Bloque try/catch. Al estar siendo ejecutadas las instrucciones de la seccin try, si es generado un error, se inicia la inspeccin sobre las secciones catch hasta que el error ("Exception") coincida con una declaracin. En esta caso, si son omitidos algunos parmetros de entrada para el programa, dentro del bloque try se estara tratando de acceder elementos no definidos en el arreglo, este tipo de error ("Exception") es precisamente ArrayIndexOutOfBoundsException, por lo que sern ejecutadas las instrucciones definidas dentro de este bloque. Ahora bien, ntese que las instrucciones del bloque catch con la clase Exception nunca son ejecutadas, lo anterior se debe a que el programa termina al ser atrapado ("catch") en el bloque catch inicial; la nica manera en que pudieran ser ejecutadas las instrucciones de este ltimo bloque sera si el programa generara otro error ("Exception") distinto a ArrayIndexOutOfBoundsException.

Daniel Oliva Bianco 2009

73

Programacin Java Bsico

"Streams"
Un "Stream" es un nombre genrico 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 representacin ms cruda de un juego de datos, pero una manera muy universal de acceder/guardar datos, inclusive la clase System.out.println utilizada en la gran mayora de los programas de este curso tambin es un "Stream"; en Java existen diversas clases utilizadas en conjuncin de "Streams", a continuacin se describen estas clases:

java.io.InputStream y java.io.OutputStream
Las principales clases para representar "Streams" son: InputStream y OutputStream, como su nombre lo indica la primera de estas es utilizada para "Streams" de Entrada (Input) mientras la segunda "Streams" de Salida (Output); a partir de estas dos clases son derivadas todas las clases que hacen uso de datos de entrada y salida. Algunas clases que heredan el comportamiento de InputStream son: FileInputStream y PipedInputStream y algunas clases que heredan de OutputStream son: ByteArrayOutputStream y ObjectOutputStream; existen otra gran cantidad de clases que heredan el comportamiento de estas clases bases, inclusive la clase/Mtodo System.out.println es heredada de la clase java.io.PrintStream la cual a su vez desciende de java.io.OutputStream. Se recomienda observar la documentacin incluida en el JDK para conocer el uso, comportamiento y mtodos de las diversas clases heredadas de InputStream y OutputStream.

java.io.Writer y java.io.Reader
Existen otras dos variaciones para las clases InputStream y OutputStream que son: Writer y Reader, la principal diferencia entre estas clases es que las primeras ofrecen lo que es conocido como byte-orientated I/O, mientras Writer y Reader ofrecen character-based I/O, en otras palabras las clases InputStream y OutputStream solamente soportan "Streams" de 8-bits byte, mientras las clases Writer y Reader soporta "Streams" de 16-bits. La importancia de 16-bits radica en Java utilizando Unicode, al utilizarse 8-bits no es posible emplear muchos caracteres disponibles en Unicode, adems debido a que las clases Writer y Reader son una adicin ms reciente al JDK, estas poseen mayor velocidad de ejecucin a diferencia de sus contra partes InputStream y OutputStream. Ambas variaciones siguen en uso hoy en da, inclusive existen dos clases que permiten una conversin hacia estas clases ms recientes:
Daniel Oliva Bianco 2009 74

Programacin Java Bsico


InputStreamReader convierte un InputStream a Reader OutputStreamWriter convierte un OutputStream a Writer

El uso de "Streams" en programacin es un tema muy extenso y en ocasiones considerado muy abstracto, por esta razn son descritos dos ejemplos en las siguientes secciones:

Ej 1: Cdigo Fuente LeerArchivo.java


import java.io.*; public class LeerArchivo { public static void main(String[] args) throws IOException { // Leer el Codigo Fuente de este Archivo BufferedReader in = new BufferedReader( new FileReader("LeerArchivo.java")); String s, s2 = new String(); while ((s = in.readLine()) != null) s2 += s + "\n"; in.close(); // Leer Datos Interactivamente BufferedReader stdin = new BufferedReader( new InputStreamReader(System.in)); System.out.print("Introduzca cualquier dato: "); s2 += "Usted agrego la linea \" " + stdin.readLine() + " \" en la linea de comandos";

// Depositar Datos en un Archivo de Texto try { BufferedReader leer = new BufferedReader( new StringReader(s2)); PrintWriter escribir = new PrintWriter( new BufferedWriter(new FileWriter("Archivo_Stream.txt"))); int lineaNo = 1; while ((s = leer.readLine()) != null) escribir.println(lineaNo++ + ": " + s); escribir.close(); } catch (EOFException e) { System.out.println("Final de Stream"); } } }

Clase LeerArchivo
Esta clase est diseada para leer el archivo de Cdigo Fuente presente, leer un rengln proporcionado al momento de ejecutarse el programa y finalmente depositar todo el contenido en otro archivo; al igual que el ejemplo anterior consta nicamente de su mtodo principal (main) y un bloque try/catch.

Daniel Oliva Bianco 2009

75

Programacin Java Bsico

Lectura de Datos

En la primer seccin es definida una clase BufferedReader, la cual lee el archivo de Cdigo Fuente, ntese que no es necesario colocar esta declaracin dentro de un bloque try/catch puesto que ya se sabe que el archivo existe. Se define un ciclo while que permanecer activo hasta que el resultado del mtodo readLine() sobre la referencia definida anteriormente equivalga a null. NOTA: El mtodo readLine retorna un resultado null ya que el archivo no contenga lneas. Dentro de cada iteracin, es concatenado cada rengln ledo del "Stream" y colocado en la variable s2. Es definida otra clase BufferedReader la cual es empleada para datos introducidos de la consola (System.in). El valor introducido por el usuario es concatenado a la variable s2 que contiene el archivo de cdigo fuente.

Escritura de Datos

Se inicia un Bloque try/catch. Se declara una instancia de la clase BufferedReader , la cual recibe como parmetro de entrada el String definido en la seccin de lectura. Es definida una clase PrintWriter que permite escritura de "Streams", esta clase recibe como parmetro de entrada la clase BufferedWriter la cual a su vez recibe la clase FileWriter, esta ltima toma como parmetro el archivo que ser generado (Archivo_Stream.txt). Se genera un ciclo while, el cual en cada iteracin asigna los valores de cada rengln ledo hacia la referencia de la clase PrintWriter. Se define un error ("Exception") del tipo EOFException el cual sera generado en caso de llegar a un fin prematuro del archivo.

Ej 2: Cdigo Fuente Calculo.java


import java.io.*; public class Calculo { public static void main(String[] args) throws IOException String s; int lineas = 1; try { System.out.print("Que archivo desea analizar ? "); BufferedReader stdin = new BufferedReader( new InputStreamReader(System.in)); String archivo = stdin.readLine(); BufferedReader sarchivo = new BufferedReader( new FileReader(archivo)); while (( s = sarchivo.readLine()) != null) lineas++; System.out.println("El archivo " + archivo + {

Daniel Oliva Bianco 2009

76

Programacin Java Bsico


" Codigo."); } catch (IOException exc) { System.err.println(exc); System.out.println("Asegurese de haber proporcionado " + " la extension del archivo (\".java\")"); } finally { System.out.println(""); System.out.println("Es la mejor manera de aprender Streams, practicando!"); } } } contiene " + lineas + " renglones de

Clase Calculo
Esta clase est diseada para interrogar al usuario sobre determinado archivo, leer su contenido y finalmente indicar al usuario el nmero de renglones que contiene; consta nicamente de su mtodo principal (main) y un bloque try/catch/finally.

De inicio son definidos dos campos para utilizarse dentro del mtodo principal (main) . Posteriormente se define el bloque try/catch/finally con las siguientes caractersticas: try o Se despliega una pregunta al usuario para que proporcione el nombre del archivo a leer. o Es definida una clase del tipo BufferedReader la cual permite archivar datos temporales en memoria ("Buffer") o El argumento que recibe al ser generada la clase anterior es otra clase llamada InputStreamReader, la cual permite leer datos de un "Stream", en este caso siendo System.in que representa el shell de ejecucin. o Se extrae el nombre del archivo a travs del mtodo readLine() y es asignado a una referencia de String. o Es generada una nueva instancia de la clase BufferedReader a la cual ser asignada el archivo en cuestin. o El argumento que recibe al ser generada la clase anterior es otra clase llamada FileReader, la cual contiene los mecanismos necesarios para leer un Archivo, y en este caso recibiendo el nombre del archivo. o Se entra en un ciclo while el cual permanecer activo hasta que el resultado del mtodo readLine() sobre la referencia definida anteriormente equivalga a null. NOTA: El mtodo readLine retorna un resultado null ya que el archivo no contenga lneas.
77

Daniel Oliva Bianco 2009

Programacin Java Bsico


o o

Dentro de cada iteracin de ciclo se incrementa la variable (primitivo)


lneas la cual representa el nmero de lneas en el archivo.

Finalmente se enva a pantalla el resultado obtenido del ciclo.

catch Dentro de esta seccin del Bloque se intenta atrapar un error ("Exception") del tipo IOException, este tipo de error es generado al no poderse iniciar lectura/escritura en un programa. o En este programa el error sera generado al intentarse leer un archivo inexistente proporcionado por el usuario. o En caso de generarse este error, se enva a pantalla una sugerencia as como el error completo. finally o Esta seccin del Bloque describe instrucciones que siempre deben ser ejecutadas independientemente de ser generado un error ("Exception") o no. o Se imprime a pantalla un mensaje cada vez que sea ejecutado el programa, ocurra o no ocurra un error ("Exception").
o

Daniel Oliva Bianco 2009

78

Você também pode gostar