P. 1
Curso Java Basico

Curso Java Basico

|Views: 212|Likes:
Publicado porCarlos Rubina

More info:

Published by: Carlos Rubina on Apr 17, 2012
Copyright:Attribution Non-commercial

Availability:

Read on Scribd mobile: iPhone, iPad and Android.
download as PDF, TXT or read online from Scribd
See more
See less

03/19/2013

pdf

text

original

Sections

  • 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
  • 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
  • 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
  • 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"

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

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.prender(). jardin. apagar. 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. candil. girar y cambiar.elevar().apagar(). esto se demuestra a continuación: Lampara candil = new Lampara().prender(). candil.girar(). a través de esta referencia se manda llamar el método prender() definido en la misma clase. en la segunda línea. candil. para crear un Objeto de esta clase y ser utilizado dentro de un programa es necesario generar una instancia del mismo. Lampara jardin = new Lampara().apagar(). Daniel Oliva Bianco 2009 4 . Lo anterior demuestra una de las principales características de los lenguajes orientados a Objetos. candil. Lampara manual = new Lampara(). a través de referencias es posible generar distintos Objetos del mismo tipo cada uno con su propio comportamiento: Lampara candil = new Lampara().prender(). jardin. manual. sin embargo. El primer renglón genera una instancia de la clase Lampara la cual es asignada a la referencia candil.

Esta interoperabilidad de ejecución se debe a que el Byte-Code es ejecutado en una maquina virtual llamada "Java Virtual Machine". Windows . pre-aparición de Java el lenguaje C++ se encontraba en la cúspide para desarrollos de Software con orientación a Objetos. run everywhere" (Escríbalo una vez. 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. Hoy en día. es a través de este componente que se logra una ejecución idéntica en distintos ambientes.HP-UX hasta productos como Bases de Datos Oracle y Servidores de Aplicaciones BEA. ejecútelo en todos lados). esto permite que código escrito en Java pueda ser ejecutado en cualquier ambiente produciéndose los mismos resultados. Solaris. a diferencia de otros lenguajes este binario (Byte-Code) puede ser ejecutado en diversas plataformas obteniéndose el mismo resultado final.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. sin embargo.class. sin embargo. Daniel Oliva Bianco 2009 5 . este binario denominado Byte-Code en Java lleva por extensión . existen diversos JVM ("Java Virtual Machines") para distintas plataformas y ambientes que oscilan desde los Sistemas Operativos Linux. Java ha venido suplantando su uso debido a dos características muy especificas que C++ no ofrece. a continuación se ilustra este concepto.

en el proceso despreocupándose de la destrucción de Objetos. es lógico que estas instancias de Objetos requieren memoria ("RAM") para mantener su información. sin embargo. el cual significa que los recursos de memoria ("RAM") han sido agotados en el sistema. 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. En el mundo Java. Aunque el concepto de recolección de basura ("Garbage Collection") posee una infinidad de detalles en su fondo. esto trae consigo el problema denominado "fuga de memoria" ("memory leak"). 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. lo cual le permite ir eliminando las instancias de Objetos que han dejado de ser utilizadas en un programa. es conveniente saber que este proceso es llevado automáticamente por Java. este mecanismo a través del JVM ("Java Virtual Machine") inspecciona constantemente la memoria empleada por Java. Suponga que ha diseñado un programa que invoca la creación de miles de instancias. ahora bien. también tiene sentido asumir que la memoria ("RAM") es limitada en todo sistema. 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 .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.

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

jar server client Como se puede observar. se recomienda observarla en estos momentos para que se familiarice con sus clases Base.Programación Java Básico La estructura de directorios del JDK/J2SE es la siguiente: JDK 1.4. la estructura se encuentra dividida en tres grandes partes: • • • bin : Incluye los ejecutables para la generación de programas Java.2 ___________|_________________ | | | bin lib jre | | ________|__________ java* tools.jar | | javac* dt. el cual a su vez se encuentra sub-dividido en distintos directorios. Dependiendo de la manera en que haya instalado la documentación del JDK. 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 .jar ext security i386 applet fonts charsets.jar bin lib javap* | ________ ___|___ _________ ________ _______ javah* java* | | | | | | javadoc* rt. jre : Incluye el ambiente necesario para ejecutar programas Java.jar | / \ | / \ localedata.

