Sei sulla pagina 1di 54

Contenidos

Artculos
Versin Para Imprimir Estructuras de control Estructuras de seleccin Sentencia if-else Sentencia switch Operador if-else Estructuras de iteracin Sentencia while Sentencia do-while Sentencia for Sentencia break Sentencia continue Funciones Parmetros de una funcin Clusula return Funciones recursivas Programacin Orientada a Objetos Clases Ejemplos de Implementacin Ejercicios Prcticos Objetos Encapsulamiento Herencia Interfaces Polimorfismo La clase String La clase StringBuffer La clase ArrayList La clase Vector La clase Hashtable Imprimir en Pantalla Applets Threads Palabras reservadas 1 4 4 5 9 12 13 14 16 18 20 21 21 23 26 27 28 29 31 32 32 33 33 33 34 34 35 36 38 40 41 42 42 42

Crear un PDF en Java

44

Referencias
Fuentes y contribuyentes del artculo Fuentes de imagen, Licencias y contribuyentes 50 51

Licencias de artculos
Licencia 52

Versin Para Imprimir

Versin Para Imprimir


Caractersticas del lenguaje
Lenguaje totalmente orientado a Objetos. Todos los conceptos en los que se apoya esta tcnica, encapsulacin, herencia, polimorfismo, etc., estn presentes en Java. Disponibilidad de un amplio conjunto de libreras. Como ya se mension anterirmente, Java es algo mas que un lenguaje. La programacin de aplicaciones con Java se basa no solo en el empleo del juego de instrucciones que componen el lenguaje, sino, fundamentalmente, en la posibilidad de utilizar el amplsimo conjunto de clasas que Sun pone a disposicin del programador y con las cuales es posible realizar prcticamente cualquier tipo de aplicacin. Lenguaje simple. Java posee una curva de aprendizaje muy rpida. Resulta relativamente sencillo escribir applets interesantes desde el principio. Todos aquellos familiarizados con C++ encontrarn que Java es ms sencillo, ya que se han eliminado ciertas caractersticas, como los punteros. Debido a su semejanza con C y C++, y dado que la mayora de la gente los conoce aunque sea de forma elemental, resulta muy fcil aprender Java. Los programadores experimentados en C++ pueden migrar muy rpidamente a Java y ser productivos en poco tiempo. Distribuido Java proporciona una coleccin de clases para su uso en aplicaciones de red, que permiten abrir sockets y establecer y aceptar conexiones con servidores o clientes remotos, facilitando as la creacin de aplicaciones distribuidas. Interpretado y compilado a la vez Java es compilado, en la medida en que su cdigo fuente se transforma en una especie de cdigo mquina, los bytecodes, semejantes a las instrucciones de ensamblador. Por otra parte, es interpretado, ya que los bytecodes se pueden ejecutar directamente sobre cualquier mquina a la cual se hayan portado el intrprete y el sistema de ejecucin en tiempo real (run-time). Robusto Java fue diseado para crear software altamente fiable. Para ello proporciona numerosas comprobaciones en compilacin y en tiempo de ejecucin. Sus caractersticas de memoria liberan a los programadores de una familia entera de errores (la aritmtica de punteros), ya que se ha prescindido por completo los punteros, y la recoleccin de basura elimina la necesidad de liberacin explcita de memoria. Seguro (?) Dada la naturaleza distribuida de Java, donde las applets se bajan desde cualquier punto de la Red, la seguridad se impuso como una necesidad de vital importancia. A nadie le gustara ejecutar en su ordenador programas con acceso total a su sistema, procedentes de fuentes desconocidas. As que se implementaron barreras de seguridad en el lenguaje y en el sistema de ejecucin en tiempo real. Indiferente a la arquitectura Java est diseado para soportar aplicaciones que sern ejecutadas en los ms variados entornos de red, desde Unix a Windows Nt, pasando por Mac y estaciones de trabajo, sobre arquitecturas distintas y con sistemas operativos diversos. Para acomodar requisitos de ejecucin tan variopintos, el compilador de Java genera bytecodes: un formato intermedio indiferente a la arquitectura diseado para transportar el cdigo eficientemente a mltiples plataformas hardware y software. El resto de problemas los soluciona el intrprete de Java. Portable La indiferencia a la arquitectura representa slo una parte de su portabilidad. Adems, Java especifica los tamaos de sus tipos de datos bsicos y el comportamiento de sus operadores aritmticos, de manera que los programas son iguales en todas las plataformas. Estas dos ltimas caractersticas se conocen como la Mquina Virtual Java (JVM). Alto rendimiento Multihebra Hoy en da ya se ven como terriblemente limitadas las aplicaciones que slo pueden ejecutar una accin a la vez. Java soporta sincronizacin de mltiples hilos de ejecucin (multithreading) a nivel de lenguaje,

Versin Para Imprimir especialmente tiles en la creacin de aplicaciones de red distribuidas. As, mientras un hilo se encarga de la comunicacin, otro puede interactuar con el usuario mientras otro presenta una animacin en pantalla y otro realiza clculos. Dinmico El lenguaje Java y su sistema de ejecucin en tiempo real son dinmicos en la fase de enlazado. Las clases slo se enlazan a medida que son necesitadas. Se pueden enlazar nuevos mdulos de cdigo bajo demanda, procedente de fuentes muy variadas, incluso desde la Red. Produce applets Java puede ser usado para crear dos tipos de programas: aplicaciones independientes y applets. Las aplicaciones independientes se comportan como cualquier otro programa escrito en cualquier lenguaje, como por ejemplo el navegador de Web HotJava, escrito ntegramente en Java. Por su parte, las applets son pequeos programas que aparecen embebidos en las pginas Web, como aparecen los grficos o el texto, pero con la capacidad de ejecutar acciones muy complejas, como animar imgenes, establecer conexiones de red, presentar mens y cuadros de dilogo para luego emprender acciones, etc.

Primer programa
Ejemplo de un clasico de la programacin: en lenguaje Java: public class HolaMundo { public static void main(String[] args) { System.out.println("Hola Mundo"); } }

Variables Precedencia de operadores


1. Estructuras de control 1. Estructuras de seleccin 1. Sentencia if-else 2. Sentencia switch 3. Operador if-else 2. Estructuras de iteracin 1. Sentencia while 2. Sentencia do-while 3. Sentencia for 3. Saltos 1. Sentencia break 2. Sentencia continue 2. Funciones 1. Parmetros de una funcin 2. Clusula return 3. Funciones recursivas 3. Programacin Orientada a Objetos

Versin Para Imprimir 1. Clases 1. Ejemplos de Implementacin 2. Ejercicios Prcticos 2. Objetos 3. Ciclo de vida de un objeto 4. Paquetes 5. Encapsulamiento 6. Herencia 7. Interfaces 8. Polimorfismo 9. Excepciones 4. Almacenamiento en Java 1. 2. 3. 4. 5. La clase String La clase StringBuffer La clase StringTokenizer Vectores (Arreglos) Colecciones (JFC)

1. La clase ArrayList 2. La clase Vector 3. La clase Stack 4. La clase Hashtable 5. La clase HashSet 6. La clase LinkedList 7. La clase TreeMap 8. La clase StringTokenizer 5. Entrada y Salida 1. Imprimir en Pantalla 2. Lectura del Teclado 6. Interfaz Grfica 1. Componentes Swing 2. Eventos 3. Applets 7. Threads 1. Qu es un thread? 1. Apndices 1. Palabras reservadas 2. Ejemplos prcticos 1. Crear un PDF en Java

Estructuras de control

Estructuras de control
Hasta el momento, el intrprete se dio un paseo por los ejemplos que hemos visto sin alterar el curso de ejecucin. Una por una ejecutaba las sentencias sin detenerse, ni repetir y sin saltearse ninguna, salvo si se produca un error. Esto produce programas con poca utilidad y totalmente aburridos. public class Secuencia { public static void main(String args[]){ System.out.println("Primero se ejecuta esto"); System.out.println("Luego esto"); System.out.println("Por ltimo esto"); } } En el ejemplo se muestra una ejecucin en secuencia. Existen ciertas sentencias que permiten modificar el curso de ejecucin. Debido a ciertas condiciones que se dan en el programa podemos decidir que instrucciones se ejecutarn y que cantidad de veces. Para lograr esto disponemos de un conjunto de estructuras de control.

Estructuras de seleccin
A menudo nos encontraremos con programas o algoritmos en donde las acciones se ejecutarn de acuerdo a una condicin. Tenemos dos o mas alternativas de accin y solo una de estas tendr lugar. Por ejemplo, supongamos que estamos conduciendo un vehculo y en un cruce de calles nos encontramos con un semforo. Si la luz del semforo es roja nos detenemos. De otro modo seguiremos manteniendo la velocidad. Aqu se nos presentan dos alternativas : continuar con la marcha o frenar. Estas acciones se realizarn segn una condicin: si la luz del semforo es roja. Podemos especificar este ejemplo mediante un pseudolenguje que describa la condicin. si luz_del_semforo = rojo entonces

velocidad_del_vehculo = 0 Estamos frente a una seleccin simple: tenemos dos alternativas. Este tipo de seleccin la condicin toma un valor lgico de verdadero o falso. Se tienen que especificar las acciones que deben ocurrir si la condicin es verdadera. Opcionalmente se puede indicar que debe ocurrir si la condicin es falsa. Para lo ltimo veamos un ejemplo. si luz = rojo entonces frenar

de otro modo seguir con la misma velocidad. Imaginemos que estamos en un da de mucho calor y deseamos tomar un refresco. Para ello nos dirigimos a una mquina expendedora de gaseosas, insertamos una moneda y elegimos el tipo de bebida. Generalmente una mquina expendedora tiene un panel con botones para realizar la eleccin. Internamente dispone de un programa que suelta una lata de acuerdo al botn pulsado. El algoritmo puede ser similar a esto:

Estructuras de seleccin Seleccin de acuerdo al botn presionado:

En En En En En

el el el el el

caso caso caso caso caso

de de de de de

"1" "2" "3" "4" "5"

expulsar expulsar expulsar expulsar expulsar

lata lata lata lata lata

de de de de de

Orange Duke. Lemmon Duke. Cola Duke. Coffee Duke. Cherry Duke.

Tenemos varias alternativas y la accin realizada depender de un valor discreto. Esta es una seleccin mltiple.

