Programación Java Básico

OBJETOS, JAVA Y JDK EL PROCESO DE ABSTRACCIÓN, LENGUAJES COMPUTACIONALES Y OBJETOS. JAVA Y SUS CARACTERÍSTICAS JDK/J2SE. COMPOSICIÓN, CLASES Y LIBRERÍAS ("PACKAGES"). UN PROGRAMA JAVA. LIBRERÍAS ("PACKAGES") Y JAR'S. ARCHIVOS JAR ("JAVA ARCHIVES") LA VARIABLE CLASSPATH. CALIFICADORES DE ACCESO: PUBLIC, PRIVATE, PROTECTED, STATIC Y F INAL. VARIABLES, CONSTRUCTORES, MÉTODOS Y COMENTARIOS. OBJETOS Y PRIMITIVOS. CAMPOS ("FIELDS") Y MÉTODOS. SIGNIFICADO DE RETURN CONSTRUCTORES CONSTRUCTOR OBLIGATORIO MÉTODOS Y PARÁMETROS POR REFERENCIA GENERACIÓN DE DOCUMENTACIÓN (VÍA COMENTARIOS) HERENCIA, INTERFACES Y POLIMORFISMO HERENCIA ("INHERITANCE") POLIMORFISMO USO DE "CASTING" INTERFACES Y CLASES ABSTRACTAS. INTERFACES. HERENCIAS MÚLTIPLES CONDICIONALES, OPERADORES, CICLOS, ARREGLOS CONDICIONALES IF/ELSE USO DE LOS CICLOS FOR Y WHILE SINTAXIS DEL CICLO WHILE USO DE SWITCH OPERADORES MATEMÁTICOS, RELACIONALES Y LÓGICOS 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

Programación Java Básico OPERADORES RELACIONALES. OPERADORES MATEMÁTICOS ARREGLOS (ARRAYS). VECTORES, HASHTABLES Y OTRAS ESTRUCTURAS DE DATOS. VECTORES HASHTABLES OPERADORES, ERRORES Y DATOS DE ENTRADA/"STREAMS". DEFINICIÓN DE ERRORES Y BLOQUES TRY/CATCH/FINALLY. DEFINICIÓN DE ERRORES PROPIETARIOS DATOS DE ENTRADA "STREAMS" 58 59 60 63 63 66 68 68 70 72 74

Daniel Oliva Bianco 2009

2

Programación Java Básico

Objetos, Java y JDK
El Proceso de Abstracción, Lenguajes Computacionales y Objetos.
Todo lenguaje de programación ofrece un proceso de abstracción sobre un concepto extraído 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 abstracción es que reside la facilidad/complejidad de generar programas funcionales capaces de resolver el problema espacial. El lenguaje ensamblador es una abstracción 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 aún requieren de procesos de abstracción considerables. Lo anterior produce programas que son difíciles de escribir y actualizar por la simple razón que el problema espacial dista en grandes proporciones del mapeo maquinal; frente a estas deficiencias han surgido lenguajes más apegados al problema real tales como: PROLOG donde todo problema es mapeado a una cadena de decisiones o LISP donde todo problema es convertido a listas. Aquí es donde los lenguajes orientados a objetos salen a relucir, esto se debe a que permiten llevar a cabo un mapeo más directo con el problema espacial (real). Chitral Somapala, describió las 5 principales características 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 también se pueden hacer solicitudes a este Objeto en sí. En teoría, cualquier elemento en el problema espacial (real) (edificios, servicios, automóviles, u otra entidad) puede ser representado como un objeto en un programa. Un programa es un conjunto de Objetos, enviándose 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 función 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 detrás 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 cuestión. La característica más 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 sección específica de este curso.
3

Daniel Oliva Bianco 2009

a continuación se describen las características especificas del Lenguaje Java y porque es considerado uno de los más avanzados en su ramo. para crear un Objeto de esta clase y ser utilizado dentro de un programa es necesario generar una instancia del mismo. candil. Daniel Oliva Bianco 2009 4 . Lo anterior demuestra una de las principales características de los lenguajes orientados a Objetos. en la segunda línea.prender(). a través de referencias es posible generar distintos Objetos del mismo tipo cada uno con su propio comportamiento: Lampara candil = new Lampara().prender(). apagar. esto se demuestra a continuación: Lampara candil = new Lampara().elevar(). El primer renglón genera una instancia de la clase Lampara la cual es asignada a la referencia candil.apagar().prender(). Lampara manual = new Lampara(). a través de esta referencia se manda llamar el método prender() definido en la misma clase. candil.girar(). candil. jardin. girar y cambiar.apagar(). manual.Programación Java Básico En la gráfica anterior se puede observar una clase conformada por una lámpara (problema espacial real) a la cual pueden ser enviados distintos mensajes tales como: prender. sin embargo. jardin. candil. Lampara jardin = new Lampara().

sin embargo. sin embargo.HP-UX hasta productos como Bases de Datos Oracle y Servidores de Aplicaciones BEA. Interoperabilidad de Plataforma Esta característica forma parte del lema Java: "Write once. El proceso de creación es muy similar a la de otros lenguajes: una vez creado el Código Fuente es necesario compilarlo para generar un binario. este binario denominado Byte-Code en Java lleva por extensión . Hoy en día. Java ha venido suplantando su uso debido a dos características muy especificas que C++ no ofrece.Programación Java Básico Java y sus características Entre los lenguajes orientados a Objetos hoy en día Java figura entre los más utilizados comparado con sus homólogos. Esta interoperabilidad de ejecución se debe a que el Byte-Code es ejecutado en una maquina virtual llamada "Java Virtual Machine". existen diversos JVM ("Java Virtual Machines") para distintas plataformas y ambientes que oscilan desde los Sistemas Operativos Linux. a diferencia de otros lenguajes este binario (Byte-Code) puede ser ejecutado en diversas plataformas obteniéndose el mismo resultado final. run everywhere" (Escríbalo una vez. Daniel Oliva Bianco 2009 5 .class. pre-aparición de Java el lenguaje C++ se encontraba en la cúspide para desarrollos de Software con orientación a Objetos. ejecútelo en todos lados). es a través de este componente que se logra una ejecución idéntica en distintos ambientes. Windows . Solaris. a continuación se ilustra este concepto. esto permite que código escrito en Java pueda ser ejecutado en cualquier ambiente produciéndose los mismos resultados.

En el mundo Java. ahora bien. lo cual le permite ir eliminando las instancias de Objetos que han dejado de ser utilizadas en un programa. en el proceso despreocupándose de la destrucción de Objetos. el uso de esta metodología 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. Suponga que ha diseñado un programa que invoca la creación de miles de instancias. esta administración explicita de instancias de Objetos no es necesaria debido al proceso de "Garbage Collection". eventualmente su memoria ("RAM") puede fugarse si no ha tomado las precauciones necesarias para deshacerse/destruir estas instancias de Objetos. esto trae consigo el problema denominado "fuga de memoria" ("memory leak"). Aunque el concepto de recolección de basura ("Garbage Collection") posee una infinidad de detalles en su fondo. el cual significa que los recursos de memoria ("RAM") han sido agotados en el sistema. este mecanismo a través del JVM ("Java Virtual Machine") inspecciona constantemente la memoria empleada por Java.Programación Java Básico Recolección de Basura ("Garbage Collection") En la sección anterior se pudo observar como son generadas distintas instancias de Objetos a través de una referencia. también tiene sentido asumir que la memoria ("RAM") es limitada en todo sistema. es conveniente saber que este proceso es llevado automáticamente por Java. sin embargo. Si alguna vez ha programado en el lenguaje C++ debe estar familiarizado con este concepto. y que es una facilidad no ofrecida en otros lenguajes como C++ Daniel Oliva Bianco 2009 6 . es lógico que estas instancias de Objetos requieren memoria ("RAM") para mantener su información.

Fechas y Números así como todas las funcionalidades base esperadas de un lenguaje computacional como: Ordenamiento y manipulación de Arreglos. generación de documentación. los cuales ofrecen lo siguiente: • • • • Un compilador Java. aunque claro está. el JDK/J2SE incluye una serie de ejecutables utilizados para diversas tareas como: Creación de ejecutables (Byte-Code). existen JDK's/J2SE para diversos ambientes y plataformas. Soporte de Criptografía (Seguridad) y Manipulación de XML entre otras funcionalidades. al igual que programas compilados en otros JDK's/J2SE pueden ser ejecutados en este ambiente. Para este curso se hace uso del JDK/J2SE de Sun Microsystems . cualquier programa generado en este JDK puede ser ejecutado otros ambientes. JDK ("Java Development Kit") y J2SE ("Java 2 Standard Edition") son nombres para el mismo componente utilizado en ambientes Java. Fragmentos Auditivos. entre otros ejecutables. creación de "Stubs" y "Skeletons" a través de IDL e inclusive una implementación de un ORB ("Object Request Broker") para interactuar con ambientes CORBA. Un JVM ("Java Virtual Machine"). Hoy en día.Programación Java Básico JDK/J2SE. Daniel Oliva Bianco 2009 7 . Un conjunto de clases base utilizadas para generar programas Java. Operaciones matemáticas complejas (Trigonométricas y Exponenciales) y escritura/lectura de "Streams". capaz de generar Byte-Code. Objetos CORBA. Además de estas clases base. el JDK/J2SE posee otra serie de clases especializadas que también ofrecen la base para la creación de otros componentes Java que incluyen: Applets. El conjunto de clases base proporcionadas por el JDK/J2SE incluyen clases de uso común tales como : Manipulación de String's. capaz de ejecutar Byte-Code. Aunado a las clases base. Otras utilerías para administrar código escrito en Java. el cual agrupa las diversas funcionalidades necesarias para desarrollar programas Java.

jar server client Como se puede observar. Dependiendo de la manera en que haya instalado la documentación del JDK. jre : Incluye el ambiente necesario para ejecutar programas Java.jar | / \ | / \ localedata.jar | | javac* dt.2 ___________|_________________ | | | bin lib jre | | ________|__________ java* tools.jar ext security i386 applet fonts charsets.4. la estructura se encuentra dividida en tres grandes partes: • • • bin : Incluye los ejecutables para la generación de programas Java.jar bin lib javap* | ________ ___|___ _________ ________ _______ javah* java* | | | | | | javadoc* rt. lib : Contiene las librerías (Clases) base empleadas en la generación de la gran mayoría de programas Java. Daniel Oliva Bianco 2009 8 .Programación Java Básico La estructura de directorios del JDK/J2SE es la siguiente: JDK 1. se recomienda observarla en estos momentos para que se familiarice con sus clases Base. el cual a su vez se encuentra sub-dividido en distintos directorios.

Dentro de la definición de la clase se deben incluir los respectivos métodos que podrán ser invocados.println("Un despliegue de Datos").java public class Basico { public static void main(String args[]) { System.out. Código Fuente Basico.java debe incluir una definición de una clase llamada Basico. ambos inician con letra mayúscula lo cual es una convención llevada a cabo para la definición de clases. el uso y variación de calificadores será descrito posteriormente cuando se aborde el tema de librerías ("packages") donde es de influencia su uso. lo cual indica que no será retornado ningún valor 9 Daniel Oliva Bianco 2009 . dicho método es invocado por "default" al ejecutarse el programa (Clase). en este caso el archivo Basico. } } Programa Java Introducción Basico. en este caso se utiliza el calificador public. Un programa Java.java únicamente es definido el método main. En el caso del programa Basico. En base a su ambiente.Programación Java Básico Composición. el cual ilustra la sintaxis así como estructura de un programa básico. Para entrar en materia es necesario escribir nuestro primer programa Java. nótese que ambos nombres coinciden en su sintaxis. La definición del método indica lo siguiente: • • Primeramente se definen los calificadores del método en este caso siendo public static Posteriormente se define el valor de retorno del método: void. Para definir una clase se utiliza el vocablo class así como un calificador de acceso. Nótese que el método inicia con letra minúscula. esta es otra convención utilizada para diferenciarse de las distintas clases.java La primer característica de un programa Java es que este debe definir una clase que lleve por nombre el mismo nombre del archivo fuente. esto es. abra un Editor de Textos para generar el siguiente ejemplo. clases y Librerías ("Packages").

java Lo anterior genera un archivo llamado Basico.class. al momento de ejecutarse determinada clase siempre será ejecutado todo el contenido dentro de dicho método. es este sentido inalterable se refiere a sus características: • • • Siempre debe incluir los calificadores: public y static. Su parámetro de entrada siempre será un arreglo de String's (String[]) el cual es tomado de la línea de comandos o una fuente alterna. dicho método representa el único mecanismo automático para realizar tareas al invocarse una clase.class. siempre debe indicar el valor void como retorno. Nótese que el comando java recibe el nombre de la clase sin la extensión . para ejecutar este Byte-Code es empleado el comando java: $ java Basico Al invocar el comando anterior será ejecutada la clase Basico.Programación Java Básico • • • Le sigue el nombre del método: main Dentro de paréntesis se incluyen los parámetros de entrada para el método (String args[]). Nunca puede retornar un valor como resultado. Daniel Oliva Bianco 2009 10 .println envía un mensaje a la pantalla Método principal main El método principal main de una clase Java es inalterable.out. Finalmente la clase/Método System. esto es.class. Para generar una clase compilada (Byte-Code) se utiliza el comando javac : $ javac Basico. Aunque no es un requerimiento definir el método main dentro de toda clase Java. por ende.