lo cual indica que no será retornado ningún valor 9 Daniel Oliva Bianco 2009 . el cual ilustra la sintaxis así como estructura de un programa básico. clases y Librerías ("Packages").java debe incluir una definición de una clase llamada Basico. Para entrar en materia es necesario escribir nuestro primer programa Java. 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. Dentro de la definición de la clase se deben incluir los respectivos métodos que podrán ser invocados. en este caso se utiliza el calificador public. en este caso el archivo Basico. ambos inician con letra mayúscula lo cual es una convención llevada a cabo para la definición de clases. En base a su ambiente. 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. abra un Editor de Textos para generar el siguiente ejemplo. nótese que ambos nombres coinciden en su sintaxis. dicho método es invocado por "default" al ejecutarse el programa (Clase).java public class Basico { public static void main(String args[]) { System. Nótese que el método inicia con letra minúscula.out.java únicamente es definido el método main.Programación Java Básico Composición. esto es. En el caso del programa Basico.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. esta es otra convención utilizada para diferenciarse de las distintas clases. } } Programa Java Introducción Basico. Código Fuente Basico.println("Un despliegue de Datos"). Un programa Java.

println envía un mensaje a la pantalla Método principal main El método principal main de una clase Java es inalterable. 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. para ejecutar este Byte-Code es empleado el comando java: $ java Basico Al invocar el comando anterior será ejecutada la clase Basico.class. esto es.class.out. dicho método representa el único mecanismo automático para realizar tareas al invocarse una clase. al momento de ejecutarse determinada clase siempre será ejecutado todo el contenido dentro de dicho método.java Lo anterior genera un archivo llamado 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[]). Finalmente la clase/Método System.class. por ende. es este sentido inalterable se refiere a sus características: • • • Siempre debe incluir los calificadores: public y static. siempre debe indicar el valor void como retorno. Aunque no es un requerimiento definir el método main dentro de toda clase Java. Nunca puede retornar un valor como resultado. Daniel Oliva Bianco 2009 10 . Para generar una clase compilada (Byte-Code) se utiliza el comando javac : $ javac Basico. Nótese que el comando java recibe el nombre de la clase sin la extensión .

Java toma una perspectiva nueva respecto a otros lenguajes. 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. lo anterior se ilustra mejor a través de un ejemplo: En base a su ambiente. 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. esta sub-clasificación se Daniel Oliva Bianco 2009 11 . es necesario crear una estructura de directorios para generar las determinadas clases. observe: +-com+| +-test +| +-escritura+| +-graficas+| +-correo+| +-errores+| +-auxiliares+- Lo anterior demuestra una estructura para las librerías del dominio com.Programación Java Básico Librerías ("Packages") y JAR's. adoptando una convención a partir de Dominios en Internet. Conforme empieza a crecer un desarrollo de Software surge la necesidad de reutilizar ciertos componentes que ya han sido escritos. además de esto. esto es. así como dar cierta estructura para mantener una organización de código. al igual que otros lenguajes. es posible que existan librerías de 5 o 10 niveles de profundidad. esta organización se lleva a cabo mediante librerías.test . esto es. se debe mencionar que no existe ninguna restricción en el número de directorios anidados. puesto que es una característica de Dominios en Internet. empleando Dominios en Internet se garantiza que el nombre de la clase/Librería sea única. denominadas "packages" en el mundo Java . 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. 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. lo anterior permite evitar la tan conocida Colisión de Nombres en Software.

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

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