Sentencia if-else
Queremos realizar una divisin de enteros. Es fcil, ya sabemos como hacerlo, utilizando variables y operadores. Pero nos queda un mal recuerdo con la divisin por cero. Podemos establecer una condicin que permita la divisin para todos los nmeros y que rechace cualquier divisor con cara de cero. Disponemos de dos opciones : realizar o no la divisin. Tambin una condicin: el divisor sea distinto de cero. Esto se parece mucho a una seleccin simple. La estructura de seleccin simple en Java se realiza mediante la sentencia if (si, en ingles). La sintaxis es la siguiente : if (condicin) sentencia; La condicin es una expresin booleana. La sentencia se ejecuta solamente si la expresin booleana es verdadera. Retomando el problema de la divisin, incorporamos una estructura de seleccin para realizar la operacin libre de ceros. public class DivisionSegura { public static void main(String args[]){ int x = 12; int y = 0; int z = 0; if( y !=0 ) z = x / y; System.out.println("El resultado es : " + z); } } En el programa, la variable x tiene el valor del dividendo, la y el divisor y la z el cociente. La condicin es una expresin que arroja un valor booleano. En este caso se utiliza un operador relacional que verifica si y es distinto de 0. Si esta condicin se cumple realiza la divisin. En caso contrario se saltea la divisin y solo imprime el valor de z, que hemos inicializado convenientemente antes de la operacin. Qu ocurre si la condicin no se cumple? En este caso nada. Podemos agregar una serie de instrucciones que se ejecutarn solo si la condicin no se cumple. Para esto tendremos que agregar la sentencia else. La estructura de seleccin quedar as: if (condicin) sentencia 1; else sentencia 2; Si la condicin es verdadera se ejecuta la sentencia 1 en caso contrario se ejecuta la sentencia 2. Ambas sentencias nunca se ejecutarn al mismo tiempo, son excluyentes.

Sentencia if-else Ahora ampliemos el programa para mostrar una advertencia en el caso que se encuentre cara a cara con un cero siniestro. public class DivisionSegura { public static void main(String args[]){ int x = 12; int y = 0; int z = 0; if( y !=0 ) z = x / y; else System.out.println("Atencin! se pretende dividir por 0"); System.out.println("El resultado es : " + z); } } El programa nos qued mas completo. Con la clusula else incluimos otra alternativa de accin. Pero algo anda suelto. Este programa siempre muestra un resultado, se cumpla o no la condicin. El mensaje por pantalla no est incluido en la estructura de seleccin. Tendremos que colocarlo dentro del sector de sentencias que se ejecutarn cuando la condicin sea verdadera. Para agrupar las sentencias se utilizan las llaves ( { } ) Indicarn el inicio y el fin de un bloque de sentencias. Probemos como queda con un bloque public class DivisionSegura { public static void main(String args[]){ int x = 12; int y = 2; int z = 0; if( y !=0 ) { z = x / y; System.out.println("El resultado es : " + z); } else { System.out.println("Atencin! se pretende dividir por 0"); } } } Las buenas prcticas en defensa de un cdigo mantenible han dictaminado que utilicemos las llaves en todo momento, an en el caso que utilicemos una sola sentencia. if (condicin) { sentencia; } else { sentencia; } Lamentablemente no siempre nos encontraremos con condiciones tan sencillas. Muchas veces tendremos que recurrir a proposiciones compuestas para formar una condicin. Para ello podemos recurrir a operadores relacionales o lgicos. Recuerden que siempre debe dar como resultado un valor booleano. Supongamos que deseamos saber si un ao es bisiesto. Sabemos que debe ser mltiplo de 4. Para esto tendremos que verificar si el mdulo es igual a cero.

Sentencia if-else ao % 4 == 0 Pero no debe ser mltiplo de 100. ( ao % 4 == 0 ) && ( ao % 100 != 0 ) A menos que sea mltiplo de 400. ((( ao % 4 == 0 ) && ( ao % 100 != 0 )) || ( ao % 400 == 0 )) Formamos una proposicin compuesta con conectores lgicos. Ahora vamos a incorporarlo en una estructura se seleccin. if ((( ao % 4 == 0 ) && ( ao % 100 != 0 )) || ( ao % 400 == 0 )) { System.out.println("Es bisiesto"); } else { System.out.println("No es bisiesto"); } Los conectores lgicos nos permiten simplificar la estructura. Sin ellos nos veramos en la necesidad de anidar las sentencias. Veamos que ocurre si en elejemplo anterior descartamos el AND y el OR. if ( x % 4 == 0 ) { if ( x % 100 == 0 ) { if ( x % 400 == 0 ) { System.out.println("Es bisiesto"); } else { System.out.println("No es bisiesto"); } } else { System.out.println("Es bisiesto"); } } else { System.out.println("No es bisiesto"); } Parece complicado, pero nos demuestra muchas cosas. En primer lugar observamos que se pueden anidar las sentencias if-else. Cada resultado de una condicin puede caer en una nueva comprobacin para formar una estructura compleja de seleccin. Tambin vemos que hay cierta relacin entre conectores lgicos y la estructura.

Sentencia if-else

Conjuncin if (condicin1 && condicin2){ sentecia1; } else { sentencia2; } if ( condicin1 ) { if ( condicin2 ) { sentencia1; } else { sentencia2; } } else { sentencia2; }

Disyuncin if ( condicin1 || condicin2 ) { sentencia1; } else { sentencia2; } if ( condicin1 ){ sentencia1; } else { if ( condicin2 ) { sentencia1; } else { sentencia2; } }

Negacin if ( ! condicin1) { sentencia1; } else { sentencia2; } if ( condicin1) { sentencia2; } else { sentencia1; }

Sentencia switch