así como dar cierta estructura para mantener una organización de código. Conforme empieza a crecer un desarrollo de Software surge la necesidad de reutilizar ciertos componentes que ya han sido escritos.test . Java toma una perspectiva nueva respecto a otros lenguajes. esta sub-clasificación se Daniel Oliva Bianco 2009 11 . puesto que es una característica de Dominios en Internet. esto es. esta organización se lleva a cabo mediante librerías. Esta Colisión de Nombres se da cuando dos clases llevan el mismo nombre y ambas requieren ser utilizadas dentro de un programa en particular. adoptando una convención a partir de Dominios en Internet. empleando Dominios en Internet se garantiza que el nombre de la clase/Librería sea única.Programación Java Básico Librerías ("Packages") y JAR's. abra un Editor de Textos para generar el siguiente ejemplo. nuestros programas y por ende librerías ("packages") estarán basados en el nombre de la empresa/dominio para la cual son diseñados. se debe mencionar que no existe ninguna restricción en el número de directorios anidados. además de esto. esto es. Estructura de Directorios para utilizar Librerías ("Packages") Para utilizar "Packages" en Java es necesario generar una estructura de directorios que lleven la misma secuencia de las librerías que desean diseñarse. lo anterior se ilustra mejor a través de un ejemplo: En base a su ambiente. es necesario crear una estructura de directorios para generar las determinadas clases. es posible que existan librerías de 5 o 10 niveles de profundidad. Para que puedan ser asignadas clases a determinadas librerías es necesario indicar dicha Librería ("Package") en la definición inicial de un programa. al igual que otros lenguajes. observe: +-com+| +-test +| +-escritura+| +-graficas+| +-correo+| +-errores+| +-auxiliares+- Lo anterior demuestra una estructura para las librerías del dominio com. lo anterior permite evitar la tan conocida Colisión de Nombres en Software. denominadas "packages" en el mundo Java .

java Daniel Oliva Bianco 2009 12 .test. public class Pantalla { public static void sinSalto(String s) { System.test .escritura.test. debe mencionarse que este calificador debe ser la primer declaración en todo programa Java (Salvo no vaya a ser incluido en librerías). } public static void conSalto(String s) { System.escritura.escritura. Se define la clase con los respectivos métodos sinSalto y conSalto. Lo anterior sería incluido en todos los programas pertenecientes a la librería ("Package") com. lo anterior es sumamente importante al llevarse acabo la compilación para la generación de Byte-Code Código Fuente Pantalla.out. } } • • • • Primeramente se declara la librería ("package") a la que será asignada el programa a través del vocablo package.Programación Java Básico va realizando en base a los requerimientos de las librerías y es dentro de cada sub-directorio donde son colocadas las distintas clases. en base a su ambiente (Linux o Windows) por favor genere dicha estructura para colocar esta clase package com.print(s). NOTA: Recuerde que este programa debe residir dentro del directorio com/test/escritura/. se debe incluir un calificador de la librería en el código fuente de cada clase: package com.println(s).java La siguiente clase define dos métodos que pueden ser utilizados para imprimir resultados a pantalla: La siguiente clase debe ser colocada bajo la estructura de directorios com/test/escritura. NOTA 2: Observe que esta clase no posee el método principal main. Para compilar esta clase basta ejecutar el comando: $ javac Pantalla. Además de la generación de estos directorios. recuerde que además de este calificador el programa debe estar colocado en la estructura de directorios correspondiente.out.