• Para ejecutar este programa también se requiere descender al directorio raíz de la librería ("Package"). 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. Daniel Oliva Bianco 2009 14 . esto es. 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. lo anterior se debe a que esta clase requiere ubicar (importar) las clases de la Librería ("Package") com/test/escritura./com). razón que también está relacionada con la variable CLASSPATH y será descrita a fondo en su sección. los detalles de esta rutina serán descritos en la sección de CLASSPATH.Programación Java Básico • • Posteriormente se importan las clases que serán utilizadas en el programa a través del vocablo import. aunque esta clase radique dentro del directorio com/test/auxiliares es necesario llevar a cabo la compilación desde la raíz (.

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 . En la siguiente sección se describe como son utilizados estos archivos JAR en la compilación/ejecución de programas Java. si ha generado 100 o 500 clases sería muy impráctico distribuir la estructura de directorios a un tercero para ser utilizada. Observar contenido de Archivo JAR Para observar el contenido de un archivo JAR. esto se realiza a través del siguiente comando: $ jar xvf test .jar.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 con todos los archivos .jar. NOTA: Este comando únicamente despliega el contenido. lo anterior permite: • • Distribuir/Utilizar clases de una manera eficiente a través de un solo archivo.class que residen en la estructura de directorios.jar * Al ejecutar el comando anterior se genera una archivo JAR llamado test .jar El comando anterior despliega el contenido del archivo JAR test . esto es. se utiliza un comando similar: $ jar tvf test . Una archivo JAR es simplemente un archivo comprimido que incluye una estructura de directorios con clases. Extracción de Archivo JAR En ocasiones es conveniente extraer el contenido de un archivo JAR para llevar acabo modificaciones. para este problema han sido diseñados los archivos JAR ("Java Archives"). Declarar dichas clases de una manera más eficiente en la variable CLASSPATH. Daniel Oliva Bianco 2009 15 .jar El comando anterior genera una estructura de directorios con el contenido del archivo JAR test .

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

. Cabe mencionar que al modificar la variable CLASSPATH de esta manera.bashrc. En Windows NT: Seleccione el Tab Environment En Windows 2000/XP : Seleccione el Tab Advanced Posteriormente entre en Variables de Entorno ("Environment Variables"). lo anterior en Sistemas Unix se hace modificando el archivo /etc/profile o el perfil del usuario ~/.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 .%CLASSPATH%. lo cual permite mantener los valores preexistentes. será únicamente el Shell existente el cual reflejará estos cambios.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 . esto es. • • El comando anterior modifica el valor de la variable CLASSPATH agregando el archivo JAR (test . si usted posee otros programas que hacen uso de Java será necesario modificar el valor de CLASSPATH al nivel de sistema.Settings -Control Panel y el icono System.jar). Daniel Oliva Bianco 2009 17 . Localize o genere la variable "CLASSPATH" en variables de Sistema ("System Variables").jar. el termino $CLASSPATH (%CLASSPATH% en Windows) indica el valor previo de la variable.. 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.

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

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

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

en efecto logrando un nivel de eficiencia en ejecución. Daniel Oliva Bianco 2009 21 . el término final lleva dicha instancia a una definición única y como su nombre lo implica final. A diferencia de static que implica una sola instancia. De igual manera que la utilización de static el uso de final será ilustrado conforme se avance en este curso. El calificador final estrechamente relacionado con el uso de static implica una asignación única y definitiva al elemento de una clase. a través de final se asigna un valor que no podrá ser modificado bajo ninguna circunstancia al momento de ejecución ("Run-Time).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 .

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

1 +127 +215-1 +231-1 +263-1 IEEE754 IEEE754 Valor Default false `\u0000' (null) (byte) 0 (short) 0 0 0L 0. 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. posteriormente se genera una instancia de la clase Character (Nótese el uso del vocablo new). estos "Wrappers" son clases utilizadas como contra parte de primitivos: char c = 'x'.0f 0. sin embargo. vale mencionar que existen diversos mecanismos para convertir de clases tipo Objeto ("Wrappers") a primitivos y viceversa. Daniel Oliva Bianco 2009 23 . en la tabla anterior se describen los rangos de dichos primitivos así como sus respectivos "Wrappers".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. Character C = new Character(c).

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

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

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

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

a continuación se describe un ejemplo: Comentarios en Java Primeramente vale hacer mencionar los tipos de comentarios utilizados en Java. sin embargo. dependiendo de la ubicación de este comentario será generada la Daniel Oliva Bianco 2009 28 .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. cualquier palabra entre /* y */ es considerada comentario. /** A comentario para método */ public void f() {} } */ Todo elemento colocado entre los elementos /** */ será contemplado en la generación de documentación. 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. esto es. existen dos tipos de comentarios puros como tal: /* Este es un comentario que expande diversas lineas. ya que por una parte debe mantenerse el código funcional mientras se debe generar documentación acerca de la funciones. en muchas ocasiones esta documentación ni existe. al igual que todo renglón que inicie con //. a partir de ellos no son generados ningún tipo de documentación. 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. 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. en Java la generación de Documentación es llevada en conjunción del código a través de comentarios.

com * @version 1. } } Los elementos que inician con el símbolo @ son utilizados para indicar parámetros específicos dentro de la documentación.out. si aparece antes de un elemento class es considerado documentación para la clase y así sucesivamente. al ser indicado este Daniel Oliva Bianco 2009 29 .out. Existe otra sintaxis específica para definir los elementos dentro de los comentarios. System. esto es. @deprecated Este parámetro es utilizado para indicar que una clase ha sido repuesta por otra más reciente.println("Hoy es: "). * @author Juan Sanchez * @author jsanchez@test . 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. La definición de clases para Errores será descrita en clase> otra sección.*. así como el proceso para generar la documentación HTML / XHTML del código fuente Java. los anteriores son algunos elementos que pueden ser utilizados al definir documentación.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.util. la cual se ilustra a continuación: import java. de la clase> genera un link HTML / XHTML hacia la clase en cuestión.println(new Date()).Programación Java Básico documentación. /** * Programa que Despliega la Fecha. @throws Empleado para indicar la clase utilizada al generarse un <Nombre de la Error. En la siguiente sección serán ilustrados otros elementos @.

test .test .Programación Java Básico parámetro en una clase/Método el compilador (javac ) generará un aviso. /** * Programa para demostración de import en la clase * @author Juan Sanchez Daniel Oliva Bianco 2009 30 .escritura.java package com. } } Clase MandaPantalla.com * @version 1.java package com.out. } /** 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. lo anterior permite generar listas enumeradas. Además de los parámetros anteriores también es posible escribir lenguaje HTML / XHTML entre los elementos /** */ .auxiliares. con los respectivos comentarios para generar documentación: Clase Pantalla. /** * Programa con métodos auxiliares para salto de linea * y linea continua * @author Juan Sanchez * @author jsanchez@test .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.escritura. dar mayor estilo a la documentación y cualquier otro formato disponible en HTML / XHTML .println(s).*. import com.out.print(s). A continuación se ilustran dos clases escritas anteriormente. indicando que la clase/Método ha sido repuesta.test .

primera.java) y los directorios com/test /escritura y com/test /auxiliares. primera.java com/test /escritura/*. primera.out.escritura. de ser definido en la clase. en este caso se ha generado un directorio llamado docs.println(" Se termina el uso de funciones"). primera. primera. a continuación se describe su uso más básico: $ mkdir docs $ javadoc -d docs/ -version -author -use *. System.conSalto("Esta linea también tiene salto").test . o -use: Es el parámetro utilizado para indicar los directorios donde residen las clases sobre las que será generada la documentación. o -author: En caso de ser definido el parámetro autor. en este caso se está indicando el directorio presente (*.java com/test /auxiliares/*.Programación Java Básico * @author jsanchez@test .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().conSalto("Esta linea si tiene salto!"). este aparecerá en la documentación.6 * @see com. Posteriormente es invocado el comando javadoc con los siguiente parámetros: o -d docs: Indica el directorio donde será depositada la documentación (docs). } } Generación de Documentación El comando javadoc posee una gran cantidad de parámetros para generar documentación.sinSalto("Termina sin salto").java • • El primer paso antes de generar cualquier documentación Java es crear un directorio donde residirá la documentación. o -version: Implica que al ser generada la documentación sea desplegado el número de versión.conSalto("Esto es un renglón CON salto de linea").sinSalto("Linea Continua"). 31 Daniel Oliva Bianco 2009 . primera.com * @version 1.sinSalto("Linea Continua").

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.

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

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

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

sin embargo. el fragmento anterior es correcto y demuestra el concepto de Polimorfismo. donde todas son descendientes de la clase Base java. Figura b = new Triangulo().lang. si observa la documentación de estas clases. para asentar este tema se describe un ejemplo más completo: Daniel Oliva Bianco 2009 36 . morfismo= Formas. esto implica que un mismo Objeto puede tomar diversas formas. 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. el término Polimorfismo también es asociado con un concepto llamado Late-Binding (Ligamiento Tardío). Polimorfismo El concepto de Polimorfismo es uno de los fundamentos para cualquier lenguaje orientado a Objetos. observe el siguiente fragmento de código: Figura a = new Circulo(). notará en la parte superior el árbol de Herencias ("Inheritance") para la clase correspondiente. inclusive las clases Base del JDK lo utilizan extensamente.Programación Java Básico El uso de Herencias es ampliamente utilizado en diseños Java.Object. las mismas raíces de la palabra pueden ser una fuerte pista de su significado: Poli = Multiple. 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.

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

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

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

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

out.println("Saxofon. } public void afinar() {} } class Saxofon extends Instrumento { public void tocar() { System. Al ser definido un método como abstract se restringe que éste sea llamado directamente.tocar()"). este calificativo es: abstract.println("Piano.out.*. } class Guitarra extends Instrumento { public void tocar() { System. } public String tipo() { return "Saxofon". 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. Al ser definida una clase. } public String tipo() { return "Piano".tocar()"). Código Fuente Musica2. Clases Abstractas.tocar()").out.println("Guitarra. } public abstract void afinar().util.java import java. } public void afinar() {} } // Un tipo de Guitarra class Guzla extends Guitarra { public void tocar() { Daniel Oliva Bianco 2009 41 . } public String tipo() { return "Guitarra".Programación Java Básico Interfaces y clases Abstractas. } public void afinar() {} } class Piano extends Instrumento { public void tocar() { System. public String tipo() { return "Instrumento". 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. abstract class Instrumento { public abstract void tocar(). en Java existe un vocablo que permite prohibir el uso de métodos en clases Base. cuando una clase contiene un método de este tipo a ésta se le llama: clase Abstracta.

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

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

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

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

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

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

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

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

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

random().java public class PruebaWhile { public static void main(String[] args) { double r = 0.random (proporcionada en las clases Base del JDK).println(r).out. Se define un primitivo del tipo double con valor inicial de 0 (cero). 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. while(r < 0. Es impreso a pantalla (vía System. el valor de la variable es modificado con un número aleatorio a través de la función Math.out. la d al final del numero indica un número (primitivo) del tipo double . System.99d) { r = Math. Se define el método principal (main). que toma como valor de entrada un número (primitivo).99. Código Fuente PruebaWhile.println) el valor de la variable r. } } } Clase PruebaWhile • • • • • • Se inicia este programa definiendo la clase en cuestión. Dentro del ciclo. Daniel Oliva Bianco 2009 51 .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. el uso de corchetes ([]) al lado de la clase String indica un Arreglo de String's.

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

break. break. Los juegos de valores son iniciados con case seguido del posible valor de la variable.println("Mayo").println("Abril"). • • • 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. • Dada una variable de entrada esta se define seguido del vocablo switch. break.println("Enero"). 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 . case 4: System.out.out.println("Febrero"). case 5: System. break.println("Diciembre").println("Marzo"). case 6: System. case 7: System. case 2: System. este tipo de estructura es ideal cuando se requieren condicionales que lleven más de dos valores. break.java public class Meses { public static void main(String[] args) { int month = 8.out.println("Julio"). case 10: System. break. break. break. } } } Daniel Oliva Bianco 2009 53 . case 9: System. case 3: System. Un valor opcional es la definición de la linea default.out.println("Agosto"). 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.println("Septiembre").out. cuyas instrucciones serán ejecutadas en caso que la variable del switch no coincida con los valores definidos.println("Junio").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.out.println("Octubre").out. case 11: System. case 12: System. break. break.out. case 8: System.out. switch (month) { case 1: System. Código Fuente Meses. break. break. break.out. break.out.out. Se abre una llave para iniciar los posibles valores que pueda tomar dicha variable. break.println("Noviembre").

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

Finalmente. ya que al no indicarse se continúan evaluando los distintos valores restantes en un switch.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. esto es. para este tipo de situaciones (String u otro Objeto) se requiere usar condicionales if/else anidadas. Daniel Oliva Bianco 2009 55 . al omitir el uso del vocablo break. no se puede definir un juego de String's y comparar sus valores. ya que son agrupados distintos valores. vale mencionar que las datos que se puede evaluar a través de un switch son solo primitivos.

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

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

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

Además de estos operadores matemáticos."/=". el lenguaje también posee una clase estándar (en el JDK) para realizar operaciones más complejas. 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 . 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í. esta clase bajo el nombre de java. cabe mencionar que los operadores relacionales "==" y "!=" funcionan acordemente ( o como aparentemente se pensaría ) con primitivos.Programación Java Básico • En el ejemplo anterior se hace uso del método equals. exponenciales y otras más.Math ofrece operaciones trigonométricas."-=". mediante: "+=". 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. 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."*=".lang. 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.

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

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

o Posteriormente se imprime el tamaño del arreglo f. el cual tomará el mismo valor del arreglo h. en el primer caso se emplea un ciclo el cual asigna valores al arreglo g. seguido de la longitud del arreglo h. mientras las siguientes líneas definen dos variables asignándose un arreglo de 5 y 4 primitivos respectivamente. 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 Finalmente se imprime la nueva longitud del arreglo e. Daniel Oliva Bianco 2009 62 . o Se imprimen los valores de los arreglos f y g. esto generaría un error de compilación debido a que el arreglo e no ha sido inicializado.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. Posteriormente son inicializados los distintos arreglos. la primera declaración únicamente define la variable. los cuales como cualquier primitivo int son asignados un valor de 0 (cero) por "default". o Debido a la asignación anterior. o Son redefinidos-reinicializados los valores del arreglo e con dos nuevos primitivos. 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. seguido se genera un nuevo arreglo el cual es inicializado en la misma declaración.

también es posible que su tamaño incremente conforme las necesidades del programa lo requieran. 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]. // Un arreglo de Plumas Pluma[] p = new Pluma[7]. sin embargo. su uso puede ser un poco deficiente ya que requiere mayor uso de memoria que un arreglo de Objetos. // Un arreglo de Sillas Silla[] s = { Daniel Oliva Bianco 2009 63 . // Un objeto de Lapiz Lapiz l = new Lapiz().java En el siguiente código fuente se demuestra el uso de Vectores: import java. un Vector es un tipo de Objeto que permite almacenar objetos (referencias) de cualquier tipo.Vector. el siguiente ejemplo demuestra el uso de esta clase: Código Fuente ArticulosOficina.Programación Java Básico Vectores. 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. Vectores A diferencia de un Arreglo.util. 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. que además de ofrecer estas facilidades. aparentemente este es un contenedor de Objetos ideal para toda situación. Un arreglo únicamente puede incluir Objetos/primitivos del mismo tipo. pero a su vez presenta la restricción de utilizar Arreglos en estructuras de datos cambiantes.

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

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

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

Además del uso de Vectores y "Hashtables". Finalmente son impresos a pantalla algunos valores extraídos del "Hashtable". también existen otra serie de clases para el almacenaje de Objetos. 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"). 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. Daniel Oliva Bianco 2009 67 . cada una de éstas posee sus ventajas y desventajas para agrupar elementos comunes.

sin embargo. se utilizaría la siguiente sintaxis: if(t == null) throw new NullPointerException().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. 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. Aunque el tiempo ideal para encontrar errores es al momento de compilar un programa. lo anterior Daniel Oliva Bianco 2009 68 . estos son considerados los Datos de Entrada para cada sección catch. esto no siempre es posible y por esta razón han sido diseñados mecanismos para encontrarlos al momento de ejecución ("Run-Time").Programación Java Básico Operadores. esta Zona "Protegida" es el conocido bloque try/catch/finally. cada vocablo catch es seguido de un paréntesis que contiene una clase así como una referencia. 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. Errores y Datos de Entrada/"Streams". 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. 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. al terminar esta sección se define un grupo de estructuras con el elemento catch. al encontrarse un error ("Exception") en Java es necesario invocar una clase que realiza las respectivas tareas. Definición de Errores y Bloques try/catch/finally. Como habría de esperarse. Como se puede observar en la ilustración. en el lenguaje Java a la ocurrencia de errores se le denomina "Exceptions" y al procesamiento de errores "try/catch". se asume que ya se conoce el tipo de error que puede ser generado en el programa. suponiendo que desea atrapar un error si determinada variable no ha sido inicializada.

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. siendo la menos especifica la clase java. 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. Para todo Bloque try/catch debe ser definida al menos una sección catch. Cuando se atrapa un error ("Exception") un programa queda inconcluso.Throwable. esto será descrito en la siguiente sección de este curso.Programación Java Básico permite definir un número ilimitado de "Exceptions" cada uno con su propio código para manejar el error. es esta terminación abrupta la que puede causar que algún recurso/mecanismo permanezca asignado o mal utilizado. Sintaxis del Bloque try/catch/finally Para los Bloques try/catch existe una variación que consiste en agregar una sección denominada finally. 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.lang. Daniel Oliva Bianco 2009 69 . es de esta clase que son Heredadas todo "Exception" en Java. si son definidos más de dos clases para errores ("Exceptions") estas deben ser declaradas de más a menos especifica.

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

Daniel Oliva Bianco 2009 71 . 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. en efecto teniendo acceso a cualquiera de los métodos/campos disponibles en la clase Base. En el método principal (main) son definidos dos bloques try/catch. Dentro de cada método f() y g() es generado un error con la clase MiError explícitamente. en uno de estos es llamado el método f() y en otro el método g(). 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. Al ser llamada la función de cada bloque. NOTA: El método printStackTrace fue heredado de la clase Exception.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. 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.Programación Java Básico • hereda el comportamiento de la clase java. esta sintaxis es obligatoria para los métodos que puedan generar errores.lang. La clase/método System. se genera un error del tipo MiError puesto que cada función invoca explícitamente este error.Throwable. o Otro es el constructor sin argumentos que debe ser declarado al emplearse más de un constructor.

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

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

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

println(exc).out. 77 Daniel Oliva Bianco 2009 . } finally { System. la cual contiene los mecanismos necesarios para leer un Archivo.println(""). o Se extrae el nombre del archivo a través del método readLine() y es asignado a una referencia de String. } catch (IOException exc) { System. practicando!").java\")"). System. } } } 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". NOTA: El método readLine retorna un resultado null ya que el archivo no contenga líneas. leer su contenido y finalmente indicar al usuario el número de renglones que contiene. o El argumento que recibe al ser generada la clase anterior es otra clase llamada FileReader.println("Es la mejor manera de aprender Streams.Programación Java Básico " Codigo. en este caso siendo System.out. 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. o Es generada una nueva instancia de la clase BufferedReader a la cual será asignada el archivo en cuestión. consta únicamente de su método principal (main) y un bloque try/catch/finally. • • • De inicio son definidos dos campos para utilizarse dentro del método principal (main) .").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. 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.out.println("Asegurese de haber proporcionado " + " la extension del archivo (\". System.err. y en este caso recibiendo el nombre del archivo.

o • Daniel Oliva Bianco 2009 78 . Finalmente se envía a pantalla el resultado obtenido del ciclo. este tipo de error es generado al no poderse iniciar lectura/escritura en un programa. o Se imprime a pantalla un mensaje cada vez que sea ejecutado el programa. se envía a pantalla una sugerencia así como el error completo. finally o Esta sección del Bloque describe instrucciones que siempre deben ser ejecutadas independientemente de ser generado un error ("Exception") o no. catch Dentro de esta sección del Bloque se intenta atrapar un error ("Exception") del tipo IOException. ocurra o no ocurra un error ("Exception"). o En caso de generarse este error.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. o En este programa el error sería generado al intentarse leer un archivo inexistente proporcionado por el usuario.

You're Reading a Free Preview

Descarga
scribd
/*********** DO NOT ALTER ANYTHING BELOW THIS LINE ! ************/ var s_code=s.t();if(s_code)document.write(s_code)//-->