Sentencia switch
Vamos a desarrollar una calculadora totalmente elemental. Sin muchas caractersticas salvo de realizar operaciones aritmticas con dos operandos. Disponemos de una variable de tipo char que nos indicar que tipo de operacin se debe efectuar. Realizamos la operacin y mostramos el resultado en la pantalla. Despus de luchar con las sentencias if-else nos qued algo parecido a esto: public class MiniCalculadora { public static void main(String args[]){ int a = 1; int b = 1; char op = '/'; System.out.print("El resultado es : "); if ( op == '+' ) { System.out.println( a + b); } else if ( op == '-') { System.out.println( a - b); } else if ( op == '*') { System.out.println( a * b); } else if ( op == '/') { System.out.println( a / b); } } } Ya nos alejamos bastante de las decisiones simples. Aqu tenemos de una cadena de sentencias if-else que realizan un seleccin mltiple. La condicin general tiene mas dos alternativas. Tendremos que acudir a la sentencia switch que se encarga de este tipo de seleccin. public class MiniCalculadora{ public static void main(String args[]){ int a = 1; int b = 1; char op = '/'; System.out.print("El resultado es : "); switch ( op ) { case '+': System.out.println( a + b ); break; case '-': System.out.println( a - b ); break; case '*': System.out.println( a * b ); break; case '/': System.out.println( a / b ); break;

Sentencia switch default: System.out.println("error" ); break; } } } La sentencia switch se encarga de estructurar una seleccin mltiple. Al contrario del enunciado if-else que slo podemos indicar dos alternativas, maneja un nmero finito de posibilidades. La estructura general del enunciado switch es la siguiente: switch( expresin ) { case constante1: sentencia1; ... break; ... case constanteN: sentenciaN; ... break; default: sentencia; ... break } El valor de la expresin y de las constantes tiene que ser de tipo char, byte, short o int. No hay lugar para booleanos, reales ni long porque, en la ejecucin, todos los valores que incorporamos se transforman en valores de tipo int. Al evaluar la expresin de switch, el intrprete busca una constante con el mismo valor. Si la encuentra, ejecuta las sentencias asociadas a esta constante hasta que tropiece con un break. La sentencia break finaliza la ejecucin de esta estructura. Si no encuentra ninguna constante que coincida con la expresin, busca la lnea default. Si existe, ejecuta las sentencias que le siguen. La sentencia default es opcional. Volviendo a la mini calculadora, vemos como se organiza las distintas alternativas de acuerdo al valor de una constante char. Estas alternativas representan las distintas operaciones que estn disponibles y solo se ejecutar una sola. Por ejemplo, si el valor del operador (en el programa figura op) es igual al signo de la suma , la sentencia switch ejecutar solamente la lnea que corresponde con esta operacin. Que ocurre si cambiamos la variable op por algn carcter distinto a los especificados? Entra en juego la alternativa default y todas las setencias que le siguen. En este caso imprime por pantalla el mensaje "error". Si nos olvidamos de incorporar esta alternativa, no pasa nada. Ninguna sentencia dentro de la estructura switch se ejecutar. Ya que hablamos de default, es conveniente mencionar que no es necesario que quede relegado al final de la estructura. Podemos situarla al comienzo , en el medio, en definitiva, en donde nos quede mas til segn la lgica que apliquemos o donde queramos. switch ( op ) { default : System.out.println("error"); break;

10

Sentencia switch case '+': System.out.println( a + b ); break; ... En el ejemplo presentado, funciona de la misma manera un default al principio. Obviamente no debe existir mas de una alternativa default. Las sentencias break son opcionales. Se utilizan con el propsito de separar las alternativas. Pero fieles a nuestro estilo de meternos en problemas decidimos que algunos break deben desaparecer. Probemos que ocurre con este cdigo: switch ( op ) { case '+': System.out.println( a + b ); case '-': System.out.println( a - b ); break; ... Es el mismo que el original, solo "olvidamos" de agregarle un break al final de la alternativa suma. Si cambiamos el valor de op por el carcter '+' y ejecutamos el programa, nos responde de esta manera: El resultado es : 2 0 Nos dio los resultados de la suma y la resta. Al no tener un break en la suma, se pas de largo y ejecuto la de abajo , que justamente era la resta. En algunas circunstancias, el break est de mas. Es posible contruir una estructura en donde se ejecuten mas de una alternativa al mismo tiempo. Vemos un ejemplo: public class Lineas{ public static void main(String args[]){ int j = 2; switch (j) { case 5: System.out.println("********"); case 4: System.out.println("********"); case 3: System.out.println("********"); case 2: System.out.println("********"); case 1: System.out.println("********"); } } } El programa tiene por objetivo listar un nmero dado de lneas. Se pueden dibujar hasta 5 lneas trazadas con el smbolo *. La cantidad depender del valor de la variable j. Por ejemplo, si j vale 2, activa la alternativa que tiene

11

Sentencia switch esta constante y como no tiene un break que la obstaculice sigue con la alternativa de abajo.

12

Operador if-else
Salvo ciertos detalles, el programador que conozca el lenguaje C, no notar la diferencia con este "dialecto". Sobre todo a esta altura del curso, que slo sometemos a Java a una programacin de tipo imperativa. Entre todas las construcciones sintcticas que Java hered del C, existe un curioso operador ternario. Se lo llama operador if-else. Su funcin es abreviar la notacin de la clusula de seleccin simple. La sintaxis es la siguiente. variable = op1?op2:op3 El operando op1 debe ser de tipo booleano. Los operandos op2 y op3 pueden ser de cualquier tipo, pero compatibles entre si y con la variable que almacene el resultado. Funciona como una seleccin simple. De acuerdo al valor lgico del operando op1, si es verdadero el resultado de la operacin es igual al valor del operando op2. De lo contrario, si op1 es falso, el resultado es el valor del operando op3. Probemos este nuevo operando. Supongamos que debemos realizar un programa que calcule la distancia entre dos nmeros. Para lograrlo, tomamos el mayor y le restamos el menor. Para empezar, veremos como se realiza con la clusula if-else, que ya conocemos. public class Distancia{ public static void main(String args[]){ int a = 23; int b = 12; int j; if ( a > b ) { j = a - b; } else { j = b - a; } System.out.println("El resultado es: " + j ); } } La construccin equivalente, utilizando el operador, es la siguiente : public class Distancia2{ public static void main(String args[]){ int a = 23; int b = 12; int j = a > b ? a - b : b - a; System.out.println("El resultado es: " + j ); } } Como vern, redujo bastante la notacin. La expresin booleana, que conforma la condicin de seleccin, pas al primer operando, la operacin verdadera al segundo y la falsa al tercero. Como cualquier operador silvestre, se puede combinar tranquilamente con el resto para formar expresiones compuestas. Para verlo, mostramos una expresin equivalente a la anterior. int j = (a > b ? a : b ) - ( a <= b ? a : b);

Operador if-else Se han utilizado los parntesis debido a que su orden de precedencia es bajsima. De otra forma se hubiera evaluado la resta antes de las selecciones.

13

Estructuras de iteracin
Supongamos que nos piden que realicemos un dibujo sencillo que se despliegue por pantalla. El objetivo es mostrar un cuadrado de 5 filas por 5 columnas trazado con cualquier carcter. Con los elementos de programacin que ya conocemos, realizamos un programa que cumpla con este requisito. public class Cuadrado{ public static void main(String args[]){ System.out.println("*****"); System.out.println("*****"); System.out.println("*****"); System.out.println("*****"); System.out.println("*****"); } } Bsicamente este programa cumple con el objetivo. Pero... No notan que algo anda mal? Se repiti cinco veces una instruccin. Qu ocurrira sin nos solicitaran una figura ms grande? Tendramos que agregar ms lneas de cdigo. Y si en vez de una figura , se les ocurra pedirnos que listramos una lista de nmeros del uno al milln, el cdigo sera inmenso. Tambin imagnense lo que tardaramos en escribirlo. Sin embargo tenemos un recurso para acudir en cuanto surjan estos problemas. Son las estructuras de iteracin. Una iteracin consiste en una repeticin de un bloque de sentencias un nmero determinando de veces o hasta que se cumpla una condicin. De esta forma el cdigo puede simplificarse notablemente. Antes de entrar en los detalles de la implementacin con Java, veremos como podemos realizar algunas rutinas en pseudocdigo: Repetir 5 veces : Imprimir ("*****"); Le pasamos al intrprete la tarea de reiterar una accin. Nosotros solamente escribimos una vez lo que hay que hacer. Siguiendo con una segunda aproximacin, podramos agregarle un registro que cuente el nmero de iteraciones. Adems adicionamos una condicin para que indicar que el registro no debe pasar de cierto nmero. De esta manera, el pseudocdigo quedar as: N = 1; Mientras que N <= 5 Imprimir ("*****"); N = N + 1; Lo que hicimos fue inicializar el contador, agregar una condicin de corte, indicar que sentencia se debe repetir y finalmente incrementamos el contador. La condicin es una expresin lgica que debe tener un valor de verdadero o falso. En la ejecucin, cada vez que termina la ltima sentencia vuelve a evaluar la condicin, si se cumple sigue la iteracin, de lo contrario termina. Esta es una estructura de iteracin til para los casos en donde sabemos a priori cuantas repeticiones se deben ejecutar. Con pocos retoques se pueden realizar iteraciones desconociendo el nmero de ciclos.

Estructuras de iteracin Realicemos un programa que transforme un nmero decimal en binario. En la vida real, para hacer esto, realizamos sucesivas divisiones por 2 al nmero decimal. A cada divisin tomamos el resto y continuamos hasta que el resultado sea cero. Por ejemplo: Tenemos que pasar el nmero 25 a binario 25 12 6 3 1 mod mod mod mod mod 2 2 2 2 2 = = = = = 1; 0; 0; 1; 1; 25 div 2 = 12; 12 div 2 = 6; 6 div 2 = 3; 3 div 2 = 1; 1 div 2 = 0;

14

(NOTA: en java actualmente se usa el signo "%" para hacer el mod) El resultado es 11001 En general, no sabemos cuantas divisiones tendremos que realizar. Pero si sabemos que debemos llegar a cero con la divisin. Las tareas que repetimos son las de tomar el resto y el resultado de la divisin. Con estos datos en mente, podremos realizar un algoritmo. DECIMAL = 25; Mientras que DECIMAL > 0 : BINARIO = DECIMAL % 2 + BINARIO; DECIMAL = DECIMAL / 2;

Sentencia while
La sentencia while es la ms sencilla de las estructuras de iteracin. La iteracin continuar hasta que su condicin sea falsa. while ( condicin ) sentencia ; La condicin tiene que tomar un valor booleano (verdadero o falso). Si este valor es verdadero, se ejecutar la sentencia. Concluida esta accin se vuelve a evaluar la condicin. Proseguirn los ciclos hasta que la condicin no cambie a falso. Esta es una estructura de iteracin preprueba, es decir primero se evala la condicin antes de realizar cualquier accin. Si de entrada la condicin es falsa nunca ejecutar el conjunto de sentencias. int n = 0; while ( n > 0 ) System.out.println("Esto nunca lo vers"); Dentro del conjunto de sentencia que controla, debe existir alguna que cambie el valor de la condicin que se est evaluando. boolean prueba = true; while ( prueba ) { System.out.println("Esto lo vers una vez"); prueba = false; } Entraramos en un ciclo infinito si nunca se modifica la condicin y permanece verdadera.

Sentencia while boolean prueba = true; while ( prueba ) { System.out.println("Esto lo vers muchas veces"); } Generalmente esta estructura se utiliza en situaciones en donde desconocemos la cantidad de ciclos que se deben ejecutar para producir un resultado. Mostraremos como se utiliza en estas circunstancias con el ejemplo de pase a binario, mostrado en el captulo anterior. Tenamos que transformar un nmero decimal a binario. El programa en java nos queda de esta manera: public class Dec2Bin{ public static void main(String args[]){ int decimal = 252222; String binario = ""; while ( decimal > 0 ) { binario = decimal % 2 + binario; decimal /= 2; } System.out.println(binario); } } Como no sabemos de antemano cuantas vueltas debe dar, simplemente esperamos que el resultado de las divisiones sucesivas sea igual a cero. Tambin se pueden realizar ciclos con while en donde ya conocemos, antes de entrar en la estructura, cuantas vueltas debe dar para terminar. Para esto nos auxiliamos con un contador de vueltas. Previamente tiene que inicializarse antes de ingresar al ciclo. Luego en cada vuelta se modificara segn la lgica del algoritmo. Realicemos el programa que despliegue por pantalla cinco lneas de caracteres. public class Cuadrado{ public static void main(String args[]){ int contador = 1; while ( contador <= 5 ) { System.out.println("*****"); contador++; } } } En este algoritmo, inicializamos el contador a 1 y luego en cada ciclo se incrementa. La condicin de corte tiene como objetivo no permitir mas vueltas si el contador super el valor 5. Para tener varias veces el asterisco sin necesidad de imprimirlo asi "*****", utilizamos otro ciclo while y otra variable que inicializaremos dentro del ciclo para que se cumpla la cual llamaremos "contador2", obtendremos el mismo resultado que el anterior, el codigo quedaria asi: public class Cuadrado { public static void main (String args []) { int contador = 1;

15

Sentencia while while (contador <= 5) { int contador2 = 1; while (contador2 <= 5) { System.out.print ("*"); contador2++; } System.out.println (); contador++; } } } (copian la parte que queda fuera del recuadro punteado al principio, y la llave que queda fuera al final del mismo, lo pegan en ready to program y lo corren)

16

Sentencia do-while
La sentencia de iteracin do-while es de tipo posprueba. Primero realiza las acciones luego pregunta. La sintaxis es la siguiente: do sentencia while ( condicin ); Observamos que es como un while pero al revs. Primeramente se ejecuta la sentencia y luego evala la condicin. Si la expresin de la condicin es verdadera vuelve a dar un ciclo. De lo contrario, termina. Esto nos garantiza que la sentencia se ejecute al menos una vez. do System.out.println("Lo veras una vez"); while ( false ); Resulta til para los casos en donde tendremos que realizar ciertas acciones antes de verificar una condicin. Realicemos un programa que cuente la cantidad de dgitos que posee un nmero. Para ello tendremos que dividir por diez el nmero que nos han dado, hasta que el resultado se vuelva cero. Entonces recurrimos al while para realice los ciclos necesarios. public class CuentaDigitos{ public static void main(String args[]){ int nmero = 4557888; int dgitos = 0; while ( nmero > 0 ) { nmero /=10; dgitos++; } System.out.println(dgitos); } }

Sentencia do-while Qu ocurre si el nmero que nos dan es el cero? El resultado nos dar cero. Obviamente es errneo, debera devolver un dgito. Pero no entra en el ciclo debido a que de entrada no satisface la condicin. Podramos implementar una solucin "ad hoc". nmero /=10; dgitos++; while ( nmero > 0 ) { nmero /=10; dgitos++; } Realizamos primeramente las operaciones y luego entramos en el bucle si se verifica la condicin. Pero no hace falta mirar mucho para darnos cuenta que es una solucin poco elegante. En realidad quedar mejor con la sentencia do-while public class CuentaDigitos{ public static void main(String args[]){ int nmero = 4557888; int dgitos = 0; do { nmero /=10; dgitos++; } while ( nmero > 0 ); System.out.println(dgitos); } }

17

Sentencia for

18

Sentencia for
Trabajamos con casos de interaccin en donde a priori no conocamos la cantidad de ciclos que se ejecutaban hasta cumplir con una condicin. Para esto utilizamos la sentencia while. Pero ahora estudiaremos con ms detalle aquellos casos en donde se sabe de antemano cuantos ciclos se deben cumplir para terminar la ejecucin. Imprimiremos una tabla de multiplicar hasta el factor noveno. Si no utilizamos ninguna estructura de interaccin, deberamos imprimir nueve lneas de cdigo secuencial. System.out.println("3 System.out.println("3 System.out.println("3 System.out.println("3 System.out.println("3 System.out.println("3 System.out.println("3 System.out.println("3 System.out.println("3 x x x x x x x x x 1 2 3 4 5 6 7 8 9 = = = = = = = = = 3"); 6"); 9"); 12"); 15"); 18"); 21"); 24"); 27");

Pero ya conocemos las estructuras que nos ahorran el esfuerzo de escribir tanto cdigo. Utilizaremos una sentencia que ya conocemos: el while int factor = 1; while ( factor <= 9 ) { System.out.println("3 x " + factor + " = " + 3*factor ); factor++; } Utilizamos la variable factor para contar la cantidad de lneas que imprimimos. Primeramente la inicializamos en uno. Cuando se ejecuta la interaccin se controla que no supere su valor de 9. Si el valor es menor o igual que nueve, imprime una lnea de la tabla e incrementa a uno el valor de factor. Cualquier caso de interaccin que se complete en una cantidad prefijada de ciclos, necesitamos una variable de control. Si utilizamos la sentencia while, esta variable se debe definir e inicializar antes del bucle y contar con una instruccin que modifique su valor dentro del bucle. Veremos como este cdigo cambia ligeramente si en lugar de while presentamos una nueva sentencia denominada for for ( int factor = 1; factor <= 9; factor ++ ) { System.out.println("3 x " + factor + " = " + 3*factor ); } la sentencia for me permite repetir un ciclo n veces, en donde se debe determinar el valor inicial y cuantas veces se repetira. sintaxis
for({valor inicial};{condicin de termino};{factor de incremento del valor inicial}){ //ac va lo que se repetir n veces de acuerdo a la condicin de termino }

Bucle infinito: no hay control, entonces no se detiene for ( ;;){}

Sentencia for Operador coma : for ( int k=1, j=10 ;k < j ;k++ ,j-- ){ System.out.println(k + " " + j); }

19

for mejorado
Supongamos que tenemos un arreglo de enteros que deseamos presentar en pantalla, usando la orden for tradicional, el cdigo, podra quedar as: int[] laiEnteros = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; for (int i = 0; i < 10; i ++) System.out.println (laiEnteros[i]); Java ofrece una funcionalidad extra para la orden for, mediante la que se puede simplificar notablemente el codigo anterior, quedando as: int[] laiEnteros = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; for (int liElemento : laiEnteros) System.out.println (liElemento); En este caso, liElemento toma el valor de cada uno de los elementos de laiEnteros, permitiendo una navegacin ms simple, puesto que se evitan posibles errores derivados del uso de los arreglos en forma directa. Tambin se puede usar esta forma, para estructuras ms complejas como objetos de la clase Collection public void Presenta (Collection <Integer> poConjunto){ for (Iterator <Integer> loElemento : poConjunto) System.out.println (loElemento) }

Sentencia break

20

Sentencia break
La sentencia de 'break' es de tipo de control de bucles. Dentro de la iteracion en un bucle, de cualquiera de los tipos (while, do-while, for), el uso de esta sentencia rompe la iteracion de dicho bucle. for(int j = 0; j<10; j++){ sentencia 1; sentencia 2; sentencia 3; break; }; Este bucle debera ejecutarse 10 veces, desde j = 0 hasta j = 9, sin embargo la utilizacin de la sentencia break, rompe la iteracin del bucle, de tal manera que tras la primera ejecucin el bucle acaba habindose ejecutado una sola vez. Resulta til la utilizacin de condiciones para la ruptura del bucle, de tal manera que un cdigo como el anterior indicado no sirve para nada. Recurrimos para ejemplificarlo al ejemplo anterior de contar dgitos). Pero en este caso queremos que cuente los dgitos de un nmero pero solamente hasta llegar a 5 dgitos, en caso de que tenga ms dejaremos de contarlos: public class CuentaDigitos{ public static void main(String args[]){ int nmero = 4557888; int dgitos = 0; while ( nmero > 0 ) { nmero /=10; dgitos++; if (dgitos ==5) break; } if (dgitos ==5) System.out.println("El numero tiene 5 o ms dgitos"); } } Este programa cuenta los dgitos de un nmero y en caso de que dicho nmero tenga 5 o ms dgitos nos muestra por consola el mensaje "el nmero tiene 5 o ms dgitos". Vase la lnea "if (dgitos ==5) break;" cuya presencia hace que en caso de que el nmero haya llegado a los 5 dgitos se rompa la iteracin del bucle.

Sentencia continue

21

Sentencia continue
La sentencia de continue es de tipo de control de bucles. Dentro de la iteracion en un bucle, de cualquiera de los tipos (while, do-while, for), el uso de esta sentencia rompe la iteracion de dicho bucle. Provocando que se ejecute la siguiente iteracion de dicho bucle, ignorando las sentencias posteriores a "continue" for(int j = 0; j<10; j++){ sentencia 1; sentencia 2; sentencia 3; continue; sentencia 4; }; Este bucle se ejecuta 10 veces, pero con la salvedad de que la sentencia 4 no se ejecuta ninguna vez. Es decir, se ejecutan las sentencias 1, 2 y 3 y cuando se llega a la sentencia de control continue se vuelve de nuevo a comprobar la condicion del for y en caso de cumplirse de nuevo a la sentencia 1 y as sucesivamente.

Funciones
Queremos depositar todo nuestro dinero ganado como programadores. Hay dos bancos que compiten por nuestros dividendos. El primero, lo llamamos "Banco A", nos ofrecen un inters con una tasa mensual del 1 % mas una bonificacin final del 5%. El segundo, el "Banco B", nos ofrece una tasa del 1,5 %. Como buenos programadores realizamos un algoritmo para obtener el mayor beneficio. El programa calcular el monto obtenido en un perodo de 12 meses con un clculo de inters compuesto. Para darnos una mejor idea de lo que tenemos que hacer realizamos el algoritmo principal. monto = 1200 meses = 12; for ( int n = 1; n <= meses; n++){ monto = monto + monto * inters / 100; } Al monto inicial le sumamos las sucesivas capitalizaciones que ganamos mes a mes, hasta llegar a un perodo de 12 meses. Con este algoritmo probado, realizamos el programa: public class ShowMeTheMoney{ public static void main(String args[]){ int meses = 12; float interesBanco1 = 1f; float bonificBanco1 = 5f; float interesBanco2 = 1.5f; double monto = 10000; double montoBanco1 = monto; double montoBanco2 = monto; for ( int n = 1; n <= meses; n++){

Funciones montoBanco1 += montoBanco1 * interesBanco1 / 100; } montoBanco1 += montoBanco1 * bonificBanco1 /100; for ( int n = 1; n <= meses; n++){ montoBanco2 += montoBanco2 * interesBanco2 / 100; } System.out.println("Importe final del banco1 : " + montoBanco1); System.out.println("Importe final del banco2 : " + montoBanco2); } } Si observamos el cdigo, notaremos que repetimos el mismo algoritmo por cada banco. Esto ocurrir cada vez que tengamos que realizar un clculo de intereses. Si la eleccin se extendiera a, por ejemplo, cinco bancos, tendramos que copiar el algoritmo para cada uno de ellos. Para no tener que repetir una y otra vez lo mismo, podemos recurrir a una tcnica muy utilizada en programacin: dividir el cdigo en funciones. Una funcin es un conjunto de instrucciones que ejecutan una rutina y devuelven un resultado. El resultado puede depender de parmetros de entrada. Un funcin se construye de la siguiente manera: tipo_resultado nombre_funcin (tipo_parmetro nombre_parmetro, ... ) { sentencia1; sentencia2; ... sentenciaN; } Se debe definir el tipo de dato del resultado y el nombre que identifica a la funcin. Ademas, opcionalmente se pueden definir parmetros de entrada con el tipo de dato y su nombre. Una funcin permite que reutilicemos un algoritmo. En el caso de nuestro problema bancario, podemos reutilizar el clculo de inters aplicndolo a cada banco. Veamos como se construye esta funcin: double interesCompuesto(double monto, float tasa, int perodos){ for(int n = 1; n <= perodos; n++ ){ monto += monto * tasa / 100; } return monto; } Necesitamos definir ciertos datos de entrada para ejecutar el algoritmo. Vamos a necesitar el monto inicial, la tasa de inters y el perodo. A su vez definimos el tipo de datos del resultado. La funcin nos devuelve el monto final, entonces el tipo de dato es double. Para identificar a la funcin le hemos puesto el nombre de interesCompuesto. Para utilizar la funcin en el programa la llamamos por su nombre. Como esta nos devuelve un resultado, tendremos que almacenarlo en una variable que tenga un tipo de dato compatible con el resultado. double montoBanco2 = interesCompuesto(10000 , interesBanco2, meses); Debemos pasar los parmetros como se han definido, en el mismo orden y con el mismo tipo de dato. Conociendo como se arma y se invoca una funcin, estamos prestos para utilizarla en nuestro programa.

22

Funciones public class ShowMeTheMoney2{ static double interesCompuesto(double monto, float tasa, int perodos){ for(int n = 1; n <= perodos; n++ ){ monto += monto * tasa / 100; } return monto; } public static void main(String args[]){ int meses = 12; float interesBanco1 = 1f; float bonificBanco1 = 5f; float interesBanco2 = 1.5f; double monto = 10000; double montoBanco1 = monto; double montoBanco2 = monto; montoBanco1 = interesCompuesto( montoBanco1, interesBanco1, meses ); montoBanco1 += montoBanco1 * bonificBanco1 /100; montoBanco2 = interesCompuesto( montoBanco2, interesBanco2, meses ); System.out.println("Importe final del banco1 : " + montoBanco1); System.out.println("Importe final del banco2 : " + montoBanco2); } }

23

Parmetros de una funcin


Los parametros de una funcin son los valores que esta recibe por parte del cdigo que la llama. Pueden ser tipos simples u objetos. En la declaracin de la funcin se escriben despus del nombre entre parntesis indicndose el tipo de cada uno y su nombre. Veamos esto a modo de ejemplo: int dividir(int dividendo, int divisor) { ... } Est funcin recibe dos parmetros, ambos de tipo entero, uno el divisor y otro el dividendo. A la hora de llamar a la funcin, los parametros se escriben tambin a continuacin del nombre entre parentesis; pero en este caso no se indica el tipo de estos. Veamoslo en un ejemplo: int resultado = dividir(8,4); En esta linea, se asigna a la variable entera resultado el retorno de la funcin dividir pasandole como parametros 8 y 4. dividir ser una funcin de la clase a la cual pertenece nuestro objeto. Si queremos llamar a una funcin pblica de un objeto externo utilizaramos un cdigo similar a: MyClaseMatematica objInstancia = new MyClaseMatematica(); int resultado = objInstancia.dividir(8,4);

Parmetros de una funcin Es importante recordar que en java, los parametros de los tipos primitivos (int, long, etc.) SIEMPRE se pasan por valor. Los objetos y arrays se pasan por referencia.
Si no queremos que la funcin devuelva ningn parmetro debemos utilizar el tipo void. P.ej:

24

void print(String mensajeAImprimir) { .... }

Funciones estticas
Supongamos que tenemos una clase de funciones matemticas llamada Calculadora. La misma puede contener mtodos para el clculo de logartmos, cosenos, etc... Es un poco molesto tener que instanciar un objeto de dicha clase para poder utilizar la misma tal y como se muestra en el siguiente ejemplo: Calculadora objetoCalculadora = new Calculadora(); float resultado = objetoCalculadora.logaritmo(33.4); Para solucionar esto podemos crear funciones estticas. Estas funciones pueden ser invocadas utilizando directamente la clase, no un objeto instancia de la misma. Para ello basta aadir el atributo static a la funcin. En el caso anterior: class Calculadora { ... float logaritmo(float entrada){ float resultado; ... return resultado; } } Entonces el ejemplo anterior se simplifica y queda simplemente como: float resultado = Calculadora.logaritmo(33.4); No se debe abusar de las funciones estticas ya que entonces perdemos la orientacin a objetos de Java. Debe ser el sentido comn quien nos indique cuando realmente merece la pena utilizar las mismas. Un ejemplo donde suele ser conveniente crear funciones estticas es en las "fbricas" de objetos. Las fbricas de objetos crean y retornan un nuevo objeto de forma similar al constructor de una clase, pero teniendo en cuenta el contexto de la aplicacin. Las fbricas de objetos al tener informacin sobre el contexto/estado de la aplicacin pueden realizar tareas que un constructor no es capaz. P.ej, la conexin por red suele estar asociada a un objeto. Las creacin de una nueva conexin por red es un proceso lento (en comparacin a la velocidad de proceso de una CPU moderna) y es mejor reutilizar conexiones de red creadas anteriormente antes de crear una nueva. En tal caso creamos una fbrica de conexiones con una funcin esttica getNuevaConexion: class FabricaDeConexiones { static java.util.ArrayList listaDeConexiones = new java.util.ArrayList(); static void Conexion getNuevaConexion(){ for (int indice=0; indice<listaDeConexiones.size(); indice++){ if listaDeConexiones.get(indice).estaLibre = true { return listaDeConexiones.get(indice); }

Parmetros de una funcin } Conexion nuevaConexion = new Conexion(....); listaDeConexiones.add(nuevaConexion); } } En el ejemplo anterior FabricaDeConexiones.getNuevaConexion() consulta un listado de conexiones. Antes de crear una nueva conexin recorre el listado de conexiones ya existentes y si hay alguna conexin libre devuelve la misma antes de crear una nueva. As en vez de utilizar el cdigo: Conexion miConexion = new Conexion(); lo reemplazamos con: Conexion miConexion = FabricaDeConexiones.getNuevaConexion(); que ser mucho ms rpido y fiable.

25

Buenas prcticas
En algunos lenguajes sin soporte para excepciones es comn utilizar un entero como valor de retorno para indicar si hubo o no error. En general 0 significa que no paso nada y un valor distinto de cero indica un error. En Java (y cualquier otro lenguaje con control de excepciones) es una mala prctica utilizar un entero para devolver un error. Es mejor generar y lanzar un objeto excepcin para indicar un error en la funcin. Es fcil olvidar comprobar el valor retornado de una funcin, especialmente si la funcin invocada pertenece a una librera y va a ser utilizada por terceros que pueden NO ser conscientes de que la funcin devuelve error. Entonces el error quedara oculto y se manifestara aleatreamente en otra parte del cdigo haciendo muy difcil su depuracin y mantenimiento. En vez de escribir: int imprimeTodo(String nombre, String apellido1, if (nombre ==null || nombre =="") return if (apellido1==null || apellido1=="") return if (apellido2==null || apellido2=="") return String apellido2){ 1; 2; 3;

System.out.println(nombre+" "+apellido1+" "+apellido2); return 0; } escribiremos:


void imprimeTodo(String nombre, String apellido1, String apellido2){ String errores=""; if (nombre ==null || nombre =="") errores += "nombre no puede ser nulo/vacio,";

if (apellido1==null || apellido1=="") errores += "apellido1 no puede ser nulo/vacio,"; if (apellido2==null || apellido2=="") errores += "apellido2 no puede ser nulo/vacio,";

if (errores!="") throw new Excepcion(errores);

System.out.println(nombre+" "+apellido1+" "+apellido2);

Parmetros de una funcin


}

26

El valor de los parmetros enviados a la funcin deben comprobarse antes de ejecutar la lgica de la funcin. Si los mismos no son vlidos debe lanzarse una excepcin e interrumpir la ejecucin de la misma. Esto ayuda a detectar errores y hace el cdigo ms comprensible y fcil de leer.

Clusula return
Una funcin puede o no devolver un resultado, segn cmo haya sido declarada. La siguiente funcin no devuelve nada, puesto que se pone void delante, al declararla // Esta funcin no devuelve nada void funcion ( /* parmetros */) Sin embargo, esta otra s devuelve un valor entero // Esta funcin devuelve un valor entero int funcion ( /* parmetros */ ) Si la funcin devuelve algn tipo de resultado, es obligatorio en java poner en el cdigo de la funcin return valordevuelto. Si dentro de la funcin hay condicionales, es tambin obligatorio que en todos los posibles caminos por los que se termine el cdigo de la funcin, se ponga el return y el valor devuelto. Lgicamente, cuando la funcin devuelve el resultado, finaliza la ejecucin de la misma, y de cualquier estructura de control iterativa (for, while...) aunque no se haya cumplido su condicin de salida.

Funciones recursivas

27

Funciones recursivas
Las funciones recursivas son aquellas que se invocan a si mismas en algn momento de su ejecucin. En anlisis de Algoritmos las tcnicas recursivas se usan mucho para la solucin de Problemas. Esta forma en analisis de Algoritmos es llamada Divide y Venceras. Para poder resolver un problema de forma recursiva es necesario saber alguna solucion no recursiva para alguno de los casos mas sencillos. "Usamos la solucion mas simple para resolver un problema mas complejo." As, todo mtodo recursivo debe tener al menos una sentencia que devuelva un resultado (la solucin del caso ms sencillo) y las sentencias necesarias para acercarse en cada invocacin a ese caso. La recursin permite programar algoritmos aparentemente complicados con un cdigo simple y claro, ahorrando trabajo al programador. A simple vista parece la solucin perfecta para muchos problemas, pero hay que tener en cuenta que en ocasiones ralentizar el programa en exceso. Por ejemplo, la funcin factorial en forma recursiva: public class Factoriales { static int factorial(int numero){ if ( numero <= 1 ) { return 1; } else { return numero*factorial(numero-1); } } public static void main(String args[]){ System.out.println(factorial(5)); } } La misma funcin en forma iterativa: public class Factoriales{ static int factorial(int numero){ int resultado = 1; while(numero > 0){ resultado = resultado*numero; nmero--; } } public static void main(String args[]){ System.out.println(factorial(5)); } } Como puede observarse, la funcin iterativa slo recorre un bucle while, mientras que la recursiva invoca un mtodo nuevo hasta que nmero vale 1 (Esto requiere un trabajo considerablemente mayor por parte del ordenador). La recursin es por lo tanto una potente herramienta en programacin, pero hay que saber diferenciar cuando es til y cuando no.

Funciones recursivas

28

Recursin mutua
Este en un ejemplo de recursin mutua. Se trata de un programa que devolver true o false si el parmetro nmero es respectivamente, impar o par (en el caso de que invoquemos la funcin impar(nmero)). public class Paridad{ public static boolean impar (int numero){ if (numero==0) return false; else return par(numero-1); } public static boolean par (int numero){ if (numero==0) return true; else return impar(numero-1); } } Al leer el cdigo de una sola de las funciones, no se aprecia la recursin pero existe igualmente.

Programacin Orientada a Objetos


Un objeto es una abstraccin de cualquier cosa que puedas pensar o ver en este instante, un perro, una silla, una pelota, un misil teledirigido, un enemigo en un videojuego, etc, etc. Java es un lenguaje orientado a objetos. Esto quiere decir que si lo puedes pensar, entonces es muy probable que lo puedas programar. Retomando el ejemplo del perro, podemos hacer notar algunos detalles que nos ayudaran a entender ese misterioso mundo de "los objetos": 1. Los perros son animales. 2. Los perros pertenecen a una raza (aunque en algunos casos mezcla de ellas :D). 3. Los perros ladran (aunque en algunos su ladrido no se escuche). 4. Los perros comen. 5. Los perros toman agua. 6. Los perros corren. 7. Los perros duermen. 8. Algunos perros tienen pulgas. 9. Algunos perros tienen dueo. 10. Algunos perros tienen nombre. Bueno, vamos a dejar tranquilos a los perritos hasta aqu, y ahora explicar el por qu enumerar estas caractersticas de nuestros amigos caninos. En primer lugar podemos darnos cuenta que "el objeto perro" tiene caractersticas (1, 2), puede realizan acciones (3, 4, 5, 6, 7) y tienen cierto tipo de relacin con otros objetos (8, 9, 10). No olviden que todo perro es distinto, es decir, aunque compartan caractersticas, no todos perteneceran a la misma raza, o al mismo dueo, o no viviran en el mismo lugar, etc.

Programacin Orientada a Objetos Es aqu cuando surge algo llamado "Clase". Todos los perros del mundo, perteneceran a la "Clase Perro". Y cada uno de los perros seria en si un "Objeto Perro", que pertenece a la "Clase Perro". Ahora profundizando un poco mas en estos trminos. Cuando uno programa con Java, lo que principalmente hace es crear clases, de las cuales se crean objetos. Un cdigo de ejemplo para entender esto seria: class Perro{ String nombre; String raza; boolean pulgas; } Perro perrito1=new Perro(); Perro perrito2=new Perro();

29

Clases
Introduccin
La programacin orientada a objetos (POO), se rige por ciertos principios de desarrollo de software que permiten una implementacin limpia, segura y entendible de los programas. Dentro de la limpieza, eficiencia y calidad que exige el desarrollo de software mediante la programacin por objetos, se encuentran las Clases. Las Clases comprenden el estilo de diseo e implementacin ms utilizado en el modelado por objetos, aunque no es el nico. Para empezar a utilizar Clases, entender su funcionamiento y como consecuencia, su utilizacin e importancia, es necesario recordar algunos principios bsico de la Programacin en Java. En el lenguaje Java existen distintos Tipos. Un Tipo es, como su nombre lo indica un "tipo" de elemento programable ya definido dentro del lenguaje. Los principales Tipos Primitivos de Java son: boolean (falso o verdadero), byte, short, int, float, double, long y char. Ahora pensemos un momento: qu sucede si necesitamos representar o utilizar en nuestros programas "Tipos" no definidos? qu sucedera si lo que necesito guardar o manipular es la informacin de una persona? cmo manejo fechas? cmo declaro horarios? cmo represento un auto? Son muchas las preguntas que se responden mediante la implementacin de la programacin de Clases.

Definicin
Una Clase puede considerarse como la representacin programada de un objeto o situacin real y existente del mundo cotidiano. Las Clases son la forma abstracta de manejar la informacin de manera computacional. Mejor veamos un ejemplo muy sencillo: Si un programador necesita manejar la informacin de los clientes de la empresa para la cual trabaja, sera muy incdomo estar declarando, inicializando y manipulando mil nombre, mil apellidos, mil direcciones, mil nmeros de telfono, mil nmeros de identificacin, mil ... La solucin que plantea la POO es la utilizacin de Clases para representar aquellos elementos o tipos no pertenecientes al lenguaje mismo de programacin. Pues de hecho no existe un tipo primitivo que se llame "cliente". La solucin exacta que se propone es crear todos los tipos necesarios a partir, o mediante la utilizacin, de los tipos ya existentes. En este caso en particular, debemos utilizar los tipos primitivos de Java para crear nuestro propio "Tipo" (Clase).

Clases Si desea ms informacin, especficamente tcnica, puede visitar el sitio: http:/ / es. wikipedia. org/ wiki/ Clase_(inform%C3%A1tica)

30

Implementacin en Java
Ya es momento de ver cmo funcionan las clases en Java. Para nuestra primera implementacin vamos a utilizar el ejemplo anterior. Supngase que necesitamos manejar la informacin de n clientes, si tomamos en cuenta que necesitamos n nombres, n apellidos, n edades, y n elementos de cualquier tipo de informacin que deseemos almacenar o manipular con respecto al cliente, hara muy tedioso y sucio (computacionalmente hablando) el trabajo con la informacin, las variables, y por ende el programa en general. 1. Primero debemos analizar qu tipo de informacin queremos manipular con respecto al cliente: a. b. c. d. e. f. Nombre Apellido Identificacin Edad Direccin Nmero de Telfono

2. Ahora debemos analizar el tipo primitivo o no primitivo que vamos a asignarle a cada elemento de informacin de nuestro cliente:
a. Nombre b. Apellido c. Identificacin Es una cadena de caracteres, String Es una cadena de caracteres, String Es un valor numrico, int (otros programadores podran usar String)

3. Ahora pensemos en las funciones (la funcionabilidad) que queremos darle a nuestros clientes, eso es, por ejemplo, que podamos ver su nombre, cambiar el nombre, ver edad, etc:
a. ObtenerNombre b. PonerNombre c. ObtenerApellido d. PonerApellido e. ObtenerID f. PonerID Nos dara el nombre del cliente Nos permite cambiar o poner el nombre del cliente Nos dara el apellido del cliente Nos permite cambiar o poner el apellido del cliente Nos dara la identificacin del cliente Nos permite cambiar o poner la identificacin del cliente

Todas las funciones en Java siguen el siguiente modelo:


tipoFuncion tipoValorDevolver nombreFuncion ( elementosUtilizadosPorLaFuncion ) { operacionesRealizar; }

Explicando lo anterior, tenemos que: tipoFuncion: especifica el grado de encapsulamiento que le vamos a dar a nuestra funcin, o sea, que tan accesible va a estar para el programa. Existen dos tipos principales de funciones en Java; public, o sea, de acceso pblico, queriendo decir que puede ser llamada o invocada por cualquier entidad dentro o fuera de la clase. El tipo private indica una exclusividad mayor de funcionabilidad, lo que quiere decir que solamente puede ser invocado, en condiciones normales, dentro de otra funcin. tipoValorDevolver: indica el tipo de elemento que deseamos obtener de nuestra funcion. Por ejemplo, si deseamos saber el nombre de un cliente usamos como tipoValorDevolver un String o cadena de caracteres.

Clases nombreFuncion: corresponde al nombre que el programador quiere darle a la funcion. elementosUtilizadosPorLaFuncion; corresponde a todos los elementos que necesita la funcin para trabajar adecuadamente. Ejemplo sencillo, para poner el nombre de un cliente necesitamos una String como elementoUtilizadosPorLaFuncion. operacionesRealizar: corresponde a las operaciones matemticas, lgicas o computacionales en general que se deseen aplicar a la informacin de la clase y a su contenido en s. 4. Definidos los tipos y funciones, pasamos a la declaracin e implementacin de la Clase: (Recuerden que se utiliza cdigo en Lenguaje Java) public class Cliente { String nombre; String apellido; int identificacion; }

31

Ejemplos de Implementacin
//Inicializacin de la clase public class Persona{ // Inicio de los atributos de la clase String Nombre; int Edad; //Inicio de la declaracin de los mtodos de la clase public int MostrarEdad (){ System.out.println("La edad es: "+Edad); return Edad; } }

Ejercicios Prcticos

32

Ejercicios Prcticos
public class array1{
public static void main (String []args){ String nombre[]; nombre=new String[3]; nombre[0]="Ana"; nombre[1]="Elisa"; nombre[2]="Juan"; // // // // // String nombre[]={"Ana", "Elisa", "Juan"}; Todas estas sentencias se resumen como la de abajo:

for (int i=0; i<nombre.length; i++){ System.out.println(nombre[i]); } } }

Objetos
Un objeto es la instancia de una clase. Por ejemplo, si tenemos una clase perro definida de la siguiente manera: public class Perro { private String color; el color del perro private int numPatas; numero de patas

// a traves de esta variable almacenaremos // a traves de esta otra almacenaremos el

public Perro(String col, int numP) // cabecera del constructor de la funcion { color=col; // ponemos los valores que nos pasan por parametro a las variables del objeto numPatas=numP; } } Una instancia de la clase sera un perro en particular: Perro snoopy = new Perro("blanco", 4); En este caso estamos definiendo una nueva instancia de la clase "Perro" que llamamos snoopy, que definimos con pelo blanco y 4 patas (si, segn esto podramos crear perros o aberraciones de la naturaleza con otro nmero, XD).

Encapsulamiento

33

Encapsulamiento
Java, como un lenguaje orientado a objetos, implementa la encapsulacin. Este concepto consiste en la ocultacin del estado o de los datos miembro de un objeto, de forma que slo es posible modificar los mismos mediante los mtodos definidos para dicho objeto. Cada objeto est aislado del exterior, de forma que la aplicacin es un conjunto de objetos que colaboran entre s mediante el paso de mensajes invocando sus operaciones o mtodos. De esta forma, los detalles de implementacin permanecen "ocultos" a las personas que usan las clases, evitando as modificaciones o accesos indebidos a los datos que almacenan las clases. Adems, el usuario de la clase no se tiene que preocuparse de cmo estn implementados los mtodos y propiedades, concentrndose slo en cmo debe usarlos. La encapsulacin es una de las principales ventajas que proporciona la programacin orientada a objetos.

Herencia
La herencia es un principio fundamental de la Programacin Orientada a Objetos (POO) ya que esta permite la creacion jerarquias. Con el uso de la herencia puedes crear una clase general para definir los atributos comunes de objetos relacionados.

Interfaces
Las interfaces son uno de los mecanismos que dispone Java para establecer las caractersticas que debe cumplir una clase para que sea apta para un determinada necesidad de una aplicacin. Podra decirse que las interfaces son plantillas de mtodos que deben incluir determinadas clases. Veamos primero los detalles y luego profundizaremos sobre la necesidad de estas construcciones. Desde el punto de vista estructural, una interface es una construccin similar a una clase que carece de implementacin en sus mtodos. La palabra reservada del lenguaje para declarar este tipo de construcciones es interface. public interface Dibujable{ public void dibujar(); } Como puede observarse el mtodo dibujar termina en "punto y coma" y no tiene ningn cdigo de implementacin (obsrvese que no incorpora llaves a continuacin). Posteriormente podremos declarar clases que cumplan (implementen) la interface, para ello, en la declaracin de la case emplearemos la palabra implements seguida del nombre de la inteface a implementar: public class Rectangulo implements Dibujable{ public void dibujar(){ System.out.println("____________"); System.out.println("| |"); System.out.println("|__________|"); } }

Interfaces Una clase (Rectangulo) implementa una interface (Dibujable) cuando adems de declararlo con la palabra implements tiene todos los mtodos (en este ejemplo, el mtodo dibujar) declarados en la interface. A partir de este momento, podremos emplear variables de la interface (Dibujable) para hacer referencia a objetos de las clases que la implementan (Rectangulo). Y mediante esa variable podremos ejecutar los mtodos (dibujar) del objeto asignado a la variable. Dibujable grafico = new Rectangulo(); grafico.dibujar(); El compilador solamente permitir asignar referencias a objetos cuya clase implemente la interface. De esta forma se garantiza que todos los mtodos ejecutables con la variable estarn disponibles en el objeto. Las interfaces permiten la realizacin de polimorfismo, ya que podremos tratar de una misma forma objetos de clases diferentes. Esto es as porque si estos objetos implementan la misma interface, en ella se recoge el conjunto de mtodos que tienen en comn y por lo tanto se pueden ejecutar con variables de la interface.

34

Polimorfismo
Son muchas formas de implementar un mismo metodo. Es La posiblilidad de utilizar una misma expresion para invocar a diferentes versiones de un mismo mtodo

La clase String
La clase String nos permite con todos sus mtodos el manejo de cadenas de caracteres de forma facil. Un String no es ms que un array de caracteres. He aqui un ejemplo de creacin de un String a partir de un array de caracteres: char data[] = {'a', 'b', 'c'}; String str = new String(data); Siendo equivalente a: String str = "abc";

Constructores
Los ms utilizados son: Constructor por defecto: String s = new String(); Crea un objeto de tipo String y lo inicializa a "vacio". String s = new String("texto"); Es un constructor que recibe como parmetro una cadena de texto, guardndola en la variable (da igual el tamao de dicha cadena).

La clase String

35

Mtodos
Algunos de los mtodos ms utilizados son: Mtodo charAt, que recibe un entero como parmetro y devuelve el carcter que ocupe dicha posicin en el objeto String que lo invoque. Ejemplo con el String s de los ejemplos del constructor: char a = s.charAt(2); En la variable a, quedara guardado el carcter 'x'.

Enlaces
Puedes consultar esta clase en el manual original en ingles aqu [1]

Referencias
[1] http:/ / java. sun. com/ javase/ 6/ docs/ api/ java/ lang/ String. html

La clase StringBuffer
Clase StringBuffer
La clase StringBuffer permite modificar el String en lugar de crear uno nuevo en cada paso intermedio. Contiene metodos similares e igual nombre que String pero son independientes.

Constructores:
StringBuffer() StringBuffer (String)

Metodos Principales:
setCharAt(int, char) StringBuffer insert (int offset, valor) StringBuffer append (valor) donde valor puede ser: int, char, boolean, float, double, long Object String char [] str

La clase StringBuffer

36

Ejemplo: StringBuffer
Ejemplo 1: public static String escribirRaiz (int i) { StringBuffer buf = new StringBuffer(); buf.append(sqrt().append(i).append()); buf.append( = ).append(Math.sqrt(i)); return buf.toString(); } donde: (i) puede ser int. ()) char. ( = ) String. (Math.sqrt(i)) double.

Ejemplo 2: public static StringBuffer insertaFecha (StringBuffer buf)) { String hoy = new java.util.Date().toString(); buf.ensureCapacity(buf.length()+hoy.length()+2); buf.insert(0,hoy).insert(hoy.length(), :); return buf; }

La clase ArrayList
Un ejemplo del uso de ArrayList Primero creamos una clase Persona //Autor: Rey Salcedo class Persona{ private String id; private String nombres; private String apellidos; public Persona(){ //inicializamos variables id = ""; nombres = ""; apellidos = ""; } public void setId(String id){ this.id = id; } public void setNombres(String nombres){ this.nombres = nombres; } public void setApellidos(String apellidos){ this.apellidos = apellidos; } public String getId(){ return this.id; } public String getNombres(){ return this.nombres; } public String getApellidos(){

La clase ArrayList return this.apellidos; } } Ahora hacemos uso de un ArrayList en nuestra clase Main
//Autor: Rey Salcedo import java.util.Scanner; import java.util.ArrayList; public class Main{ public static void main(String []args){ Scanner scanner = new Scanner(System.in); ArrayList listaPersonas = new ArrayList(); int numeroPersonas = 3;//Ingresaremos en nuestro ArrayList 3 Personas, pueden ser mas... for(int i = 0;i < numeroPersonas;i++){ Persona persona = new Persona();//Creamos una persona System.out.println("Digite el id de la persona numero "+i); persona.setId(scanner.nextLine()); System.out.println("Digite el nombre de la persona numero "+i); persona.setNombres(scanner.nextLine()); System.out.println("Digite el apellido de la persona numero "+i); persona.setApellidos(scanner.nextLine()); listaPersonas.add(persona);//adjuntamos a la lista la persona que acabamos de crear }