primera. import com.conSalto("Esta línea si tiene salto!"). aunque posterior a la definición de package (si existiese) .escritura.sinSalto("Termina sin salto").sinSalto("Línea Continua"). esto es llevado a cabo mediante el calificativo import como se demuestra a continuación: import com.auxiliares. abra un Editor de Textos para generar el siguiente ejemplo.test.println(" Se termina el uso de funciones").class.conSalto("Esta linea tambien tiene salto"). System.out.*.conSalto("Esto es un renglon CON salto de linea"). Es posible importar todas las clases de una librería a través de un asterisco (*).graficas esté disponible en el programa en cuestión.sinSalto("Línea Continua"). primera.java. Código Fuente MandaPantalla. Para emplear Librerías ("Packages") en un programa es necesario importarlas. primera.java La siguiente clase manda llamar métodos definidos en la clase Pantalla. La siguiente clase debe ser colocada bajo la estructura de directorios com/test/auxiliares. primera.Recuadro. En la siguiente sección será diseñado un programa que haga uso de esta librería ("package").graficas. en base a su ambiente (Linux o Windows) por favor genere dicha estructura para colocar esta clase package com. primera. las características del uso de import son las siguientes: • • • Se debe declarar al inicio de un programa. La declaración anterior permite que la clase Recuadro de la librería ("Package") com. } } • Primeramente se declara la librería ("package") a la que será asignada el programa a través del vocablo package.Programación Java Básico Lo anterior genera el archivo de ByteCode: Pantalla. Se pueden utilizar un número ilimitado de import.test. 13 Daniel Oliva Bianco 2009 .test.test. primera. public class MandaPantalla { public static void main(String args[]) { Pantalla primera = new Pantalla(). antes de la definición de la clase. Utilización de Librerías ("Packages") En base a su ambiente.

razón que también está relacionada con la variable CLASSPATH y será descrita a fondo en su sección. aunque esta clase radique dentro del directorio com/test/auxiliares es necesario llevar a cabo la compilación desde la raíz (. La compilación (Generación de Byte-Code) de esta clase requiere que esta sea llevada a cabo bajo el directorio raíz de la estructura de clases. los detalles de esta rutina serán descritos en la sección de CLASSPATH./com). esto es. Daniel Oliva Bianco 2009 14 .Programación Java Básico • • Posteriormente se importan las clases que serán utilizadas en el programa a través del vocablo import. lo anterior se debe a que esta clase requiere ubicar (importar) las clases de la Librería ("Package") com/test/escritura. Se define el método main dentro del cual se genera una instancia de la clase Pantalla (aquella importada) y sobre la que posteriormente se mandan llamar los distintos métodos a través de su referencia. • Para ejecutar este programa también se requiere descender al directorio raíz de la librería ("Package").

jar. Una archivo JAR es simplemente un archivo comprimido que incluye una estructura de directorios con clases. Declarar dichas clases de una manera más eficiente en la variable CLASSPATH. Generación de Archivo JAR Para generar un archivo JAR es necesario colocarse bajo el directorio raíz de la estructura de directorios donde residen las clases: $ jar cvf test . lo anterior permite: • • Distribuir/Utilizar clases de una manera eficiente a través de un solo archivo. NOTA: Este comando únicamente despliega el contenido.jar con todos los archivos . Extracción de Archivo JAR En ocasiones es conveniente extraer el contenido de un archivo JAR para llevar acabo modificaciones. esto se realiza a través del siguiente comando: $ jar xvf test . En la siguiente sección se describe como son utilizados estos archivos JAR en la compilación/ejecución de programas Java.jar.jar El comando anterior despliega el contenido del archivo JAR test . Daniel Oliva Bianco 2009 15 . para este problema han sido diseñados los archivos JAR ("Java Archives").Programación Java Básico Archivos JAR ("Java Archives") Una vez acumuladas un número substancial de clases en una Librería("Package") será necesario colocarlas en una estructura que permita una distribución fácil y práctica.jar * Al ejecutar el comando anterior se genera una archivo JAR llamado test . se utiliza un comando similar: $ jar tvf test . Observar contenido de Archivo JAR Para observar el contenido de un archivo JAR.class que residen en la estructura de directorios.jar El comando anterior genera una estructura de directorios con el contenido del archivo JAR test . si ha generado 100 o 500 clases sería muy impráctico distribuir la estructura de directorios a un tercero para ser utilizada. esto es.

) para Windows].Programación Java Básico La Variable CLASSPATH.:) indica que toda estructura de directorios residente en el directorio actual de compilación/ejecución será accesible. En Windows NT: Seleccione el Tab Environment En Windows 2000/XP : Seleccione el Tab Advanced Posteriormente entre en Variables de Entorno ("Environment Variables"). los valores de la variable CLASSPATH se encuentran separados por dos puntos (:) [ o punto y coma (. Finalmente la última declaración en CLASSPATH (:.jar bajo el directorio /usr/local/jdk/lib estará accesible al compilar/ejecutar programas Java. Como se puede observar en el despliegue anterior. 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. en ella se definen los directorios base de clases así como cualquier archivo JAR que requiera ser cargado al compilar/ejecutar programas Java. la respuesta a esta pregunta es la conocida variable CLASSPATH. 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.: Para observar la variable CLASSPATH en un ambiente Windows NT/2000/XP se utiliza el siguiente comando: Seleccione: Start. Al utilizar clases y Librerías en ambientes Java surge otro tema en lo que concierne a su ubicación: Cuales clases/Librerías están disponibles al momento de Compilar/Ejecutar programas Java? . Las estructuras de directorios ubicados bajo /root/mislibrerias también serán localizadas al invocar el JVM ("Java Virtual Machine"). Localize "CLASSPATH" en las variables del usuario ("User Variables") y variables de Sistema ("System Variables").jar:/root/mislibrerias/:. el valor de CLASSPATH declarado anteriormente significa: • • • El archivo JAR llamado tools. Daniel Oliva Bianco 2009 16 . ya sea java o javac.Settings -Control Panel y el icono System. A través de esta variable se indica donde residen las clases/Librerías ("Packages") de nuestro ambiente.

• • El comando anterior modifica el valor de la variable CLASSPATH agregando el archivo JAR (test .bashrc.. de la siguiente manera: CLASSPATH="/usr/local/mislibrerias" export CLASSPATH • La modificación de la variable CLASSPATH a nivel de sistema para ambientes Windows es llevada a cabo de la siguiente manera: Seleccione: Start. En Windows NT: Seleccione el Tab Environment En Windows 2000/XP : Seleccione el Tab Advanced Posteriormente entre en Variables de Entorno ("Environment Variables"). si usted posee otros programas que hacen uso de Java será necesario modificar el valor de CLASSPATH al nivel de sistema..jar.Programación Java Básico Modificar la Variable Ambiental CLASSPATH • Para modificar el valor de la variable ambiental CLASSPATH en un sistema Unix/Linux se utilizaría el siguiente comando: $ export CLASSPATH=/root/test . lo cual permite mantener los valores preexistentes. será únicamente el Shell existente el cual reflejará estos cambios. el termino $CLASSPATH (%CLASSPATH% en Windows) indica el valor previo de la variable.jar:$CLASSPATH • Para modificar el valor de la variable ambiental CLASSPATH en un sistema Windows NT/2000/XP se utilizaría el siguiente comando: C:> set CLASSPATH=C:\test .%CLASSPATH%. Daniel Oliva Bianco 2009 17 . lo anterior en Sistemas Unix se hace modificando el archivo /etc/profile o el perfil del usuario ~/.jar). Cabe mencionar que al modificar la variable CLASSPATH de esta manera. Localize o genere la variable "CLASSPATH" en variables de Sistema ("System Variables"). esto es.Settings -Control Panel y el icono System.

java [Windows] A través del flag classpath o cp se indica que al momento de llevarse acabo la compilación de la clase Conexion..jar" Conexion. para esto pueden ser pasados parámetros al tiempo de invocar los comandos java o javac: $ javac [Linux] -classpath "$CLASSPATH:.:/lib/postgresql.:/lib/postgresql.java C:> javac [Windows] -classpath "%CLASSPATH%.Programación Java Básico Utilizando la variable CLASSPATH al invocarse comando.jar. por lo que modificar la variable CLASSPATH al nivel de ambiente sería innecesario. Este mismo mecanismo puede ser utilizado para los diversos comandos Java.C:\test .java $ javac -cp "$CLASSPATH:. Conexion.jar además del valor actual ($CLASSPATH en Linux o %CLASSPATH% en Windows) de la variable ambiental CLASSPATH.java. Daniel Oliva Bianco 2009 18 .C:\test o .java [Linux] C:> javac -cp "%CLASSPATH%. Conexion.jar" Conexion. sea cargado el archivo JAR postgresql.. lo cual permite ubicar/cargar librerías ("packages")/Clases al momento de ejecución. java o javac y otro En ocasiones es necesario cargar/ubicar ciertas librerías ("packages")/clases que solo serán utilizadas ocasionalmente...jar.

si se intenta acceder cualquier elemento de este tipo dentro de otra clase será generado un error de compilación. protected: clases Heredadas y misma clase. pero no aquellos declarados como private en padre. además de los calificadores de acceso que permiten restringir el uso de métodos/campos a determinadas situaciones. mientras otras permanecerán inmóviles. En otras palabras. excepto a aquellos que utilicen el calificador private. El uso de protected es utilizado bajo los conceptos de Herencias ("Inheritance"). public: Acceso libre . la importancia de estos cambios requiere que sean utilizados calificadores para permitir/negar el acceso a ciertos segmentos del programa. El uso de calificadores de acceso en Java tiene sus bases en el uso de librerías ("packages"). Protected. El calificador private indica que dicho componente será accesible únicamente dentro de la clase en cuestión. la clase hijo tendrá acceso a todos aquellos campos/métodos definidos como protected en padre. esto permite evitar futuros quebrantos en otras clases como fue mencionado al inicio. también existen otros calificadores que afectan directamente la creación y uso de instancias por clase estos calificadores son static y final. private: Solo en la misma clase . aunque este tema será descrito en otra sección. campo o clase. cuales métodos/campos de estas 300 clases puede modificar sin quebrantar los otros programas que hacen uso de estas Aquí puede surgir un serio problema sino han sido utilizados los calificadores de acceso acordemente. desde luego el uso de este calificativo en clases que serán modificadas constantemente es fuertemente desalentado. ya que puede quebrantar dependencias forjadas en versiones previas. mediante protected es posible acceder a elementos de la clase heredada ("Inherited"). Daniel Oliva Bianco 2009 19 . Static y Final. se le ha solicitado una modificación radical a estos objetos base. Ahora bien. analicemos el siguiente caso: Usted ya diseño 300 clases que están siendo re-utilizadas por otros programas.Programación Java Básico Calificadores de acceso: Public. El calificador private suele utilizarse en clases que serán modificadas continuamente. al ser diseñado un programa existen diversas funciones/métodos y variables dentro de éste. El uso del calificador public significa que toda definición será accesible de cualquier punto. algunas de estas requerirán ser modificadas conforme incrementen las necesidades del programa. si determinada clase hijo hereda el comportamiento de una clase padre. Su uso implica un acceso global. ya sea un método. Private. sin embargo.

como fue mencionado anteriormente. el método main puede ser llamado automáticamente al invocarse la respectiva clase debido a que no se encuentra asociado con ningún tipo de instancia. Todos los elementos definidos dentro de una estructura static deben ser static ellos mismos. La segunda situación para el uso de static puede ser ejemplificada perfectamente a través del método main Java.Programación Java Básico Ningún Calificador: clase en Librería y misma clase . Finalmente. sin embargo. El primer uso de static puede ser poco evidente. Dos aspectos característicos 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. Daniel Oliva Bianco 2009 20 . La teoría del concepto static puede ser un poco difícil de digerir. static: Una sola instancia . desde luego la descripción anterior esta trivializada. sin embargo. conforme se avance en el presente curso serán ilustrados otros ejemplos con este mecanismo. en caso de requerirse un elemento como un apagador pudiera resultar sobrado generar una instancia para cada Lampara. poseer una instancia ya definida para poder ser invocados. cuando no es empleado ninguno de los calificadores de acceso mencionados anteriormente los elementos son considerados amigables. El uso del vocablo static ha venido siendo utilizado en los métodos principales (main) de los programas escritos anteriormente. y es bajo estas dos circunstancias que es empleado el calificador static. esto implica que todo campo/método carente de calificador será accesible dentro de todas clases pertenecientes a su misma librería ("package"). conforme avance el curso serán descritos diversos fragmentos de código para dejar en claro su uso. o bien. 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. su uso está relacionado directamente al uso de instancias en clases. esto implica que su comportamiento siempre será el mismo independientemente de la instancia que realza su llamada. no es lo mismo llamar/invocar que crear/generar. NOTA: Lo anterior no implica que no puedan ser generadas instancias dentro de un elemento static. en ocasiones es necesario o conveniente generar elementos que tomen un mismo valor para cualquier número de instancias generadas o bien invocar/llamar métodos sin la necesidad de generar instancias. pero tomemos el caso de la clase mencionada al inicio de este curso de una Lampara.

A diferencia de static que implica una sola instancia.Programación Java Básico final: Una sola instancia y definitiva. Generalmente final es utilizado en aquellos elementos que no serán modificados al momento de ejecutarse ("Run-Time") un programa o clase . el término final lleva dicha instancia a una definición única y como su nombre lo implica final. a través de final se asigna un valor que no podrá ser modificado bajo ninguna circunstancia al momento de ejecución ("Run-Time). El calificador final estrechamente relacionado con el uso de static implica una asignación única y definitiva al elemento de una clase. De igual manera que la utilización de static el uso de final será ilustrado conforme se avance en este curso. en efecto logrando un nivel de eficiencia en ejecución. Daniel Oliva Bianco 2009 21 .

Al utilizar referencias en Java estas pueden ser inicializadas sin que pertenezcan a ninguna instancia de Objeto: String let. La declaración anterior genera una referencia.prender(). pudo notar que todo gira alrededor de instancias de Objetos que son manipuladas a través de referencias: Lampara candil = new Lampara(). Aunque estrictamente hablando un primitivo no es una clase a través de un primitivo se facilita el uso de valores comúnmente utilizados en lenguajes de programación. dichas estructuras son conocidas como primitivos. Constructores. Métodos y Comentarios. sin embargo. Objetos y Primitivos. String let = new String("Algo sencillo") La declaración anterior no solo genera una instancia nueva de la clase String. es por esto que Java ofrece un mecanismo simple para definir estructuras de datos como alternativa a utilizar clases/Objetos. donde el generar una instancia de clase resultaría en un proceso tardado y mecánico. Al diseñar sus primeros programas en Java. este mecanismo de agregar valores al generar una instancia es llevada a cabo a través de métodos denominados constructores los cuales serán descritos posteriormente. sino le asigna un valor inicial ("Algo sencillo") el cual es asignado a la referencia let. esta no es asociada con ninguna instancia de Objeto.Programación Java Básico Variables. candil. para llevar a cabo este proceso es necesario utilizar el vocablo new. Daniel Oliva Bianco 2009 22 . El hecho de generar instancias de objetos es un proceso involucrado (hablando en términos computacionales más no en sintaxis) .

Character C = new Character(c). en la tabla anterior se describen los rangos de dichos primitivos así como sus respectivos "Wrappers". vale mencionar que existen diversos mecanismos para convertir de clases tipo Objeto ("Wrappers") a primitivos y viceversa.1 +127 +215-1 +231-1 +263-1 IEEE754 IEEE754 Valor Default false `\u0000' (null) (byte) 0 (short) 0 0 0L 0.0f 0. posteriormente se genera una instancia de la clase Character (Nótese el uso del vocablo new). La primer línea genera un primitivo el cual es asignado a la variable c. el uso de "Wrappers" (Objetos) para primitivos es empleado bajo ciertas circunstancias. sin embargo. Daniel Oliva Bianco 2009 23 .0d "Wrapper" Boolean Character Byte Short Integer Long Float Double Void Nótese que estos primitivos inician con letra minúscula.Programación Java Básico 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 Tamaño 16-bit 8-bit 16-bit 32-bit 64-bit 32-bit 64-bit Valor Mínimo Unicode 0 -128 -215 -231 -263 IEEE754 IEEE754 Valor Máximo Unicode 216. estos "Wrappers" son clases utilizadas como contra parte de primitivos: char c = 'x'.

Automoviles vw = new Automoviles(). los métodos ya fueron descritos en los ejemplos anteriores. abra un Editor de Textos para generar el siguiente ejemplo. reciben un valor "default" (primitivos) En Java existen ciertos campos que son definidos como final. su significado Daniel Oliva Bianco 2009 24 .println("Autos Volkswagen: " + vw. Posteriormente. al ser definidos los campos al nivel de clase (y no dentro de un método como el ejemplo anterior) se garantiza que los campos puedan ser manipulados de cualquier método de la clase. Automoviles jeep = new Automoviles().out. } } Clase Automoviles • • • • Como en todo programa Java. en este caso primitivos.cantidad = 3. sin embargo. nótese que aquellas instancias que no asignaron valores a sus campos("fields"). Se define el método principal main y dentro de este se generan tres instancias de la clase. Inmediatamente después son definidos dos campos ("fields") dentro de la clase.cantidad + " Doble Traccion: " + jeep. primeramente se define la clase a través del vocablo class. jeep. System. vw.doble_traccion).doble_traccion).println("Autos Ford: " + ford.java public class Automoviles { int cantidad. Cuando se define una clase esta puede contener dos tipos de elementos: Campos ("Fields") o Métodos.doble_traccion). System.cantidad = 2. se imprimen a pantalla los valores de las diversas instancias con sus respectivos campos("fields").Programación Java Básico Campos ("Fields") y Métodos.doble_traccion = true. un campo es un objeto o primitivo utilizado para guardar datos en cada instancia de un objeto: En base a su ambiente. System.println("Autos Jeep: " + jeep. ford. public static void main(String args[]) { Automoviles ford = new Automoviles(). Código Fuente Automoviles.cantidad + " Doble Traccion: " + ford.out.cantidad + " Doble Traccion: " + vw. y aunque dicho calificativo puede ser empleado en métodos y clases su uso más común es en campos. boolean doble_traccion. nótese que a través de las referencias de cada instancia son manipulados los valores de los campos ("fields").out.

sin embargo. donde se encuentra la clase Date empleada para manipular fechas en Java.Programación Java Básico puede ser descrito con las siguientes palabras: "No puede cambiar". Es definido un método llamado hoy que retorna la fecha actual mediante un Objeto Date. } } Clase Fecha • • • • Se importan las clases de la librería java. En ciertos métodos es utilizado el vocablo return que permite indicar el valor de retorno para un método: Código Fuente Fecha. Se define el método principal main y dentro de este se genera una instancia de la clase. se define la clase a través del vocablo class. public class Fecha { public Date hoy() { Date a = new Date(). System. Como en todo programa Java.*. ahora bien. mandándose llamar el método hoy. return a.hoy()).util. Al utilizarse final en variables (primitivos) estas toman un valor constante al llevarse acabo la compilación. esto permite realizar un diseño que prohíbe a la referencia ser re-asignada.println(tiempo. Significado de return El uso del vocablo return no es obligatorio en la gran mayoría de métodos definidos en Java. Daniel Oliva Bianco 2009 25 .*. lo anterior permite mayor eficiencia al momento de ejecutarse un programa ("Run-Time"). las razones por las que es utilizado final pueden ser: Eficiencia o Diseño. } public static void main(String[] args) { Fecha tiempo = new Fecha(). el uso del vocablo final será explorado en otra sección de este curso. tiene dos usos principales: • Primeramente es una manera de indicar que el método en cuestión ha terminado.java import java.util.out. cuando es utilizado final en referencias de Objetos se restringe que dicha referencia sea utilizada para apuntar hacia otro Objeto.

Dentro del método principal (main) son generadas cuatro instancias de la clase. a continuación se describen varios ejemplos utilizando constructores: Código Fuente Arboles. primeramente se define la clase a través del vocablo class.Programación Java Básico • Cuando en determinado método se manipula más de una instancia/primitivo del mismo tipo que será retornado.String tipo) { System. nótese que cada uno recibe el mismo nombre de la clase y posee distintos argumentos de entrada.println("Un " + tipo + " de " + altura + " metros"). } public Arboles(int altura. = new Arboles(). } public Arboles(String tipo) { System. = new Arboles(5.out. como se puede observar. a través de este tipo de métodos es posible generar diversos tipos de instancias para la clase en cuestión."Pino"). al ser generada la instancia a través del vocablo new se pasa un parámetro. Posteriormente son definidos 4 Constructores. se emplea el vocablo return para evitar ambigüedad.println("Un árbol de " + altura + " metros").java. } public static void Arboles arbol1 Arboles arbol2 Arboles arbol3 Arboles arbol4 } } main(String args[]) { = new Arboles(4).out. = new Arboles("Roble"). Clase Arboles • • • Como en todo programa Java.out. Constructores Un Constructor es un método especial en Java empleado para inicializar valores en Instancias de Objetos.println("Un árbol tipo " + tipo). la principal característica de este tipo de métodos es que llevan el mismo nombre de la clase. y es dependiendo de este parámetro que es llamado el 26 Daniel Oliva Bianco 2009 .out. } public Arboles(int altura) { System. public class Arboles { public Arboles() { System.println("Un árbol genérico").

esto de cierta manera salvaguarda a un programador al momento de definir métodos que no vayan a ser definidos erróneamente como Constructores.tipo = tipo this. String tipo. el cual a su vez invoca la clase System. . un concepto utilizado en Java para ambientes Web (JSP's/Servlets). } { En el caso anterior. esto trae consigo otro detalle en lo que concierne la asignación de valores dentro de un método..longitud = longitud.out.Programación Java Básico Constructor correspondiente. la sintaxis con el vocablo this es ampliamente utilizada en el caso de Constructores mencionado anteriormente.println que imprime a pantalla. sin embargo.. Lo anterior significa que si el compilador observa un método con el mismo nombre de la clase con argumentos (Constructor). evitando el uso del vocablo this. dentro del constructor se desea asignar valores a los campos de una clase. int longitud) this. deberá existir un método vacío por el mismo nombre. observe: public Class Cableado { int longitud. para tener acceso a los campos de la clase se utiliza el vocablo: this. al emplear esta sintaxis se está haciendo alusión a los campos de la clase. Constructor Obligatorio En los ejemplos anteriores del curso se pudo notar que no se hizo uso de Constructor alguno.. Aunque sería posible emplear distintos nombres para los valores de entrada. sin embargo. Daniel Oliva Bianco 2009 27 . así como Java Beans.. existe una situación en la que es necesario definir un Constructor vacío y esta es cuando se hace uso de otros constructores. Métodos y Parámetros por Referencia Cuando son utilizados Constructores puede surgir la necesidad de inicializar algún campo perteneciente a la clase. } .. la razón se debe a que dentro de un método puede surgir el requerimiento de acceder campos definidos en la clase. y la razón es que el compilador lleva a cabo esta definición de Constructor vacío detrás de los escenarios. dentro del constructor son utilizados como parámetros de entrada los mismos valores. public Cableado(String tipo..

Para que un comentario sea contemplado en la generación de documentación se utiliza la siguiente sintaxis /** Un comentario para clase */ public class pruebaDocs { /** Un comentario para Variables public int i. sin embargo. a partir de ellos no son generados ningún tipo de documentación. cualquier palabra entre /* y */ es considerada comentario. en Java la generación de Documentación es llevada en conjunción del código a través de comentarios. en muchas ocasiones esta documentación ni existe. esto es. a continuación se describe un ejemplo: Comentarios en Java Primeramente vale hacer mencionar los tipos de comentarios utilizados en Java. ya que por una parte debe mantenerse el código funcional mientras se debe generar documentación acerca de la funciones. /** A comentario para método */ public void f() {} } */ Todo elemento colocado entre los elementos /** */ será contemplado en la generación de documentación.Programación Java Básico Generación de Documentación (Vía Comentarios) En muchos lenguajes el mantener documentación acerca de las clases/Métodos escritos es una tarea que requiere un esfuerzo adicional. A través de comentarios colocados en cada clase/Método es posible generar documentación de una manera inmediata y concisa en formato de documentos HTML / XHTML. este no será incluido en la documentación */ // // Este es un comentario de linea únicamente Tampoco será incluido en la documentación Los dos tipos de comentarios anteriores son utilizados como guía dentro del código fuente. al igual que todo renglón que inicie con //. existen dos tipos de comentarios puros como tal: /* Este es un comentario que expande diversas lineas. dependiendo de la ubicación de este comentario será generada la Daniel Oliva Bianco 2009 28 .

7 */ public class PruebaFecha { /** Punto de Entrada único para clase * @param args Arreglo de String's * @return Sin valor de retorno * @exception exceptions Ningún error (Excepción) definida */ public static void main(String[] args) { System. Existe otra sintaxis específica para definir los elementos dentro de los comentarios. Otros parámetros (@) para Comentarios en Java Los siguientes parámetros también son utilizados al generar documentación para código Java: Elemento Uso @see <Nombre Elemento utilizado para hacer referencia a otras clases. esto es.out.*. /** * Programa que Despliega la Fecha.println("Hoy es: "). al ser indicado este Daniel Oliva Bianco 2009 29 .util. } } Los elementos que inician con el símbolo @ son utilizados para indicar parámetros específicos dentro de la documentación. de la clase> genera un link HTML / XHTML hacia la clase en cuestión.println(new Date()).com * @version 1. @throws Empleado para indicar la clase utilizada al generarse un <Nombre de la Error.Programación Java Básico documentación. La definición de clases para Errores será descrita en clase> otra sección. En la siguiente sección serán ilustrados otros elementos @. si aparece antes de un elemento class es considerado documentación para la clase y así sucesivamente. * @author Juan Sanchez * @author jsanchez@test . así como el proceso para generar la documentación HTML / XHTML del código fuente Java. @deprecated Este parámetro es utilizado para indicar que una clase ha sido repuesta por otra más reciente. los anteriores son algunos elementos que pueden ser utilizados al definir documentación. la cual se ilustra a continuación: import java.out. System.

com * @version 1. lo anterior permite generar listas enumeradas. Además de los parámetros anteriores también es posible escribir lenguaje HTML / XHTML entre los elementos /** */ .escritura.out. A continuación se ilustran dos clases escritas anteriormente.out. import com. dar mayor estilo a la documentación y cualquier otro formato disponible en HTML / XHTML . /** * Programa con métodos auxiliares para salto de linea * y linea continua * @author Juan Sanchez * @author jsanchez@test .escritura.print(s).auxiliares. } } Clase MandaPantalla.Programación Java Básico parámetro en una clase/Método el compilador (javac ) generará un aviso.3 */ public class Pantalla { /** Método para linea continua * @params Un String * @return Sin valor de retorno * @exception exceptions Ningún error (Excepción) definida */ public static void sinSalto(String s) { System.java package com. con los respectivos comentarios para generar documentación: Clase Pantalla.*.println(s). indicando que la clase/Método ha sido repuesta. /** * Programa para demostración de import en la clase * @author Juan Sanchez Daniel Oliva Bianco 2009 30 .test . } /** Método para salto de linea * @params Un String * @return Sin valor de retorno * @exception exceptions Ningún error (Excepción) definida */ public static void conSalto(String s) { System.java package com.test .test .

sinSalto("Linea Continua").com * @version 1.test .escritura.Programación Java Básico * @author jsanchez@test . primera. } } Generación de Documentación El comando javadoc posee una gran cantidad de parámetros para generar documentación.Pantalla */ public class MandaPantalla { /** Punto de Entrada único para clase * <ul> * <li>Utiliza método sinsalto * <li>Utiliza método consalto * </ul> * @param args Arreglo de String's * @return Sin valor de retorno * @exception exceptions Ningun error (Excepción) definida */ public static void main(String args[]) { Pantalla primera = new Pantalla(). Posteriormente es invocado el comando javadoc con los siguiente parámetros: o -d docs: Indica el directorio donde será depositada la documentación (docs).java com/test /auxiliares/*. este aparecerá en la documentación. en este caso se está indicando el directorio presente (*.6 * @see com.sinSalto("Termina sin salto").java • • El primer paso antes de generar cualquier documentación Java es crear un directorio donde residirá la documentación. primera.conSalto("Esto es un renglón CON salto de linea"). a continuación se describe su uso más básico: $ mkdir docs $ javadoc -d docs/ -version -author -use *. primera. primera. 31 Daniel Oliva Bianco 2009 . de ser definido en la clase. o -author: En caso de ser definido el parámetro autor.conSalto("Esta linea si tiene salto!"). primera.conSalto("Esta linea también tiene salto").println(" Se termina el uso de funciones").sinSalto("Linea Continua"). primera. o -use: Es el parámetro utilizado para indicar los directorios donde residen las clases sobre las que será generada la documentación. en este caso se ha generado un directorio llamado docs. o -version: Implica que al ser generada la documentación sea desplegado el número de versión.out.java com/test /escritura/*. System.java) y los directorios com/test /escritura y com/test /auxiliares.

Daniel Oliva Bianco 2009 32 .Programación Java Básico Al terminar este proceso será generada la documentación de las distintas clases dentro del directorio docs. para observar otros parámetros que puede tomar el comando javadoc basta ejecutar: javadoc -help.

observe: El primer diagrama UML ("Universal Markup Language") muestra 3 clases (Guitarra.Programación Java Básico Herencia. } public void volumen() { agrega(" volumen() "). Piano. en el proceso teniendo acceso a los métodos/campos ya creados con anterioridad . public void agrega(String a) { r += a. } public void imprimir() { System. este mecanismo permite que nuevas clases hereden el comportamiento de una clase Base ya depurada y funcional. Interfaces y Polimorfismo Herencia ("Inheritance") Uno de las partes medulares en un lenguaje orientado a Objetos es el uso de Herencias ("Inheritance") .println(r).out.java class Radio { private String r = new String("Radio: "). en Herencias el término reutilizable toma otro sentido al utilizado en la secciones anteriores al importarse clases (import).mientras el segundo diagrama muestra 2 clases (Circulo. uno más complejo y poderoso. el cual permite reutilizar clases existentes con todas las funcionalidades/comportamientos ya diseñadas en ellas. Saxofón) que heredan de una clase Base (Instrumento). } public void modelo() { agrega(" modelo() "). } public void frecuencia() { agrega(" frecuencia() "). a continuación se describe un ejemplo que hace uso de herencia: Código Fuente MiniComponente. } public static void main(String[] args) { Daniel Oliva Bianco 2009 33 . Triangulo) que heredan de una clase Base (Figura).

por lo que esta clase solo será accesible internamente (O al paquete "package" si fuera incluida en alguno). debido a esto se ha decidido reutilizar (Heredar) el comportamiento de una clase Base de Radio. el cual es asignado un valor inicial de "Radio: ".println("Probar la clase Base: "). x.main(args). x. en este caso se opto por dicho diseño debido a razones didácticas. super. han sido definidas dos clases en el mismo archivo fuente llamado MiniComponente. • • Como cualquier clase Java se utiliza el vocablo class. Radio. } } public class MiniComponente extends Radio { // Cambiar el metodo ("Override") public void volumen() { agrega( " MiniComponente. x. x.equalizador(). es posible afirmar que todo MiniComponente incluye un Radio (AM/FM) entre sus dispositivos. nótese que se sigue cumpliendo la característica de una clase Java: debe ser definida al menos una clase con el mismo nombre del archivo fuente. Entrando al problema espacial ("real").frecuencia() .Programación Java Básico Radio x = new Radio().volumen(). x.imprimir(). System.java. x.volumen(). Clase Radio. no se utiliza ningún calificador de acceso. aunque bien se pudo haber realizado el diseño de este manera por razones administrativas.modelo(). } } Definición de Dos clases y Herencias ("Inheritance"). Como se puede observar. a continuación se describe la clase Radio. de cualquier manera.volumen(). 34 Daniel Oliva Bianco 2009 .volumen() "). el hecho que existan dos clases en el mismo archivo fuente no influye en ningún factor.frecuencia(). x.out. x. } public static void main(String[] args) { MiniComponente x = new MiniComponente().imprimir().esto es lo que se refiere como acceso amigable. sin embargo. // Llamar la version de la clase Base } // Agregar metodo public void equalizador() { agrega(" equalizador() "). x.modelo(). descrito en la sección de Calificadores. Se define un campo tipo String con la referencia r.

println para enviar a pantalla el valor del String r (el campo de la clase). toma como valor de entrada un String y su función es concatenar diversos String's. es posible ejecutar la clase MiniComponente a través del comando java MiniComponente y observar los resultados iniciales así como las variaciones de comportamiento en la clase Radio. Los métodos frecuencia. Daniel Oliva Bianco 2009 35 . posteriormente a través de la respectiva referencia se mandan llamar los distintos métodos de la clase. En el último paso del método main se realiza una llamada hacia el otro método main definido en la clase Radio. nótese que aquellos no definidos dentro de la clase. Finalmente el método imprimir hace uso de la clase System. Dentro de este mismo método. son llamados con la implementación de la clase Base. En el método principal ( main ) se genera una instancia de la clase Radio. Una vez compilado el código fuente. inicialmente se hace una llamada al método agrega.volumen. Clase MiniComponente. el vocablo super indica una llamada hacia la clase Base (Radio).Programación Java Básico • • • • El primer método llamado agrega. seguido de éste se indica la clase que será heredada ("Inherited"). Dentro del método principal main se genera una instancia de la clase MiniComponente. sin embargo. • • • • • • • Al definir esta clase se utiliza el vocablo extends que implica Herencia ("Inheritance").out. si observa el resto de la composición de esta clase notará que no existe ninguno por este nombre. esto es conocido como override en lenguajes orientados a Objetos. nótese que se utiliza el operador +=. El primer método definido se llama volumen. nótese que en la clase Radio también existe un método con este nombre. dentro de esta clase se está modificando el comportamiento de dicho método. que también hace uso del método agrega. La segunda llamada en este método es: super. dentro de la clase Base existe dicho método. Una vez compilado el código fuente. Se define un método nuevo llamado equalizador. a través de este operador es posible concatenar diversos elementos. en este caso Radio. el vocablo super es utilizado en los casos donde surge una ambigüedad de nombres entre la clase heredada y base. es posible ejecutar la clase Radio a través del comando java Radio y observar los resultados iniciales. a través de esta línea se está realizando una llamada hacia el método volumen definido en Radio. volumen y modelo hacen uso del método agrega concatenando distintos valores. en esta definición 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. seguido de diversas llamadas a distintos métodos. en este caso se está haciendo uso de los métodos de la clase Base.

Inicialmente se puede pensar que este código generaría un error debido a que el tipo de referencia es distinta a la instancia del objeto. observe el siguiente fragmento de código: Figura a = new Circulo(). para asentar este tema se describe un ejemplo más completo: Daniel Oliva Bianco 2009 36 . inclusive las clases Base del JDK lo utilizan extensamente. esto implica que un mismo Objeto puede tomar diversas formas. Polimorfismo El concepto de Polimorfismo es uno de los fundamentos para cualquier lenguaje orientado a Objetos. Figura b = new Triangulo(). donde todas son descendientes de la clase Base java. A través del concepto de Herencias ("Inheritance") es posible ilustrar este comportamiento: El poder manipular un Objeto como si éste fuera de un tipo genérico otorga mayor flexibilidad al momento de programar con Objetos.lang. el fragmento anterior es correcto y demuestra el concepto de Polimorfismo. sin embargo. morfismo= Formas.Programación Java Básico El uso de Herencias es ampliamente utilizado en diseños Java. si observa la documentación de estas clases. notará en la parte superior el árbol de Herencias ("Inheritance") para la clase correspondiente. las mismas raíces de la palabra pueden ser una fuerte pista de su significado: Poli = Multiple. el término Polimorfismo también es asociado con un concepto llamado Late-Binding (Ligamiento Tardío).Object.

*.println("Guzla. } public void afinar() {} } class Piano extends Instrumento { public void tocar() { System.println("Instrumento.out.out. } public void afinar() {} } class Guitarra extends Instrumento { public void tocar() { System.tocar()").afinar()").tocar()"). } public String tipo() { return "Instrumento".tocar()").out.tocar()").out.out.java import java.println("Guitarra.println("Saxofon. } } Daniel Oliva Bianco 2009 37 . } public void afinar() {} } // Un tipo de Guitarra class Guzla extends Guitarra { public void tocar() { System.println("Guzla.tocar()"). } public void afinar() {} } class Saxofon extends Instrumento { public void tocar() { System.tocar()").out.println("Ukelele. } public String tipo() { return "Ukelele". class Instrumento { public void tocar() { System. } public String tipo() { return "Saxofon". } } // Un tipo de Guitarra class Ukelele extends Guitarra { public void tocar() { System.Programación Java Básico Código Fuente Musica.util. } public String tipo() { return "Piano".println("Piano. } public String tipo() { return "Guitarra". } public void afinar() { System.out.

tipo y afinar. Las definiciones de la clase principal Musica son descritas en los siguientes incisos: Daniel Oliva Bianco 2009 38 .length. Guzla: Hereda ("Inherit") de la clase Guitarra y redefine ("Override") los métodos de ésta. int i = 0. i. orquesta[i++] = new Ukelele(). i++) afinar(e[i]). Piano: Hereda ("Inherit") de la clase Instrumento y redefine ("Override") los métodos de ésta. Ukelele: Hereda ("Inherit") de la clase Guitarra y redefine ("Override") los métodos de ésta. Saxofon: Hereda ("Inherit") de la clase Instrumento y redefine ("Override") los métodos de ésta. // seguirá funcionando debido a Polimorfismo: static void afinar(Instrumento i) { // . i < e. orquesta[i++] = new Piano(). orquesta[i++] = new Guzla()..tocar(). } static void afinarTodo(Instrumento[] e) { for(int i = 0. orquesta[i++] = new Saxofon().java son diseñadas 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 métodos: tocar. } } Clase Musica En el código fuente de Musica.. // Up-casting al asignarse el Arreglo orquesta[i++] = new Guitarra(). Guitarra: Hereda ("Inherit") de la clase Instrumento y redefine ("Override") los métodos de ésta. afinarTodo(orquesta). } public static void main(String[] args) { Instrumento[] orquesta = new Instrumento[5].Programación Java Básico public class Musica { // No importa el tipo de Instrumento.

tocar() Saxofon. esto es. Al ser ejecutado este programa se obtienen los siguientes resultados: $ java Musica Guitarra. o Finalmente se invoca el método afinarTodo con la referencia que representa el arreglo de Instrumento. Dentro del método principal se define lo siguiente: o Primeramente se genera un arreglo de Instrumento para 5 Objetos.tocar() Piano. que también tiene implicaciones en otros componentes es: Casting.tocar() Ukelele. se llama el método de la clase especifica. el método que realiza las llamadas hacia las diversas clases es afinar dentro de la clase Musica. uno de estos. Daniel Oliva Bianco 2009 39 .tocar() Guzla. al ser invocado el método tocar a pesar de ser a través de una referencia Instrumento es invocado el método de clase acordemente.tocar() Lo interesante de este resultado reside en la manera que fue realizada la invocación de métodos. Saxofon. o Se inicializa un primitivo i con un valor de cero. Ukelele. Sin embargo. el cual es procesado por un ciclo que a su vez manda llamar el método afinar con los respectivos valores del arreglo. Guzla.Programación Java Básico • • • El primer método definido en esta clase llamado afinar toma como valor de entrada una referencia del tipo Instrumento. o A través de la referencia orquesta son asignados distintos Objetos al arreglo. sobre la cual es invocado el método tocar. Piano. nótese que aunque el arreglo es de tipo Instrumento es posible asignar los Objetos: Guitarra. Un segundo método nombrado afinarTodo toma como valor de inicia un arreglo de Instrumento. observe que este método toma como valor inicial una referencia del tipo Instrumento y se invoca el método tocar. El uso de Polimorfismo posee ciertos detalles que no fueron descritos en el ejemplo anterior. lo anterior es una labor de Polimorfismo ya que ocurre el comportamiento adecuado a pesar de realizarse las llamadas a través de una clase general (Instrumento).

Anteriormente se mencionó que el "Casting" llevado a cabo con Polimorfismo es implícito. esto se debe a que no se requiere de sintaxis especial. El uso práctico de "Down-Casting" será explorado en la sección de Vectores y "Hashtables". analicemos: mientras se puede asegurar que un Triangulo es una Figura ("Up-Casting"). un Triangulo en el molde de una Figura. claro está que lo puede ser. una Guitarra se coloca en el molde de un Instrumento. sin embargo. en ciertas ocasiones se requiere realizar un tipo de "Casting" que no es considerado seguro en términos computacionales. simplemente se convierte una Guitarra a un Instrumento. una Figura no necesariamente es un Triangulo. sin embargo. por lo que el termino literal es Hacer un Molde. en Polimorfismo se lleva a cabo este proceso de "Casting" implícitamente. pero en Java se requiere definir explícitamente esta operación ("Down-Casting"). Daniel Oliva Bianco 2009 40 . para llevar una transformación en sentido opuesto se requiere de sintaxis adicional para mantener la seguridad de transformación.Programación Java Básico Uso de "Casting" El término "Casting" viene de la palabra "Cast" que significa Molde.

tocar()").out. Al ser definido un método como abstract se restringe que éste sea llamado directamente.println("Guitarra. en Java existe un vocablo que permite prohibir el uso de métodos en clases Base.println("Piano. } public String tipo() { return "Piano". este calificativo es: abstract. Al ser utilizado Herencias y/o Polimorfismo es muy común que en la clase Base existan métodos diseñados únicamente con el propósito de ofrecer una guía para las clases heredadas. } class Guitarra extends Instrumento { public void tocar() { System. } public void afinar() {} } // Un tipo de Guitarra class Guzla extends Guitarra { public void tocar() { Daniel Oliva Bianco 2009 41 .util. Al ser definida una clase.tocar()"). abstract class Instrumento { public abstract void tocar(). cuando una clase contiene un método de este tipo a ésta se le llama: clase Abstracta. } public void afinar() {} } class Saxofon extends Instrumento { public void tocar() { System. además de ser declarados los métodos/campos como abstract también es necesario utilizar el vocablo abstract en la definición de cada clase.out. public String tipo() { return "Instrumento". } public String tipo() { return "Saxofon".out.Programación Java Básico Interfaces y clases Abstractas.*. Código Fuente Musica2. } public void afinar() {} } class Piano extends Instrumento { public void tocar() { System.println("Saxofon. } public String tipo() { return "Guitarra". } public abstract void afinar(). Clases Abstractas.tocar()").java import java.

int i = 0.out. sin embargo. } public void afinar() { System.tocar()"). } public String tipo() { return "Ukelele".out. i. i < e. // seguirá funcionando debido a Polimorfismo: static void afinar(Instrumento i) { // .length. orquesta[i++] = new Ukelele().println("Guzla. } public static void main(String[] args) { // Declarar un Arreglo SIN INSTANCIAS es válido en clases Abstractas Instrumento[] orquesta = new Instrumento[5]..println("Guzla.. } static void afinarTodo(Instrumento[] e) { for(int i = 0.tocar()"). } } // Un tipo de Guitarra class Ukelele extends Guitarra { public void tocar() { System. la clase Base de Instrumento fue definida como abstract. orquesta[i++] = new Saxofon(). } } Clase Musica2 La clase anterior es idéntica aquella definida en el ejemplo de Polimorfismo. afinarTodo(orquesta).afinar()"). // Generar una INSTANCIA de una la clase Abstracta no es valido // Instrumento nuevo = new Instrumento(). } } public class Musica2 { // No importa el tipo de Instrumento.tocar().out. // Up-casting al asignarse el Arreglo orquesta[i++] = new Guitarra().Programación Java Básico System.println("Ukelele. algunos detalles de esta definición: Daniel Oliva Bianco 2009 42 . i++) afinar(e[i]). orquesta[i++] = new Piano(). orquesta[i++] = new Guzla().

Una Interface es una clase abstracta llevada al extremo. Una Interface básicamente dice: "Todas las clases que implementen esta Interface deben contener su misma estructura".util. interface Instrumento { // Constante al compilar. es necesario que la clase como tal sea definida también como abstract. este comportamiento se demuestra en el método principal (main) • • Aunque dentro del método sea generado un Arreglo de esta clase abstracta. esto permite que sea generado sin ningún error. en Java existe otro mecanismo que permite llevar acabo diseños donde se parte de una Estructura o Cápsula.java import java. Una de las características de las clases que heredan de una clase abstracta. Cuando es definido más de un método como abstract. La característica de hacer una clase/Método abstract reside en que no puede ser generada una instancia de la misma. // Métodos Automáticamente Públicos void tocar().Programación Java Básico • • Nótese que los métodos definidos como abstract no contienen ningún tipo de código dentro de ellos. es que éstas deben definir los mismos métodos definidos en la clase Base.*. o bien. void afinar(). recuerde que un arreglo es únicamente un contenedor de Objetos. inclusive no declaran ni llaves ({ }). automáticamente static y final int i = 5. Dentro de comentarios se encuentra la generación de una instancia del tipo Instrumento la cual generaría un error al ser compilada la clase. } Daniel Oliva Bianco 2009 43 . para definir una Interface se utiliza el vocablo interface y para especificar que una clase debe utilizar determinada Interface se utiliza el vocablo implements. en el siguiente ejemplo se describe el uso de Interfaces: Código Fuente Musica3. String tipo(). Interfaces. Al ser utilizada una Interface en una clase se está indicando: "La Interface dicta la forma/estructura ahora se va describir como debe funcionar". una estructura de Figuras al uso de la Interface Figura. la cual permite pre-definir el uso de métodos/campos en futuras clases tal como: Una jerarquía de Instrumentos restringido al uso de una Interface Instrumento.

} public void afinar() {} } class Saxofon implements Instrumento { public void tocar() { System. i++) afinar(e[i]). } public String tipo() { return "Piano".. } public void afinar() {} } // Un tipo de Guitarra class Guzla extends Guitarra { public void tocar() { System. } public void afinar() { System.length. } static void afinarTodo(Instrumento[] e) { for(int i = 0.println("Guzla. } public void afinar() {} } class Piano implements Instrumento { public void tocar() { System.Programación Java Básico class Guitarra implements Instrumento { public void tocar() { System. } public String tipo() { return "Ukelele".out.println("Guzla.println("Piano. i.tocar()"). } Daniel Oliva Bianco 2009 44 . i < e.println("Ukelele.println("Saxofon. // seguirá funcionando debido a Polimorfismo: static void afinar(Instrumento i) { // . } public String tipo() { return "Guitarra". } public String tipo() { return "Saxofon".out.tocar()").out.tocar()").tocar()..out. } } // Un tipo de Guitarra class Ukelele extends Guitarra { public void tocar() { System.tocar()").println("Guitarra.out.afinar()"). } } public class Musica3 { // No importa el tipo de Instrumento.tocar()").out.

En la siguiente sección se describe el uso de Interfaces para Herencias Múltiples ("Multiple Inheritance"). orquesta[i++] = new Saxofon(). } interface PuedeConsultar { Daniel Oliva Bianco 2009 45 . los métodos definidos en Interfaces no utilizan ningún calificador de acceso (public. orquesta[i++] = new Guzla().Programación Java Básico public static void main(String[] args) { // Declarar un Arreglo SIN INSTANCIAS es Abstractas Instrumento[] orquesta = new Instrumento[5]. } } válido en clases Clase Musica3 La clase anterior es idéntica aquella definida en los últimos dos ejemplos. algunos detalles de esta definición: • • • Nótese que los métodos definidos dentro de la interface no contienen ningún tipo de código dentro de ellos. protected). sin embargo. a continuación se describe su uso: Código Fuente Cardiologo. private. orquesta[i++] = new Piano(). este concepto reside en diseñar clases que adoptan el comportamiento de más de una clase. afinarTodo(orquesta). la clase Base de Instrumento fue definida como una interface a través del vocablo interface.util. orquesta[i++] = new Ukelele(). A diferencia de los métodos definidos en clases Abstractas.*. además es necesario definir todos los métodos definidos en la Interface dentro de la clase. Herencias Múltiples Una característica especifica de Interfaces que no es posible a través de clases Abstractas es el uso de Herencias Múltiples. int i = 0. Cuando una clase hace uso de una Interface esta utiliza la palabra implements. // Up-casting al asignarse el Arreglo orquesta[i++] = new Guitarra(). interface PuedeCurar { void curar().java import java. inclusive no declaran ni llaves ({ }).

println("Cirujano. } } En este archivo fuente son definidas tres Interfaces y tres clases las cuales son descritas a continuación: Interfaces PuedeCurar.println("Medico. PuedeConsultar. Cada una de estas interfaces define un método el cual deberá ser implementado en las respectivas clases que hagan uso de las interfaces. 46 Daniel Oliva Bianco 2009 .out. } } class Cardiologo { static void r(PuedeCurar x) { x.out. } interface PuedeRecetar{ void recetar().recetar()"). } static void u(Cirujano x) { x.consultar().Programación Java Básico void consultar().println("Medico.curar(). Clase Medico. Contiene la mayor parte de código funcional de este archivo fuente: • Es definida al igual que cualquier otra clase con el vocablo class.curar()").operar()"). } public void recetar() { System. PuedeConsultar. } } class Medico extends Cirujano implements PuedeCurar. s(m). u(m). t(m). PuedeRecetar.out. } static void s(PuedeConsultar x) { x.operar(). Clase Cirujano. r(m).println("Medico. } public void consultar() { System. } class Cirujano { public void operar() { System. } static void t(PuedeRecetar x) { x. Esta clase simplemente define un método llamado operar que imprime un mensaje a pantalla. } public static void main(String[] args) { Medico m = new Medico().consultar()").recetar(). PuedeRecetar { public void curar() { System.out.

El método t manda llamar la función recetar. Clase Cardiologo. nótese que aunque el dato de entrada aparece como PuedeRecetar (Interface) la invocación se lleva acabo directamente de la clase Medico. El método r manda llamar la función curar.s. Son escritas las diversas implementaciones de los métodos de cada interface. los cuales envían un mensaje a pantalla.Programación Java Básico • • • Se utiliza el vocablo extends para heredar ("Inherit") el comportamiento de la clase Cirujano. PuedeConsultar. El método s manda llamar la función consultar. • • • • • • Dentro del método principal (main) de esta clase se genera una instancia de la clase Medico. nótese que aunque el dato de entrada aparece como PuedeConsultar (Interface) la invocación se lleva acabo directamente de la clase Medico. esto obliga a que sean definidos los métodos de las diversas interfaces. Seguido se implementan las interfaces PuedeCurar. A través de dicha referencia son invocados los diversos métodos locales r. 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").u. Daniel Oliva Bianco 2009 47 . El método u invoca la función operar disponible en la clase Cirujano.t. PuedeRecetar a través de implements. nótese que aunque el dato de entrada aparece como PuedeCurar (Interface) la invocación se lleva acabo directamente de la clase Medico.

una característica de este método es que utiliza el calificativo static. Dentro del método principal (main) es invocado el método análisis en tres ocasiones. Ciclos. if(prueba > objetivo) resultado = +1. Operadores. System.Programación Java Básico Condicionales. 7)). los tres principales tipos son el conocido if/else. Una característica del ciclo if/else así como los otros ciclos disponibles en Java es el uso de llaves { }. // Prueba igual a Objetivo return resultado.out.println(analisis(3. 7)).out. Uso de llaves ({ }) en Ciclos.java public class Condicional { static int analisis(int prueba. else resultado = 0. else if(prueba < objetivo) resultado = -1. imprimiendo los respectivos resultados a pantalla. int objetivo) { int resultado = 0. en el ejemplo anterior pudo notar que no fueron utilizadas llaves { } para Daniel Oliva Bianco 2009 48 .out. } public static void main(String[] args) { System. 3)). esto garantiza un posible error al invocar métodos estáticos.println(analisis(7.java • • • Primeramente se declara la clase a través del vocablo class. Arreglos Condicionales if/else En Java al igual que otros lenguajes son utilizados condicionales que permiten controlar el flujo de ejecución en un programa. debido a que el vocablo static es empleado en métodos que no requieren instancias. esto se debe a que es llamado directamente del método principal main el cual también es static. System. Es definido un método llamado análisis el cual retorna una respuesta en base a las operaciones del condicional if/else.println(analisis(7. a continuación se describen varios ejemplos con el uso de if/else: Código Fuente Condicional.while y for. si se realiza un llamado hacia determinado método de uno static éste también deberá ser static. } } Clase Condicional.

Existe otra variación de if/else que agrupa las condicionales en una sola expresión : if (expresion Boolean ? operación verdadera: operación falsa) A continuación se describe un ejemplo empleando esta variación de if/else. Codigo Fuente Tercia.out.java public class Tercia { public static int trio(int r) { return r < 10 ? r*3: r*22. se asume que el ciclo o condicional tendrá efecto únicamente en la línea contigua a su inicio. System.println(trio(20)). Aunque es recomendable utilizar llaves ({ } ) para incrementar la legibilidad del código.Programación Java Básico delimitar las condicionales. es importante señalar que esta sintaxis de no utilizar llaves ({ } ) es válida y muy común (Lamentablemente) . Dentro del método principal main es invocado el método trío en dos ocasiones. al no emplearse este mecanismo. } public static void main(String args[]) { System. enviando a pantalla los respectivos resultados. Daniel Oliva Bianco 2009 49 .println(trio(2)). caso contrario r*22.out. si esta expresión resulta verdadera es ejecutada la operación r*3. } } Clase Tercia • • Es definido un método llamado trío el cual hace uso de la variante if/else. la expresión boolean es r < 10.

La segunda parte indica la condición de terminación para el ciclo.out. Finalmente. Dentro del Ciclo se utiliza la clase System. iteración por ciclo) • • • • Las tres partes del ciclo se encuentran separadas por . Daniel Oliva Bianco 2009 50 . i < 5.println para imprimir los valores de las variables i y j en cada iteración de ciclo. Se define el método principal (main). } } } Clase PruebaFor • • • • Se inicia este programa con la clásica definición de class. a continuación 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 . el uso de corchetes ([]) al lado de la clase String indica un Arreglo de String's. la cual está directamente relacionada con los valores iniciales. o La condición para terminar el ciclo es definida cuando el valor de la variable i sea menor 5. a la cual es posible agregar otros elementos a partir de una . j = i + 10. Cada parte del ciclo debe incluir al menos un elemento.println("i= " + i + " j= " + j). la última parte especifica cómo serán manipulados los valores iniciales en cada iteración del ciclo. j = i * 2) { System. (coma). Código Fuente PruebaFor. condición de terminación .out. o Cada iteración 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.java public class PruebaFor { public static void main(String[] args) { for(int i = 1. i++.Programación Java Básico Uso de los Ciclos for y while El uso de Ciclos en lenguajes de programación es un concepto ampliamente utilizado. Se define el ciclo for con las siguientes características: o Dos variables iniciales (primitivos) i y j. (punto y coma) La primer parte del ciclo especifica valores previos a su inicio.

el uso de corchetes ([]) al lado de la clase String indica un Arreglo de String's.random (proporcionada en las clases Base del JDK). Se define un primitivo del tipo double con valor inicial de 0 (cero).99d) { r = Math. System.println(r).Programación Java Básico Sintaxis del Ciclo while La Sintaxis empleada por el ciclo while es la siguiente: while (condición de terminación) • Consta de un solo elemento que indica la condición de terminación para un Ciclo. que toma como valor de entrada un número (primitivo).java public class PruebaWhile { public static void main(String[] args) { double r = 0. while(r < 0.println) el valor de la variable r. el valor de la variable es modificado con un número aleatorio a través de la función Math.random(). Es impreso a pantalla (vía System. } } } Clase PruebaWhile • • • • • • Se inicia este programa definiendo la clase en cuestión. Dentro del ciclo.99.out. Se define el método principal (main). la d al final del numero indica un número (primitivo) del tipo double .out. Código Fuente PruebaWhile. El ciclo while utiliza la condición de terminación hasta que el valor de la variable d sea asignado un valor mayor a 0. Daniel Oliva Bianco 2009 51 .

este comportamiento se logra a través de los vocablos break y continue.out. salvo los siguientes casos: o Si el valor de la variable i equivale a 74 se termina todo el ciclo debido al vocablo break. 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.out. if(j == 1269) break. Daniel Oliva Bianco 2009 52 . o Si la variable i no es múltiplo de 9 se interrumpe la iteración actual debido al vocablo continue. // Siguiente Iteración System. o Si la variable i no es múltiplo de 10 se interrumpe la iteración actual debido al vocablo continue. // Regreso al Inicio del Ciclo System. cada iteración es impreso el valor la variable a pantalla. saltar una iteración en ciertas circunstancias.println(i). i++) { if(i == 74) break. // Un ciclo "infinito": while(true) { i++. o bien. } int i = 0.Programación Java Básico En ciertas ocasiones surge la necesidad de interrumpir un ciclo si ocurre determinada condición. 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 iteración. // Fuera del Ciclo if(i % 10 != 0) continue. } } } Clase BreakYContinue La clase únicamente contiene código en su método principal (main) descrito a continuación: • • • Se inicia un ciclo for con cien iteraciones empleando la variable i.println(i).java public class BreakYContinue { public static void main(String[] args) { for(int i = 0. // Fuera de Ciclo if(i % 9 != 0) continue. i < 100. a continuación se describe su uso: Código Fuente BreakYContinue. int j = i * 27.

break. case 5: System.println("Agosto").println("Diciembre").println("Octubre").out. case 12: System. case 6: System. switch (month) { case 1: System.out. • Dada una variable de entrada esta se define seguido del vocablo switch.Programación Java Básico Uso de switch A través de un Switch se posible definir una serie de tareas cada una asignada a una lista de valores. case 3: System.println("Febrero"). case 11: System. case 2: System.java public class Meses { public static void main(String[] args) { int month = 8. Se abre una llave para iniciar los posibles valores que pueda tomar dicha variable. break.out. este tipo de estructura es ideal cuando se requieren condicionales que lleven más de dos valores. break. break.println("Mayo"). case 8: System. break.out.println("Junio").println("Abril").println("Julio").out. Los juegos de valores son iniciados con case seguido del posible valor de la variable. • • • break.out.out. break.out.println("Enero").out.println("Noviembre"). Código Fuente Meses.println("Septiembre"). case 9: System.out. break. en lugar de anidar grupos de condicionales if/else es posible lograr el mismo comportamiento a través de un switch: Sintaxis del switch.out. break. break.println("Marzo"). } } } Daniel Oliva Bianco 2009 53 . break. break. case 4: System. break. posteriormente es definido un juego de instrucciones que serán ejecutados en caso de corresponder con el valor de la variable y finalmente (opcional) se utiliza vocablo break para salir de ciclo case. case 10: System. break. break. break. case 7: System. Un valor opcional es la definición de la linea default.out. 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 . cuyas instrucciones serán ejecutadas en caso que la variable del switch no coincida con los valores definidos. break.

int numDias = 0. case 4: case 6: case 9: case 11: numDias = 30.java public class Meses2 { public static void main(String[] args) { int mes = 10. switch (mes) { case 1: case 3: case 5: case 7: case 8: case 10: case 12: numDias = 31. a continuación se describe este caso: Código Fuente Meses2. Cuando se describió la Sintaxis de un switch se mencionó que el uso de break al final de cada declaración (case) era opcional. } System.out. int año = 2002. esto se debe a la posibilidad que exista más de un valor que deba ejecutar las mismas instrucciones. else numDias = 28. Dentro del switch son definidos valores del 1 al 12. el cual es utilizado como variable para un switch. } } Daniel Oliva Bianco 2009 54 . break. case 2: if ( ((año % 4 == 0) && !(año % 100 == 0)) || (año % 400 == 0) ) numDias = 29.println("Numero de Dias = " + numDias). los cuales tienen como instrucción imprimir a pantalla el valor del mes correspondiente. break. break.Programación Java Básico Clase Meses • • Se define un primitivo con valor de 8.

para este tipo de situaciones (String u otro Objeto) se requiere usar condicionales if/else anidadas.Programación Java Básico Clase Meses2 En esta clase el uso de switch varía. el uso de break en un switch es crítico ya que al no ser definido puede ocasionar un comportamiento errático. posiblemente causando un comportamiento no deseado. vale mencionar que las datos que se puede evaluar a través de un switch son solo primitivos. al omitir el uso del vocablo break. no se puede definir un juego de String's y comparar sus valores. Finalmente. ya que al no indicarse se continúan evaluando los distintos valores restantes en un switch. Daniel Oliva Bianco 2009 55 . esto es. ya que son agrupados distintos valores.

i = 15. o Se modifica el valor del campo en la instancia n1 al valor de 27. mientras la segunda (Asignacion) incluye la lógica central del programa. " + n1. System. n2.out. 56 Daniel Oliva Bianco 2009 .println("a) n1.println("c) n1. Antes de entrar en el uso de Operadores.out.i: ". Numero n2 = new Numero().i: " n1.i: ". una de ellas (Numero) simplemente contiene un campo.i).i = 27. System.i = 45.i). n2.println("b) n1. n2.i + + n2. Clase Asignacion • • En el código fuente son definidas dos clases. o Se imprime a pantalla el valor de cada campo de las dos instancias. a continuación se describe un ejemplo que demuestra el comportamiento de Asignación de valores para el lenguaje Java: Código Fuente Asignacion.i: " } } " + n1.i + + n2.java class Numero { int i.i + + n2. en esta sección se describirán detalles más precisos acerca de su funcionamiento. o Se imprime a pantalla el valor de cada campo de las dos instancias. } public class Asignacion { public static void main(String[] args) { Numero n1 = new Numero(). " + n1. Dentro del método 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.i). sin embargo.i: ". System. o Se asigna el valor de n2 a la instancia de n1.Programación Java Básico Operadores Matemáticos. n1. o A través de dichas referencias son asignados los valores correspondientes al campo i de la clase. Relacionales y Lógicos En Java al igual que otros lenguajes existen diversos operadores que son empleados en diferentes secciones de un programa. a lo largo de los distintos programas escritos en este Curso se han empleado su gran mayoría.i: " n1 = n2. n2.out.

i = 27. puesto que simplemente se imprimen los valores recién asignados. a partir de ese punto ambas referencias apuntan hacia la instancia del Objeto n2.i: 27 Los primeros resultados no presentan sorpresa alguna. n2.i: 45. Aunque el comportamiento del programa anterior parece predecible.i: 27. así como el valor de n2.i: 15. la instancia de n1 fue efectivamente perdida.Programación Java Básico o Se imprime a pantalla el valor de cada campo de las dos instancias. este mecanismo en Java es denominado aliasing y suele ser un poco difícil de entender para aquellos que inician en este lenguaje. n2. Daniel Oliva Bianco 2009 57 . Para evitar aliasing y mantener las dos instancias de Objetos se utilizaría una asignación más explícita: n1.i será modificado. El comportamiento anterior se debe a que fueron utilizadas referencias en la asignación de valores. al ser llevada a cabo esta asignación el valor n1.i: 45 c) n1.i. la ejecución del programa anterior da como resultado: a) n1.i: 45 b) n1. para muchas personas no familiarizadas con lenguajes orientados a Objetos puede resultar una sorpresa. Al utilizar la sintaxis n1 = n2. en la siguiente sección se observará un comportamiento de equivalencia que también puede resultar inusual para un programador no familiarizado con el lenguaje Java. se está indicando que la referencia n1 apunte hacia aquella de n2. n2. La tercer impresión es llevada a cabo después de la asignación n1. puesto que ambas referencias apuntan hacia la misma instancia.i cambia efectivamente hacia el mismo de n2.i = n2. al llevar a cabo este proceso el valor n1. la segunda impresión puede resultar confusa y esto se debe a la asignación n1 = n2.i.i.

System. System. Integer n2 = new Integer(75). para llevar a cabo el comportamiento deseado se utiliza la siguiente variación: public class Equivalencia2 { public static void main(String[] args) { Integer n1 = new Integer(75).out.java public class Equivalencia { public static void main(String[] args) { Integer n1 = new Integer(75). este resultado se debe a que la comparación realizada por el programa es en base a referencias. Es llevada a cabo una comparación entre ambas referencias. siendo su característica principal el generar un resultado verdadero o falso.println(n1 == n2). A través de operadores relacionales es posible llevar a cabo un proceso de comparación entre dos elementos en un programa. las cuales son inicializadas con un valor de 75. System. a continuación se demuestra un uso muy común de estos operadores: Código Fuente Equivalencia. dichos operadores relacionales se muestran a continuación: 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.println(n1 != n2).println(n1.out. } } Clase Equivalencia • • • La clase anterior genera dos instancias de la clase Integer.Programación Java Básico Operadores Relacionales.out. } } Daniel Oliva Bianco 2009 58 .equals(n2)). los resultados de este programa son falso (false) y verdadero (true). Aunque el comportamiento del programa anterior parece predecible. Integer n2 = new Integer(75).

"-=". Operadores Lógicos. además de esta sintaxis también existen los operadores de auto-incremento y auto-decremento que son representados por "++" y "--" respectivamente."*=".Programación Java Básico • En el ejemplo anterior se hace uso del método equals. esta clase bajo el nombre de java. mencionados a continuación: Operador + = * / % Significado Suma Resta Igual Multiplicación División Modulo (El residuo de una División) Java también ofrece una sintaxis para llevar a cabo una operación matemática y asignación en una sola simbología. Operadores Matemáticos En Java se encuentran disponibles los mismos operadores matemáticos que en otros lenguajes."/=". a través de este método disponible en toda clase es llevado a cabo una comparación entre el valor del Objeto en sí. es solo cuando se utilizan clases cuando es necesario utilizar el método "equals" para llevar a cabo una comparación al nivel de Objetos. Además de estos operadores matemáticos.lang. mediante: "+=". Los operadores lógicos para el lenguaje Java son los siguientes: Operador || && ! Significado O (OR) Y (AND) Negación (NOT) Daniel Oliva Bianco 2009 59 . el lenguaje también posee una clase estándar (en el JDK) para realizar operaciones más complejas.Math ofrece operaciones trigonométricas. cabe mencionar que los operadores relacionales "==" y "!=" funcionan acordemente ( o como aparentemente se pensaría ) con primitivos. exponenciales y otras más.

length).println("b.length). A través de un Arreglo es posible generar agrupaciones de cualquier tipo de Objeto simplemente agregando una simbología de corchetes .length = " + d.println("d. lo cual permite una manipulación más eficiente de datos.println("a.length. // Inicialización al Crearse Arreglo Clip[] d = { new Clip().length).out. // Las referencia dentro del Arreglo // son automáticamente inicializadas a "null" for(int i = 0.out.println("b[" + i + "]=" + b[i]). // Inicialización Dinámica con Ciclo for(int i = 0.out.length). class Clip {} public class Arreglo { public static void main(String[] args) { // Arreglos de Objetos Clip[] a. // Inicialización Dinámica a = new Clip[] { new Clip().length = " + b. System.length=" + a. dividida en dos secciones. una de ellas que ha venido siendo utilizada a lo largo de los distintos programas en este curso es denominada: Arreglo.length. System.out.length = " + a. Clip[] c = new Clip[4]. Daniel Oliva Bianco 2009 60 . Un uso muy común en diseños de Software es agrupar distintos valores relacionados entre sí en una sola variable. new Clip() }. en el lenguaje Java existen diversos mecanismos para agrupar datos en conjunto. ya sea seguido de la definición de clase o bien la referencia en cuestión.Programación Java Básico Arreglos (Arrays). i < c. i++) c[i] = new Clip().println("c. System.length = " + c. // Referencia Nula Clip[] b = new Clip[5]. new Clip(). System. i < b. new Clip() }.out. System.println("a.java En el siguiente código fuente se demuestra el uso de Arreglos con clases Generadas (Propias) y primitivos. a continuación se describen diversos ejemplos más amplios de Arreglos: Código Fuente Arreglo. a = d.length).out. i++) System.

2 }. en estas declaraciones se hace uso del método interno length. int[] g = new int[4].length). // Los primitivos dentro del Arreglo // son inicializados a cero: for(int i = 0.length = " + e. seguido se encuentra la definición de la clase principal Arreglo que contiene solo su método principal (main).println("h. además de esto son impresos los valores del arreglo b.length = " + f. en el primer caso se emplea un ciclo el cual asigna un Objeto a cada valor del arreglo. i < g.out.length = " + h. dicho método está disponible para cualquier tipo de arreglo e indica la longitud del mismo. System. i++) System. e = new int[] { 1.length). for(int i = 0.println("g[" + i + "]=" + g[i]). dentro de este método se define lo siguiente: • • • En la primera sección son definidas tres referencias en manera de Arreglo para la clase Clip.length).out.println("e. mientras las siguientes líneas definen dos referencias asignándose un arreglo de 5 y 4 Objetos respectivamente. A continuación se describe el resto del Código Fuente para el programa: // Arreglo de Primitivos int[] e.length = " + e.out.length). // Error Compilación: Variable(Arreglo) no inicializada // System. System. // Referencia Nula int[] f = new int[5].length).println("f. los cuales por "default" son asignados un valor de null. } } Daniel Oliva Bianco 2009 61 . // Inicialización Dinámica con Ciclo for(int i = 0. este tipo de asignación hace que la referencia a apunte hacia los Objetos de la referencia d.Programación Java Básico Primeramente se define una clase denominada Clip la cual simplemente consta de su declaración. la primera declaración únicamente define la referencia.length. System.println("e. Posteriormente son inicializados los distintos arreglos.out.out. e = h. i++) g[i] = i*i. i++) System.println("e. System.out. i < g.length. 93 }. un detalle relevante es la asignación a = d .out. finalmente se lleva a cabo la inicialización de la referencia a En esta última sección son impresos los distintos valores de los respectivos arreglos. 47. i < f.length. seguido se genera un nuevo arreglo el cual es inicializado en la misma declaración. por lo que el último valor del arreglo(referencia) a equivale a 3. como fue demostrado en un ejemplo anterior. // Inicialización al Crearse Arreglo int[] h = { 11.println("f[" + i + "]=" + f[i]).length=" + e. además de lo anterior.

esto generaría un error de compilación debido a que el arreglo e no ha sido inicializado. En esta última sección son impresos los distintos valores de los respectivos arreglos: o La primer declaración (nótese el uso de comentarios) intenta imprimir la longitud del arreglo e. mientras las siguientes líneas definen dos variables asignándose un arreglo de 5 y 4 primitivos respectivamente. o Posteriormente se imprime el tamaño del arreglo f.Programación Java Básico • • En la primera sección son definidas tres variables en manera de Arreglo para primitivos int. o Se asigna el valor del arreglo h al arreglo e. Daniel Oliva Bianco 2009 62 . la primera declaración únicamente define la variable. es posible utilizar el método length sobre el arreglo e. • Al final de esta sección serán descritas otras metodologías para agrupar datos que poseen distintas ventajas a emplear un Arreglo. o Son redefinidos-reinicializados los valores del arreglo e con dos nuevos primitivos. seguido de la longitud del arreglo h. seguido se genera un nuevo arreglo el cual es inicializado en la misma declaración. o Se imprimen los valores de los arreglos f y g. en el primer caso se emplea un ciclo el cual asigna valores al arreglo g. los cuales como cualquier primitivo int son asignados un valor de 0 (cero) por "default". el cual tomará el mismo valor del arreglo h. Posteriormente son inicializados los distintos arreglos. o Debido a la asignación anterior. o Finalmente se imprime la nueva longitud del arreglo e.

Vectores A diferencia de un Arreglo. que además de ofrecer estas facilidades. su uso puede ser un poco deficiente ya que requiere mayor uso de memoria que un arreglo de Objetos. Algunas de las principales características de Arreglos en Java son las siguientes: • • Es necesario definir el tamaño de un Arreglo antes de ser utilizado. este se hace con la intención de administrar el uso de memoria. pero a su vez presenta la restricción de utilizar Arreglos en estructuras de datos cambiantes. también es posible que su tamaño incremente conforme las necesidades del programa lo requieran. // Un objeto de Lapiz Lapiz l = new Lapiz(). el siguiente ejemplo demuestra el uso de esta clase: Código Fuente ArticulosOficina. Un arreglo únicamente puede incluir Objetos/primitivos del mismo tipo.util. aparentemente este es un contenedor de Objetos ideal para toda situación. // Un arreglo de Plumas Pluma[] p = new Pluma[7]. sin embargo.Vector. si bien esto permite un control más estricto sobre estructura de datos. restringe una posible mezcla de elementos comunes que difieran en su clase. un Vector es un tipo de Objeto que permite almacenar objetos (referencias) de cualquier tipo. // Un arreglo de Sillas Silla[] s = { Daniel Oliva Bianco 2009 63 . Hashtables y otras estructuras de Datos. 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].Programación Java Básico Vectores.java En el siguiente código fuente se demuestra el uso de Vectores: import java.

out. Vector ciudad2 = new Vector(4.add(p).out.size() + y una capacidad de " tiene " + ciudad2. // Definir Dos Vectores Vector ciudad1 = new Vector(3). System. ciudad1. tiene " + ciudad1.out.size() + capacidad de " + + String deptExtraido = (String) ciudad1. new Silla().elementAt(0). System.println("Vector ciudad1 " elementos ciudad1. ciudad1.add(l). ciudad2.elementAt(4). ciudad1. SillaReclinable[] sr = new SillaReclinable[12].println("Vector ciudad2 tiene " + " elementos y una ciudad2. ciudad2.add(p).add(deptV).add(c).size() + capacidad de " ciudad2.size() + y una capacidad de " + + // Asignar otros valores para ver incremento de capacidad ciudad1. System. ciudad2.out.out. ciudad2.add(deptF).println("Vector ciudad1 tiene " + " elementos y una ciudad1. System.4). deptExtraido = (String) ciudad2. //Iniciar asignación de Objetos a Vectores //Un Vector puede tomar cualquier tipo de Objeto ciudad1.Programación Java Básico new Silla(). Silla[] sillaExtraida = (Silla[]) ciudad1.capacity()).capacity()). System. ciudad1.elementAt(0).capacity()). elementos: ").add(s).length + " sillas"). // Un Objeto Tipo String String deptF = new String("Finanzas").println("Vector ciudad2 " elementos ciudad2.println("El departamento de " + deptExtraido + " en la ciudad1 tiene " + sillaExtraida.add(l).capacity()). String deptV = new String("Ventas").add(c).add(s).println("Después de agregar otros System. new Silla() }. ciudad2. // La siguiente extracción generaría un error // porque este elemento del Vector ya no es una clase Silla Daniel Oliva Bianco 2009 64 . ciudad2.out.insertElementAt(sr.5).

Pluma. Es reasignado un valor del segundo vector a través del método insertElement.elementAt(4). sillaRecExtraida = (SillaReclinable[]) System.Programación Java Básico // sillaExtraida = (Silla[]) ciudad2. para posteriormente imprimirse a pantalla sus valores. la primer instancia indica que su espacio inicial será para tres objetos. con lo que puede corroborarse la manera en que incrementan su tamaño. unas de ellas en manera de arreglos y otras como un solo objeto. Son extraídos del segundo Vector dos elementos. a través de distintos constructores. Lapiz. el cual toma como valor de entrada el índice a substituirse. Daniel Oliva Bianco 2009 65 .println("El departamento de " + deptExtraido + " en la ciudad2 tiene sillaRecExtraida. } } " + Primeramente se definen varias clases que constan únicamente de su declaración: Clip. SillaReclinable seguido se encuentra la definición de la clase principal ArticulosOficina que contiene solo su método principal (main). Silla.length + " sillas"). donde el 5 indica la capacidad de incremento (delta) cuando se requiera espacio para más objetos. lo cual es llevado a cabo a través de paréntesis ( ) . dentro de este método se define lo siguiente: • • • • • • • Se definen diversas instancias de las clases declaradas con anterioridad. Son asignados otros dos objetos a los Vectores y se imprime a pantalla su tamaño y capacidad. esto se debe a que la extracción es llevada a cabo de una clase genérica (Vector) hacia una más especifica ya sea String o Silla[] ("DownCasting"). mientras la segunda instancia para cuatro objetos.out. Son asignados tres objetos a los Vectores y se imprime a pantalla el tamaño y capacidad de ambos. Son extraídos del primer Vector dos elementos. nótese que dicha extracción requiere que sea realizado un "Casting" explicito.elementAt(4). Posteriormente se definen dos vectores. SillaReclinable[] ciudad2.

= (String) direccion. el primer elemento indica el nombre ("key") del elemento. a continuación se describe un ejemplo de "Hashtable's": Código Fuente Direccion. direccion.out. esto es conocido como key-value lists y en el mundo Java recibe el nombre de "Hashtable". Integer ocho = new Integer(8000).println("Direccion: " + micalle + " " + minumero).java import java. Posteriormente se define un número Integer. 66 Daniel Oliva Bianco 2009 .put("ciudad"." + miestado). ocho). String miciudad String miestado String micalle = Integer minumero = (String) direccion.get("calle"). direccion. direccion.util.*.get("numero"). direccion."Primavera"). } } Clase Direccion Esta clase únicamente contiene su método principal (main) el cual contiene las siguientes funcionalidades: • • • • Se define una clase Hashtable con la referencia direccion.put("calle". en este ejemplo se colocan diversos Strings y la referencia del Objeto Integer. Mediante el método get son extraídos algunos valores del "Hashtable" mediante el correspondiente nombre ("key")." Monterrey "). A través del método put son colocados diversos juegos de datos en el "Hashtable".Programación Java Básico Hashtables Otro elemento que es ampliamente empleado en programación es la utilización de listas de valores con determinados conceptos. este es un de los casos donde deben ser utilizados "Wrappers" para primitivos.put("colonia".println("Lugar: " + miciudad + "." Nuevo Leon "). direccion."Mexico"). System.out. public class Direccion { public static void main(String[] args) { Hashtable direccion = new Hashtable(). direccion. mientras el segundo indica el Objeto/Valor de este nombre ("key").get("ciudad").put("numero". nótese los Objetos/Valores pueden ser de cualquier tipo.get("estado"). puesto que el elemento será integrado a un contenedor ("Hashtable") en forma de Objeto es necesario convertir ("Wrap") el primitivo como Objeto. (String) direccion.put("estado". = (Integer) direccion. System." La Silla ").put("pais".

Finalmente son impresos a pantalla algunos valores extraídos del "Hashtable". cada una de éstas posee sus ventajas y desventajas para agrupar elementos comunes. Además del uso de Vectores y "Hashtables". lo cual es llevado a cabo a través de paréntesis ( ).Programación Java Básico • • Nótese que dicha extracción requiere que sea realizado un "Casting" explicito. esto se debe a que la extracción es llevada a cabo de una clase genérica ("Hashtable") hacia una más especifica ya sea String o Integer ("Down-Casting"). también existen otra serie de clases para el almacenaje de Objetos. Daniel Oliva Bianco 2009 67 .

cada vocablo catch es seguido de un paréntesis que contiene una clase así como una referencia. Como se puede observar en la ilustración. el tipo de clases definidas dentro de cada sección catch depende del número de "Exceptions" que pueden ser generadas por el programa. para mandar llamar este tipo de clases es necesario utilizar el vocablo throws. esta Zona "Protegida" es el conocido bloque try/catch/finally. Errores y Datos de Entrada/"Streams". sin embargo. al encontrarse un error ("Exception") en Java es necesario invocar una clase que realiza las respectivas tareas. en el lenguaje Java a la ocurrencia de errores se le denomina "Exceptions" y al procesamiento de errores "try/catch". dentro de esta primer sección es colocado todo código que pueda generar algún tipo de error. Al utilizar una definición similar a la anterior. este no siempre es el caso y por esta razón en Java se define una Zona Especifica donde puede ser generado un error y a su vez atrapado. se asume que ya se conoce el tipo de error que puede ser generado en el programa.Programación Java Básico Operadores. estos son considerados los Datos de Entrada para cada sección catch. se utilizaría la siguiente sintaxis: if(t == null) throw new NullPointerException(). a continuación se describe la sintaxis de este bloque: Sintaxis del Bloque try/catch try { // Código 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 sección del Bloque es iniciada con el vocablo try y una llave ({) que indica el principio de la zona protegida. al terminar esta sección se define un grupo de estructuras con el elemento catch. Aunque el tiempo ideal para encontrar errores es al momento de compilar un programa. Definición de Errores y Bloques try/catch/finally.La metodología más común para trabajar con errores en lenguajes de programación es interrumpir el flujo de ejecución e invocar otro código que maneje el error en cuestión. Como habría de esperarse. esto no siempre es posible y por esta razón han sido diseñados mecanismos para encontrarlos al momento de ejecución ("Run-Time"). lo anterior Daniel Oliva Bianco 2009 68 . suponiendo que desea atrapar un error si determinada variable no ha sido inicializada.

siendo la menos especifica la clase java. Para todo Bloque try/catch debe ser definida al menos una sección catch.lang. es esta terminación abrupta la que puede causar que algún recurso/mecanismo permanezca asignado o mal utilizado.Throwable. Daniel Oliva Bianco 2009 69 . un uso muy común para una sección finally consiste en liberar conexiones hacia Bases de Datos que pudieran haber sido asignadas en la sección try. si son definidos más de dos clases para errores ("Exceptions") estas deben ser declaradas de más a menos especifica. esto será descrito en la siguiente sección de este curso. Sintaxis del Bloque try/catch/finally Para los Bloques try/catch existe una variación que consiste en agregar una sección denominada finally.Programación Java Básico permite definir un número ilimitado de "Exceptions" cada uno con su propio código para manejar el error. dicha estructura estaría compuesta de la siguiente manera: try { // Código 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 utilización 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. a través de una sección finally se garantiza que sea ejecutado un juego de instrucciones independientemente del tipo de error que pueda ocurrir. es de esta clase que son Heredadas todo "Exception" en Java.

generalmente se opta por java.Programación Java Básico Definición de errores propietarios Además de los errores ("Exceptions") ofrecidos en las clases Base del JDK.println("Generando Error explícitamente en f()").lang.printStackTrace(System.Exception ya que posee mayores funcionalidades (métodos). } } } En el archivo fuente anterior son diseñadas dos clases: MiError que define un error ("Exception") propietario y DefinirErrores que hace uso de esta clase. notará que la clase java. } catch(MiError e) { e. } try { g(). inclusive si observa la documentación del JDK. } public static void main(String[] args) { try { f().lang. es posible definir errores propietarios para llevar un control más estricto sobre la generación de errores: Código Fuente DefinirErrores.lang. } public static void g() throws MiError { System. NOTA: Aunque la clase base de todo error ("Exception") es java. Clase MiError • Esta clase hereda el comportamiento de Exception.println("Generando Error explícitamente g()"). } catch(MiError e) { e. throw new MiError("Originado en f()").printStackTrace(System. esto permite utilizar funcionalidades ya definidas en esta clase. } } public class DefinirErrores { public static void f() throws MiError { System.out.Throwable.Exception 70 Daniel Oliva Bianco 2009 .err).err).java class MiError extends Exception { public MiError() {} public MiError(String msg) { super(msg).out. throw new MiError("Originado en g()").

Daniel Oliva Bianco 2009 71 . Clase DefinirErrores • • • • • • Esta clase define dos métodos llamados f() y g(). es simplemente una sintaxis para los métodos capaces de generar errores. una característica especifica de estos métodos es que utilizan el vocablo throws seguido de una clase. en uno de estos es llamado el método f() y en otro el método g(). esta sintaxis es obligatoria para los métodos que puedan generar errores. En el método principal (main) son definidos dos bloques try/catch. 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 través del vocablo super.Throwable. NOTA: El método printStackTrace fue heredado de la clase Exception. La clase/método System. o Otro es el constructor sin argumentos que debe ser declarado al emplearse más de un constructor. Al ser llamada la función de cada bloque.lang.Programación Java Básico • hereda el comportamiento de la clase java. Dentro de cada método f() y g() es generado un error con la clase MiError explícitamente. Cuando se detecta (atrapa) el error se entra en la sección catch donde es invocada la función printStackTrace vía la referencia e. se genera un error del tipo MiError puesto que cada función invoca explícitamente este error.err representa el "Stream" de salida para cualquier error generado en un programa Java. debe hacerse fuerte énfasis que esto es independiente de las declaraciones hechas en los bloques try/catch. en efecto teniendo acceso a cualquiera de los métodos/campos disponibles en la clase Base.

out. System. a través de su referencia args. Los valores de entrada para el método main son tomados directamente de la línea de ejecución del programa. esto con la intención de recibir parámetros al momento de ser llamada la clase. mientras el segundo y tercero serian Pepe y Norris respectivamente.Programación Java Básico Datos de Entrada A lo largo de los diversos métodos definidos en los distintos programas. o El segundo mensaje imprime el segundo y tercer valor del arreglo. Se define el método principal (main). por lo que una vez compilada la clase (javac Nombres.println. a continuación se describe un ejemplo que hace uso de este mecanismo: Código Fuente Nombres. se ha podido observar que estos definen sus Datos de Entrada seguido del nombre del mismo dentro de un paréntesis (calificadores nombre_del_metodo (datos_de_entrada)).java public class Nombres { public static void main(String[] args) { System. • • • • • Se inicia este programa con la clásica definición de clase. el uso de corchetes ([]) al lado de la clase String indica un Arreglo de String's. esta es Sintaxis de arreglos la cual será descrita a fondo en otra sección.java) la ejecución sería llevada a cabo de la siguiente manera: $ java Nombres Chuck Pepe Norris • • En este caso el primer valor del arreglo de String's sería el Nombre Chuck. a continuación se describe este mismo programa con un bloque try/catch para manejar el error de una manera apropiada: Código Fuente NombresBlock. nótese que este primer valor es indicado con el número cero.java 72 Daniel Oliva Bianco 2009 .out.println("Sus apellidos son: " + args[1] args[2]). } } + " " + Clase Nombres. Se imprimen dos mensajes a pantalla a través de la clase System. inclusive si no proporciona ningún argumento será generado un error ("Exception"). por "default" los métodos principales (main) en Java deben especificar un Arreglo de String's en su definición.println("Su nombre es: " + args[0]).out. o El primer mensaje imprime el primer valor del arreglo de entrada. seguido de la referencia empleada dentro del método. Ejecución de clase Nombres. La sintaxis de los datos de entrada se compone de dos partes: El tipo de clase/Primitivo.

Programación Java Básico

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 genérico"); } } }

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 sección try, si es generado un error, se inicia la inspección sobre las secciones catch hasta que el error ("Exception") coincida con una declaración. En esta caso, si son omitidos algunos parámetros de entrada para el programa, dentro del bloque try se estaría tratando de acceder elementos no definidos en el arreglo, este tipo de error ("Exception") es precisamente ArrayIndexOutOfBoundsException, por lo que serán ejecutadas las instrucciones definidas dentro de este bloque. Ahora bien, nótese 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 sería si el programa generara otro error ("Exception") distinto a ArrayIndexOutOfBoundsException.

Daniel Oliva Bianco 2009

73

Programación Java Básico

"Streams"
Un "Stream" es un nombre genérico otorgado a un flujo de caracteres en un programa de computo, puede estar compuesto por los valores residentes en un archivo texto, datos introducidos interactivamente por un usuario o datos que desean ser colocados en determinado archivo. Un "Stream" es la representación más cruda de un juego de datos, pero una manera muy universal de acceder/guardar datos, inclusive la clase System.out.println utilizada en la gran mayoría de los programas de este curso también es un "Stream"; en Java existen diversas clases utilizadas en conjunción de "Streams", a continuación se describen estas clases:

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/Método 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 documentación incluida en el JDK para conocer el uso, comportamiento y métodos 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, además debido a que las clases Writer y Reader son una adición más reciente al JDK, estas poseen mayor velocidad de ejecución a diferencia de sus contra partes InputStream y OutputStream. Ambas variaciones siguen en uso hoy en día, inclusive existen dos clases que permiten una conversión hacia estas clases más recientes:
Daniel Oliva Bianco 2009 74

Programación Java Básico
• • InputStreamReader convierte un InputStream a Reader OutputStreamWriter convierte un OutputStream a Writer

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

Ej 1: Código 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á diseñada para leer el archivo de Código Fuente presente, leer un renglón 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 método principal (main) y un bloque try/catch.

Daniel Oliva Bianco 2009

75

BufferedReader sarchivo = new BufferedReader( new FileReader(archivo)). while (( s = sarchivo. Se declara una instancia de la clase BufferedReader .txt).out. esta clase recibe como parámetro de entrada la clase BufferedWriter la cual a su vez recibe la clase FileWriter.Programación Java Básico Lectura de Datos • • • • • En la primer sección es definida una clase BufferedReader. esta última toma como parámetro el archivo que será generado (Archivo_Stream. NOTA: El método readLine retorna un resultado null ya que el archivo no contenga líneas. public class Calculo { public static void main(String[] args) throws IOException String s. el cual en cada iteración asigna los valores de cada renglón leído hacia la referencia de la clase PrintWriter.io. nótese que no es necesario colocar esta declaración dentro de un bloque try/catch puesto que ya se sabe que el archivo existe.println("El archivo " + archivo + { Daniel Oliva Bianco 2009 76 .in)). es concatenado cada renglón leído 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). Es definida una clase PrintWriter que permite escritura de "Streams".readLine(). la cual recibe como parámetro de entrada el String definido en la sección de lectura. El valor introducido por el usuario es concatenado a la variable s2 que contiene el archivo de código fuente. Dentro de cada iteración. Se define un ciclo while que permanecerá activo hasta que el resultado del método readLine() sobre la referencia definida anteriormente equivalga a null. la cual lee el archivo de Código Fuente.readLine()) != null) lineas++. System. Ej 2: Código Fuente Calculo. String archivo = stdin. Escritura de Datos • • • • • Se inicia un Bloque try/catch.*. Se genera un ciclo while.print("Que archivo desea analizar ? "). int lineas = 1.java import java.out. try { System. BufferedReader stdin = new BufferedReader( new InputStreamReader(System. Se define un error ("Exception") del tipo EOFException el cual sería generado en caso de llegar a un fin prematuro del archivo.

la cual contiene los mecanismos necesarios para leer un Archivo.out. o Se extrae el nombre del archivo a través del método readLine() y es asignado a una referencia de String. } } } contiene " + lineas + " renglones de Clase Calculo Esta clase está diseñada para interrogar al usuario sobre determinado archivo. la cual permite leer datos de un "Stream". o Se entra en un ciclo while el cual permanecerá activo hasta que el resultado del método readLine() sobre la referencia definida anteriormente equivalga a null. } catch (IOException exc) { System.Programación Java Básico " Codigo. o El argumento que recibe al ser generada la clase anterior es otra clase llamada FileReader.java\")"). consta únicamente de su método principal (main) y un bloque try/catch/finally. 77 Daniel Oliva Bianco 2009 .out. practicando!"). NOTA: El método readLine retorna un resultado null ya que el archivo no contenga líneas. en este caso siendo System. Posteriormente se define el bloque try/catch/finally con las siguientes características: try o Se despliega una pregunta al usuario para que proporcione el nombre del archivo a leer.in que representa el shell de ejecución. 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."). System.err.println("Es la mejor manera de aprender Streams. } finally { System.println(""). System. leer su contenido y finalmente indicar al usuario el número de renglones que contiene.println(exc). • • • De inicio son definidos dos campos para utilizarse dentro del método principal (main) .println("Asegurese de haber proporcionado " + " la extension del archivo (\". y en este caso recibiendo el nombre del archivo. o Es generada una nueva instancia de la clase BufferedReader a la cual será asignada el archivo en cuestión.out.

o Se imprime a pantalla un mensaje cada vez que sea ejecutado el programa. ocurra o no ocurra un error ("Exception"). se envía a pantalla una sugerencia así como el error completo. o En caso de generarse este error. finally o Esta sección del Bloque describe instrucciones que siempre deben ser ejecutadas independientemente de ser generado un error ("Exception") o no.Programación Java Básico o o • Dentro de cada iteración de ciclo se incrementa la variable (primitivo) líneas la cual representa el número de líneas en el archivo. este tipo de error es generado al no poderse iniciar lectura/escritura en un programa. o • Daniel Oliva Bianco 2009 78 . o En este programa el error sería generado al intentarse leer un archivo inexistente proporcionado por el usuario. catch Dentro de esta sección del Bloque se intenta atrapar un error ("Exception") del tipo IOException. Finalmente se envía a pantalla el resultado obtenido del ciclo.

Sign up to vote on this title
UsefulNot useful