37

for(int j = 0;j < listaPersonas.size();j++){//ahora imprimiremos las personas de nuestro ArrayList

System.out.println("============================================================"); System.out.println("Persona numero "+j); Persona persona = (Persona)listaPersonas.get(j); System.out.println("Id: "+persona.getId()); System.out.println("Nombre: "+persona.getNombres()); System.out.println("Apellidos: "+persona.getApellidos());

System.out.println("============================================================"); } } }

La clase Vector

38

La clase Vector
import java.io.*; public class programa {
/** Creates a new instance of programa */ public static void main( String [] args ) throws IOException { int i,n,num,op,a,ndt,x,z,sw,j; int v[]; v=new int[10]; BufferedReader in= new BufferedReader (new InputStreamReader (System.in) ); System.out.println ("digite dimension de vector:"); n = Integer.parseInt (in.readLine()); for(i=1;i<=n;i++) { System.out.println("digite un numero:"); num=Integer.parseInt (in.readLine()); v[i]=num; } System.out.println("el vector almacenado:"); for(i=1;i<=n;i++) { System.out.println(v[i] + " "); } do{ System.out.println("menu principal"); System.out.println("ingresar nota"); System.out.println("buscar nota"); System.out.println("eliminar nota"); System.out.println("actualizar nota"); System.out.println("salir"); System.out.println("digite una opcion:"); op=Integer.parseInt(in.readLine()); switch(op){ case 1: System.out.println("digite cantidad de elementos a insertar:"); j = Integer.parseInt(in.readLine()); a=n+j; for (i=(n+1);i<=a;i++) { System.out.println("digite nuevo dato:"); ndt = Integer.parseInt(in.readLine()); v [i]=ndt; } for (i=1;i<=a;i++) { System.out.print(v [ i ] + " ");

La clase Vector
} break; case 2: System.out.println("digite dato a buscar:"); x=Integer.parseInt (in.readLine()); i=1; sw=0; while(i<=n && sw==0) { if(v[i]==x) { System.out.println("el dato se encontro:"); System.out.println("en la posicion:" + i); sw=1; } i=i+1; } if(sw==0) { System.out.println("el dato no existe:"); } break; case 3: System.out.println("### eliminar nota ###"); break; case 4: System.out.println("digite dato a buscar:"); x = Integer.parseInt(in.readLine()); i=1; sw=0; while(i<=n && sw==0) { if(v[i]==x) { System.out.println("el dato se encontro:" + i); sw=1; System.out.println("digite nuevo dato"); z = Integer.parseInt(in.readLine()); v[i]=z; } i=i+1; } if(sw==0) { System.out.println("el dato no existe:"); }

39

La clase Vector
for (i=1;i<=n;i++) { System.out.print(v [ i ] + " "); } break; case 5: System.out.println("### salir ###"); break; default: System.out.println("opcion invalida"); break; } }while(op!=5); System.out.println("fin del programa"); }

40

La clase Hashtable
Una tabla hash es una estructura de datos para asociar un conjunto de valores con sus llaves. Similar a un diccionario donde se asocia a cada palabra su definicin: Ejemplo: Carlos => Mxico Jos => China Juan => USA Ernesto => Per Germn => Chile Aqu se asocia o relaciona cada nombre de persona con el pais de origen. En java hay dos clases que implementan un tabla hash: Hashtable y Hashmap. Hashmap que es ms rpida al no contemplar sincronizacin y tambin acepta nulos (nulls) a diferencia de Hashtable.

Imprimir en Pantalla

41

Imprimir en Pantalla
Para imprimir por pantalla se hace uso del objeto System.out, que representa la salida estndar. Tpicamente este objeto se corresponde con la pantalla u otra salida especificada en las variables de entorno del sistema en el que se ejecuta. El objeto System.out es del tipo java.io.PrintStream y, por ello, dispone de mtodos para escribir con formato en el flujo de salida, usualmente el monitor. Los ms interesantes son: print, mtodo sobrecargado que puede recoger cualquier tipo de datos bsico, cadena u objeto; println, idntico a print salvo en que imprime un salto de lnea final; o format, que permite escribir los datos ajustndose a un determinado formato, de modo similar a cmo lo hace el printf de C. As, la sentencia para imprimir por pantalla y dar dos salto de lnea, el salto de lnea propio del mtodo y el indicado por '\n', es: System.out.println("Esto sale en pantalla\n"); Lo siguiente imprime el texto por pantalla con un nico salto de lnea: System.out.println("caracteres"); Tambin podemos concatenar objetos de tipo String antes y luego imprimirlos, por ejemplo: String valor = "Este es el mensaje: "; System.out.println(valor+ " Hola"); El mensaje sera: Este es el mensaje: Hola Cuando un objeto se concatena con una cadea o se imprime por pantalla, para su representacin se hace una llamada implcita a la implementacin que haga de su mtodo toString.

Applets

42

Applets
import java.io.*; import java.util.*; class CascaronIO { public static void main(String[] args) throws IOException,NumberFormatException { BufferedReader teclado=new BufferedReader(new InputStreamReader(System.in)); PrintStream pantalla=System.out; //aca va nuestro programa a partir de esta linea }

Threads
Para poder hablar de threads tenemos que hablar de procesos. Un proceso o tarea se puede entender como diferentes procedures corriendo a la vez, sin pensar en multiprocesadores, sincronizndose entre si.

Palabras reservadas
Los literales y las palabras clave, son palabras reservadas utilizadas por el Lenguaje de Programacin Java y no pueden ser usadas como identificadores. A continuacin mostramos una lista de estas palabras y las secciones del libro en donde podemos encontrar el uso para el que est reservado.

Literales
true (literal booleano) Literales boolean false (literal booleano) Literales boolean null (literal nulo)

Palabras reservadas

43

Palabras clave
abstract assert (aadido en 1.4) boolean Tipo de variable break byte Tipo de variable case Sentencia switch catch char Tipo de variable class const (sin uso) continue default do double Tipo de variable else Sentencia if-else enum (aadido en 5.0) extends final La variable final finally float Tipo de variable for goto (sin uso) if Sentencia if-else implements import instanceof int

Tipo de variable interface long Tipo de variable native new package private

Palabras reservadas protected public return short Tipo de variable static strictfp (aadido en 1.2) super switch Sentencia switch synchronized this throw throws transient try Sentencia try void volatile while

44

Crear un PDF en Java


Cmo crear un PDF en Java
Crear un PDF en Java utilizando la librera itext.jar, es gratis y se puede descargar en Itexdocs [1], cuyo manual est en Tutorial Itexdocs [2], puede ser muy til cuando se requiere que en una aplicacin web, el cliente reciba la respuesta en formato PDF al vuelo o en archivo, y escrupulosamente paginado del tipo pgina x de y, esto se logra programando metodos del tipo evento, por ejemplo cuando un documento es abierto (onOpenDocument), una pgina empieza (onStartPage), cuando una pagina termina (onEndPage), cuando se cierra el documento (onCloseDocument), Etc., estos mtodos se programan y se ejecutan automticamente siempre y cuando se extienda la clase en la que se encuentran a PdfPageEventHelper, de esta manera cuando ocurra un evento sucedera lo que se le programe a ese evento, pero para poner la paginacin x de y, el valor de y lo sabremos al final cuando ya se va a cerrar el documento por programacin se sabe, pero para poner en todas las pginas del documento el valor de y es una forma poner un lienzo (tipo Template) ese lienzo estar en blanco en el lugar de y, es como una variable que al final recibir un valor y se pintar en todos lados del PDF donde lo pongamos, de esta manera ya cuando se sepa el valor de y se le asigna, este aparece pintado en el lienzo, ejemplo bsico es el siguiente: /* * $Id: PageNumbersWatermark.java,v 1.3 2005/05/09 11:52:50 blowagie Exp $ * $Name: $ * * This code is part of the 'iText Tutorial'. * You can find the complete tutorial at the following address: * http:/ / itextdocs. lowagie. com/ tutorial/

Crear un PDF en Java * * This code is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * itext-questions@lists.sourceforge.net */ package com.lowagie.examples.directcontent.pageevents; import java.awt.Color; import java.io.FileOutputStream; import com.lowagie.text.Chunk; import com.lowagie.text.Document; import com.lowagie.text.Element; import com.lowagie.text.ExceptionConverter; import com.lowagie.text.Font; import com.lowagie.text.Image; import com.lowagie.text.PageSize; import com.lowagie.text.Paragraph; import com.lowagie.text.Phrase; import com.lowagie.text.Rectangle; import com.lowagie.text.pdf.BaseFont; import com.lowagie.text.pdf.PdfContentByte; import com.lowagie.text.pdf.PdfGState; import com.lowagie.text.pdf.PdfPTable; import com.lowagie.text.pdf.PdfPageEventHelper; import com.lowagie.text.pdf.PdfTemplate; import com.lowagie.text.pdf.PdfWriter; /** * Demonstrates the use of templates to add Watermarks and Pagenumbers. */ public class PageNumbersWatermark extends PdfPageEventHelper { /** An Image that goes in the header. */ public Image headerImage; /** The headertable. */ public PdfPTable table; /** The Graphic state */ public PdfGState gstate; /** A template that will hold the total number of pages. */ public PdfTemplate tpl; /** The font that will be used. */ public BaseFont helv; /** * Generates a document with a header containing Page x of y and with a Watermark on every page.

45

Crear un PDF en Java * @param args no arguments needed */ public static void main(String args[]) { try { // step 1: creating the document Document doc = new Document(PageSize.A4, 50, 50, 100, 72); // step 2: creating the writer PdfWriter writer = PdfWriter.getInstance(doc, new FileOutputStream("pageNumbersWatermark.pdf")); // si deseas que respusta sea al vuelo y no en archivo //esta clase debe importar -- import javax.servlet.http.*; //y recibir como parametro el objeto response //as el clien te recibira la respuesta en su navegador en pdf ejemplo: ///PdfWriter writer = PdfWriter.getInstance(doc, response.getOutputStream()); // step 3: initialisations + opening the document writer.setPageEvent(new PageNumbersWatermark()); doc.open(); // step 4: adding content String text = "some padding text "; for (int k = 0; k < 10; ++k) text += text; Paragraph p = new Paragraph(text); p.setAlignment(Element.ALIGN_JUSTIFIED); doc.add(p); // step 5: closing the document doc.close(); } catch ( Exception e ) { e.printStackTrace(); } }

46

/** * @see com.lowagie.text.pdf.PdfPageEventHelper#onOpenDocument(com.lowagie.text.pdf.PdfWriter, com.lowagie.text.Document) */ public void onOpenDocument(PdfWriter writer, Document document) { try { // initialization of the header table headerImage = Image.getInstance("logo.gif"); table = new PdfPTable(2); Phrase p = new Phrase();

Crear un PDF en Java Chunk ck = new Chunk("lowagie.com\n", new Font(Font.TIMES_ROMAN, 16, Font.BOLDITALIC, Color.blue)); p.add(ck); ck = new Chunk("Ghent\nBelgium", new Font(Font.HELVETICA, 12, Font.NORMAL, Color.darkGray)); p.add(ck); table.getDefaultCell().setBackgroundColor(Color.yellow); table.getDefaultCell().setBorderWidth(0); table.addCell(p); table.getDefaultCell().setHorizontalAlignment(Element.ALIGN_RIGHT); table.addCell(new Phrase(new Chunk(headerImage, 0, 0))); // initialization of the Graphic State gstate = new PdfGState(); gstate.setFillOpacity(0.3f); gstate.setStrokeOpacity(0.3f); // initialization of the template tpl = writer.getDirectContent().createTemplate(100, 100); tpl.setBoundingBox(new Rectangle(-20, -20, 100, 100)); // initialization of the font helv = BaseFont.createFont("Helvetica", BaseFont.WINANSI, false); } catch(Exception e) { throw new ExceptionConverter(e); } }

47

/** * @see com.lowagie.text.pdf.PdfPageEventHelper#onEndPage(com.lowagie.text.pdf.PdfWriter, com.lowagie.text.Document) */ public void onEndPage(PdfWriter writer, Document document) { PdfContentByte cb = writer.getDirectContent(); cb.saveState(); // write the headertable table.setTotalWidth(document.right() - document.left()); table.writeSelectedRows(0, -1, document.left(), document.getPageSize().height() - 50, cb); // compose the footer String text = "Page " + writer.getPageNumber() + " of "; float textSize = helv.getWidthPoint(text, 12); float textBase = document.bottom() - 20; cb.beginText(); cb.setFontAndSize(helv, 12); // for odd pagenumbers, show the footer at the left

Crear un PDF en Java if ((writer.getPageNumber() & 1) == 1) { cb.setTextMatrix(document.left(), textBase); cb.showText(text); cb.endText(); cb.addTemplate(tpl, document.left() + textSize, textBase); } // for even numbers, show the footer at the right else { float adjust = helv.getWidthPoint("0", 12); cb.setTextMatrix(document.right() - textSize - adjust, textBase); cb.showText(text); cb.endText(); cb.addTemplate(tpl, document.right() - adjust, textBase); } cb.saveState(); // draw a Rectangle around the page cb.setColorStroke(Color.orange); cb.setLineWidth(2); cb.rectangle(20, 20, document.getPageSize().width() - 40, document.getPageSize().height() - 40); cb.stroke(); cb.restoreState(); // starting on page 3, a watermark with an Image that is made transparent if (writer.getPageNumber() >= 3) { cb.setGState(gstate); cb.setColorFill(Color.red); cb.beginText(); cb.setFontAndSize(helv, 48); cb.showTextAligned(Element.ALIGN_CENTER, "Watermark Opacity " + writer.getPageNumber(), document.getPageSize().width() / 2, document.getPageSize().height() / 2, 45); cb.endText(); try { cb.addImage(headerImage, headerImage.width(), 0, 0, headerImage.height(), 440, 80); } catch(Exception e) { throw new ExceptionConverter(e); } cb.restoreState(); } } /** * @see

48

Crear un PDF en Java

49

com.lowagie.text.pdf.PdfPageEventHelper#onStartPage(com.lowagie.text.pdf.PdfWriter, com.lowagie.text.Document) */ public void onStartPage(PdfWriter writer, Document document) { if (writer.getPageNumber() < 3) { PdfContentByte cb = writer.getDirectContentUnder(); cb.saveState(); cb.setColorFill(Color.pink); cb.beginText(); cb.setFontAndSize(helv, 48); cb.showTextAligned(Element.ALIGN_CENTER, "My Watermark Under " + writer.getPageNumber(), document.getPageSize().width() / 2, document.getPageSize().height() / 2, 45); cb.endText(); cb.restoreState(); } } /** * @see com.lowagie.text.pdf.PdfPageEventHelper#onCloseDocument(com.lowagie.text.pdf.PdfWriter, com.lowagie.text.Document) */ public void onCloseDocument(PdfWriter writer, Document document) { tpl.beginText(); tpl.setFontAndSize(helv, 12); tpl.setTextMatrix(0, 0); tpl.showText("" + (writer.getPageNumber() - 1)); tpl.endText(); } } Dudas escribir a ange_leos@yahoo.es 19:47 21 oct, 2005 (UTC) Angelica L.

Referencias
[1] http:/ / itextdocs. lowagie. com [2] http:/ / itextdocs. lowagie. com/ tutorial/

Fuentes y contribuyentes del artculo

50

Fuentes y contribuyentes del artculo


Versin Para Imprimir Fuente: http://es.wikibooks.org/w/index.php?oldid=178715 Contribuyentes: Addihockey10, Ihck, MarcoAurelio, , 11 ediciones annimas Estructuras de control Fuente: http://es.wikibooks.org/w/index.php?oldid=134244 Contribuyentes: Pirenne Estructuras de seleccin Fuente: http://es.wikibooks.org/w/index.php?oldid=173949 Contribuyentes: Pirenne, 4 ediciones annimas Sentencia if-else Fuente: http://es.wikibooks.org/w/index.php?oldid=175723 Contribuyentes: MarcoAurelio, Morza, Pirenne, 3 ediciones annimas Sentencia switch Fuente: http://es.wikibooks.org/w/index.php?oldid=134250 Contribuyentes: Luckas Blade, Pirenne, 5 ediciones annimas Operador if-else Fuente: http://es.wikibooks.org/w/index.php?oldid=134254 Contribuyentes: Pirenne Estructuras de iteracin Fuente: http://es.wikibooks.org/w/index.php?oldid=168325 Contribuyentes: Pirenne, 1 ediciones annimas Sentencia while Fuente: http://es.wikibooks.org/w/index.php?oldid=175871 Contribuyentes: Luckas Blade, Pirenne, Ruy Pugliesi, 11 ediciones annimas Sentencia do-while Fuente: http://es.wikibooks.org/w/index.php?oldid=134262 Contribuyentes: Pirenne Sentencia for Fuente: http://es.wikibooks.org/w/index.php?oldid=147278 Contribuyentes: ManuelGR, Pirenne, 5 ediciones annimas Sentencia break Fuente: http://es.wikibooks.org/w/index.php?oldid=160372 Contribuyentes: Pirenne, 5 ediciones annimas Sentencia continue Fuente: http://es.wikibooks.org/w/index.php?oldid=134268 Contribuyentes: 3 ediciones annimas Funciones Fuente: http://es.wikibooks.org/w/index.php?oldid=172999 Contribuyentes: Oscarlondono, Pillou, Pirenne, 4 ediciones annimas Parmetros de una funcin Fuente: http://es.wikibooks.org/w/index.php?oldid=171389 Contribuyentes: Earizon, Magister Mathematicae, Oscarlondono, 4 ediciones annimas Clusula return Fuente: http://es.wikibooks.org/w/index.php?oldid=152582 Contribuyentes: Oscarlondono, VictorRS, 1 ediciones annimas Funciones recursivas Fuente: http://es.wikibooks.org/w/index.php?oldid=152585 Contribuyentes: Baiji, NaitoNeko, Oscarlondono, Pirenne, VictorRS, 5 ediciones annimas Programacin Orientada a Objetos Fuente: http://es.wikibooks.org/w/index.php?oldid=176164 Contribuyentes: Bufalo 1973, Elingedgar, Ferk, Roqueorts, Vinikike, 4 ediciones annimas Clases Fuente: http://es.wikibooks.org/w/index.php?oldid=177115 Contribuyentes: Ferk, JackPotte, 24 ediciones annimas Ejemplos de Implementacin Fuente: http://es.wikibooks.org/w/index.php?oldid=148008 Contribuyentes: Ferk, Hawk ray, 1 ediciones annimas Ejercicios Prcticos Fuente: http://es.wikibooks.org/w/index.php?oldid=155046 Contribuyentes: 4 ediciones annimas Objetos Fuente: http://es.wikibooks.org/w/index.php?oldid=141988 Contribuyentes: 2 ediciones annimas Encapsulamiento Fuente: http://es.wikibooks.org/w/index.php?oldid=176209 Contribuyentes: 4 ediciones annimas Herencia Fuente: http://es.wikibooks.org/w/index.php?oldid=148124 Contribuyentes: XXkasperXx Interfaces Fuente: http://es.wikibooks.org/w/index.php?oldid=171972 Contribuyentes: Vladimirbat Polimorfismo Fuente: http://es.wikibooks.org/w/index.php?oldid=131069 Contribuyentes: Josias, 1 ediciones annimas La clase String Fuente: http://es.wikibooks.org/w/index.php?oldid=148060 Contribuyentes: Maximossj, Oleinad, 1 ediciones annimas La clase StringBuffer Fuente: http://es.wikibooks.org/w/index.php?oldid=155699 Contribuyentes: Eleazarbr La clase ArrayList Fuente: http://es.wikibooks.org/w/index.php?oldid=173562 Contribuyentes: RSalcedo La clase Vector Fuente: http://es.wikibooks.org/w/index.php?oldid=133385 Contribuyentes: Wutsje, 2 ediciones annimas La clase Hashtable Fuente: http://es.wikibooks.org/w/index.php?oldid=176212 Contribuyentes: Cvmontuy, 6 ediciones annimas Imprimir en Pantalla Fuente: http://es.wikibooks.org/w/index.php?oldid=160141 Contribuyentes: Morza, Oleinad, 9 ediciones annimas Applets Fuente: http://es.wikibooks.org/w/index.php?oldid=162899 Contribuyentes: 2 ediciones annimas Threads Fuente: http://es.wikibooks.org/w/index.php?oldid=171356 Contribuyentes: Magister Mathematicae, 2 ediciones annimas Palabras reservadas Fuente: http://es.wikibooks.org/w/index.php?oldid=165839 Contribuyentes: Magister Mathematicae, Pirenne, Sphera5, 12 ediciones annimas Crear un PDF en Java Fuente: http://es.wikibooks.org/w/index.php?oldid=171391 Contribuyentes: Magister Mathematicae, ManuelGR, 5 ediciones annimas

Fuentes de imagen, Licencias y contribuyentes

51

Fuentes de imagen, Licencias y contribuyentes


Archivo:50%.png Fuente: http://es.wikibooks.org/w/index.php?title=Archivo:50%.png Licencia: Creative Commons Attribution-Sharealike 3.0,2.5,2.0,1.0 Contribuyentes: TouzaxA Archivo:75%.png Fuente: http://es.wikibooks.org/w/index.php?title=Archivo:75%.png Licencia: Creative Commons Attribution-Sharealike 3.0,2.5,2.0,1.0 Contribuyentes: TouzaxA Archivo:00%.svg Fuente: http://es.wikibooks.org/w/index.php?title=Archivo:00%.svg Licencia: Public Domain Contribuyentes: Siebrand Archivo:100%.svg Fuente: http://es.wikibooks.org/w/index.php?title=Archivo:100%.svg Licencia: Public Domain Contribuyentes: Siebrand

Licencia

52

Licencia
Creative Commons Attribution-Share Alike 3.0 Unported //creativecommons.org/licenses/by-sa/3.0/

Potrebbero piacerti anche