CONCEPTOS BSICOS DE PROGRAMACIN CON JAVA Tercera edicin
LUZ ELENA JIMNEZ COLLAZOS UNIVERSIDAD ICESI
1 4 Conceptos Bsicos de Programacin Orientada a Objetos.
4.1 Programacin Orientada a Objetos
La programacin orientada a objetos, se basa en que una situacin puede ser modelada, y los problemas que se presenten en su interior resueltos, mediante la utilizacin de objetos de clases existentes o que deben ser creadas. En este libro, en los captulos previos, se han presentado problemas cuya solucin ha requerido el uso de objetos creados a partir de clases que trae java; por ello, este captulo estar dedicado a la identificacin objetos, cuyo comportamiento, creacin y relaciones se definir a travs de clases que se aprendern a definir en l.
4.2 Objetos.
Al hacer referencia a un objeto, se habla de una unidad que tiene identidad propia, y puede tener caractersticas y, adems, estar en capacidad de prestar servicios. Liste algunas de las clases, cuyos objetos ha utilizado en el cdigo que hasta ahora ha elaborado. Incluya, tambin, los mtodos que ha requerido.
Ejercicio Resuelto. Problema: Presente un objeto y mencione para l, al menos dos cosas que tenga y un servicio que pueda prestar. Solucin: Objeto: mi perro Caractersticas: Tiene color: Es negro y blanco. Tiene una raza: Es Shih Tzu. Servicio: Juega con los nios. Haga una lista de diez objetos, para cada uno de ellos defina al menos dos cosas que se puedan saberse de cada uno de ellos y un servicio que cada uno pueda prestar.
Ejercicio Resuelto Problema: Identifique caractersticas y servicios para el color rojo. CONCEPTOS BSICOS DE PROGRAMACIN CON JAVA Tercera edicin LUZ ELENA JIMNEZ COLLAZOS UNIVERSIDAD ICESI 2 Solucin: Esto no es posible, ya que no es una unidad que posea caractersticas, ni preste servicios, o sea que no es un objeto. El color rojo bien podra ser una caracterstica de un objeto determinado.
Ejercicio Propuesto Seleccione cuales de las siguientes menciones corresponden a objetos.
Mencin Es objeto? - recuerde justificar su respuesta - la argolla matrimonial de su abuela materna.
el color negro del asta de la banderas del parque Panamericano
los perros el cinco true la mesa de la cafetera en la cual 'mecate' la ltima vez.
el florero de Llorente la inteligencia el vaso en el cual se sirvi su ltimo jugo de naranja.
la pelota de ftbol
Ejemplo: A continuacin se presenta un ejercicio, en el cual se trabaja con diferentes objetos, para llegar a identificar algunas de las caractersticas que ellos presentan, este ejercicio se retomar a lo largo del captulo, as que se pide al lector prestar mucha atencin.
Se est trabajando con una compaa que quiere producir un software para que la gente pueda trabajar con figuras geomtricas de diferentes tipos, as que se requiere que se describa la siguiente figura geomtrica: 1
"Se trata de un tringulo, cuyo lado base mide 3 centmetros y su lado altura mide 4 centmetros. Adems uno de sus ngulos es recto, por lo cual se puede afirmar que se trata de un tringulo rectngulo. Para los tringulos se calcula el rea como la longitud de la base - 3 cm. - multiplicada
1 Es importante hacer claridad frente al hecho de que quienes escriben estas notas no son expertos en geometra y aunque se ha tratado de verificar cada cosa que se incluye, a fin de evitar errores, es posible que alguno se haya colado. 4 c 3 c CONCEPTOS BSICOS DE PROGRAMACIN CON JAVA Tercera edicin LUZ ELENA JIMNEZ COLLAZOS UNIVERSIDAD ICESI 3 por la longitud de la altura - 4 cm. - y esto dividido entre 2. O sea que este tringulo tiene un rea de 6 cm 2 . Adems como es un tringulo rectngulo se sabe que su hipotenusa - el lado cuya longitud desconocemos - se calcula como la raz cuadrada de la suma de los cuadrados de los catetos - que son los lados cuyas longitudes conocemos, o sea que la hipotenusa de este tringulo, mide 5 centmetros -. Tambin se podra calcular su permetro, que sera la suma de las longitudes de sus lados, en este caso 3 cm. + 4 cm. + 5 cm. = 12 centmetros. "
Al revisar el prrafo anterior, se puede identificar que las caractersticas que se mencionan para esta figura geomtrica son: la longitud de sus lados. el ngulo de uno de sus vrtices.
y los servicios: el contar con un mtodo para calcular su rea. el contar con un mtodo para calcular su permetro. el contar con un mtodo para calcular la longitud de su hipotenusa.
Y ahora se pide describir esta figura:
"Se trata de un tringulo, que tiene un lado que mide 3 centmetros, de los otros dos lados se desconoce su longitud. Sin embargo, se nos dice que su altura es de 4 centmetros. Adems los dos lados, cuya longitud se desconoce, parecen medir lo mismo, as que parece ser un tringulo issceles. Como sigue siendo un tringulo su rea se sigue calculando como la longitud de la base - 3 cm. - multiplicada por la longitud de la altura - 4 cm. - y esto dividido entre 2. O sea que este tringulo tambin tiene un rea de 6 cm 2 . Su permetro tambin es la suma de los lados, pero como se desconoce la longitud de dos lados se debe hacer un razonamiento: es muy sencillo, si trazamos una lnea desde el punto ms alto al centro de la base, este tringulo estar formado por dos tringulos rectngulos unidos, y la longitud de sus catetos se conoce (cateto uno = 1.5 centmetros, cateto dos = 4 centmetros), as que de nuevo se puede calcular la hipotenusa y se obtendr la longitud de los otros dos lados. As la longitud desconocida corresponde a 4.27 centmetros (que es la raz cuadrada de (1.5 2 + 4 2 )). Con esta informacin se puede obtener el permetro como la suma de 4.27 centmetros + 4.27 centmetros + 3 centmetros = 11.54 centmetros."
En esta figura se identifican estas caractersticas: la longitud de su base: 3 centmetros. la longitud de su altura: 4 centmetros.
y servicios: el mtodo para calcular su rea. el mtodo para calcular el permetro. el mtodo para obtener la longitud de sus lados, a partir de su base y altura. 3 cm. 4 cm. CONCEPTOS BSICOS DE PROGRAMACIN CON JAVA Tercera edicin LUZ ELENA JIMNEZ COLLAZOS UNIVERSIDAD ICESI 4
Ahora una figura realmente diferente:
"Se trata de un crculo, que tiene un radio de 2 centmetros. Al ser un crculo, la forma en la cual se obtiene su rea es diferente, pues se debe calcular como (3.1416) por la longitud del radio elevado al cuadrado - 2 centmetros, en este caso -. O sea que este crculo tiene un rea de 12.5664 centmetros cuadrados. Los crculos tambin tiene un permetro, y la frmula para obtenerlo es 2 por la longitud del radio, o sea que el permetro de este crculo es 12.5664 centmetros"
De lo cual se puede decir que la caracterstica que se presenta de esta figura es: la longitud de su radio: 2 centmetros.
y sus servicios: el mtodo para calcular su rea. el mtodo para calcular el permetro Sigue prestando estos servicios! - aunque lo haga de forma diferente -
Por ltimo se requiere la descripcin de la siguiente figura:
"Se trata de un cuadrado, que tiene como longitud de lado 3 centmetros. Para los cuadrados la frmula para calcular el rea se reduce a elevar al cuadrado la longitud de su lado, o sea que en este caso correspondera a 3 2 , o sea que sera 9 centmetros cuadrados, y el permetro se calcula 3 cm. 3 cm. radio: 2 cm. CONCEPTOS BSICOS DE PROGRAMACIN CON JAVA Tercera edicin LUZ ELENA JIMNEZ COLLAZOS UNIVERSIDAD ICESI 5 multiplicando la longitud del lado por 4, o sea que este cuadrado tendra como permetro 12 centmetros."
Y las caractersticas de esta figura, segn la descripcin, son: la longitud de su lado: 3 centmetros.
y sus servicios: el mtodo para calcular su rea. el mtodo para calcular su permetro. De nuevo presta estos servicios, y tambin lo hace en forma diferente a las figuras vistas anteriormente.
Si se revisan las descripciones presentadas hasta ahora, qu cosas se tienen en comn estas figuras geomtricas?
en cuanto a caractersticas:
nombre base altura lados iguales radio lado figura uno si si si si figura dos si si si si si figura tres si si figura cuatro si si si
en cuanto a servicios:
hallar hipotenus a hallar rea hallar permetro figura uno si si si figura dos si si si figura tres si si figura cuatro si si
As que si se quisiera obtener conclusiones, se podra decir que: las figuras geomtricas tienen un nombre. permiten calcular un rea permiten calcular un permetro.
Pero tambin se podra decir que las figuras uno y dos tienen varias cosas en comn entre ellas, y que no comparten con las otras figuras: ambas tienen base y altura ambas pueden calcular la longitud de la hipotenusa.
As que se podra afirmar que toda figura geomtrica tiene un nombre, un rea y un permetro, tambin se podra decir que algunas figuras geomtricas tienen una base, una altura y pueden calcular la longitud de la hipotenusa.
CONCEPTOS BSICOS DE PROGRAMACIN CON JAVA Tercera edicin LUZ ELENA JIMNEZ COLLAZOS UNIVERSIDAD ICESI 6 Despus de estos ejercicios se debe tratar de volver a la definicin de lo que es un objeto, y se podra decir que un objeto es la unidad bsica con la cual se trabaja en programacin orientada a objetos. Esta unidad contiene una informacin, y a partir de esta informacin el objeto est en capacidad de prestar una serie de servicios que le pueden ser solicitados. La informacin que de l se guarda, lo que hasta ahora se ha presentado como caractersticas, se conoce como sus atributos y los servicios que puede prestar se denominan mtodos. Es importante dejar presente el hecho de que los atributos son las caractersticas del objeto y otra cosa son los valores que puedan tener esos atributos en un momento determinado. Defina con sus propias palabras qu es un objeto.
Ejercicio Resuelto Problema: Identifique cinco caractersticas para los objetos casa; despus d algunos ejemplos de los valores que podran tomar. Solucin: Algunas de las caractersticas de los objetos casa son: Nmero de pisos. Nmero de habitaciones. Cantidad de baos. Cantidad de parqueaderos. Si est dentro de una unidad.
Y, algunos de los valores que podran tomar estas caractersticas son:
Nmero de pisos
Nmero de habitaciones Cantidad de baos Cantidad de parqueaderos Si est dentro de una unidad 1 4 5 2 no 1 3 4 1 si 2 5 4 1 si 3 4 3 3 si
Ejercicio Propuesto Identifique dentro del siguiente prrafo de qu tipo de objetos se est hablando, y mencione, al menos, cinco caractersticas que se presenten de ellos.
Se conoce a los Reyes Magos a aquellos que, guiados por una estrella, fueron de Oriente a Beln para adorar al Nio Jess. El Evangelio de San Mateo narra la ofrenda de oro, incienso y mirra, hecha a Dios Nio, recin nacido, por tres poderosos y sabios peregrinos. As, la tradicin popular ha ido perfilando las figuras de los tres oferentes, a quienes el evangelista llama Magos, aunque la exgesis les niega condicin real. Fue San Cesreo de Arls quien, en el s. VI, as los clasific extendindose entonces por la Cristiandad el apelativo. CONCEPTOS BSICOS DE PROGRAMACIN CON JAVA Tercera edicin LUZ ELENA JIMNEZ COLLAZOS UNIVERSIDAD ICESI 7 De su pas de origen, slo dice San Mateo que procedan de Oriente; los testimonios ms antiguos de la Iglesia de Siria y de los padres griegos afirman que procedan de Persia, donde, como es sabido, exista la casta de los magos o astrlogos. Otros hablan de Caldea, de donde surgi la astrologa. Tambin se remonta al s. V la suposicin de que eran tres, aunque se ha hablado de dos, cuatro, siete y hasta doce. Los nombres de Melchor, Gaspar y Baltasar se popularizaron en la Iglesia desde el s. IX, siguiendo el texto del venerable Beda, en su Collectnea, recogido en la tradicin y que ha perdurado hasta ahora: Melchor, anciano de barba blanca, que ofreci el oro, como a rey; Gaspar, joven y rubio, rasurado, incienso, como a Dios, y Baltasar, negro y con barba, mirra, como a hombre. Simboliza esta aquiescencia y pleitesa la Epifana y la Teofana: manifestacin, revelacin de Dios, y a modo de primicia en la conversin de los gentiles. La estrella que con su fulgor gui a los Reyes Magos, fue luz milagrosa, no astro natural, y aunque la Epifana se celebra por la Iglesia pocos das despus de la Natividad, el 6 de enero, parece ser que entre ambos hechos medi ms tiempo, acaso ms de un ao. De los regalos que ofrecieron los Reyes al Nio, procede la costumbre espaola y, por ende, de muchos pases iberoamericanos, de los obsequios a los pequeos en la fecha precitada. En otros pases cumplen anloga misin en los das navideos otros personajes santos o laicos, como Santa Claus o San Nicols de Bari, en Holanda, que, segn la tradicin, llega de Espaa; y el norte de Europa adopt la figura laica de un anciano grueso y bonachn, de cabello, barba y bigote blancos y vestido de rojo (al que los franceses, que han adoptado esta costumbre, llaman Papa Noel), cuyo smbolo es el rbol, como el beln o nacimiento lo es de los Reyes Magos. 2
Adems de los atributos y mtodos que hasta ahora se han identificado en los diferentes objetos que se han presentado, es muy importante mencionar que los objetos tienen algo ms, y esto es identidad. Identidad es la propiedad que le permite al objeto ser l, y ser nico. La identidad no debe estar relacionada con los valores que tomen uno o varios de los atributos que los objetos tengan, pues la identidad puede servir para diferenciar a un objeto de otro, an si todos los atributos tienen los mismos valores y estn en capacidad de prestar los mismos servicios. Qu pasa si dos personas tienen lapiceros rojos, exactamente iguales: la misma marca, el mismo peso, la misma tapa, y todo exactamente igual? Cmo se puede diferenciar cul es el de cada uno? La forma ms sencilla es por su ubicacin, se podra pensar que cada lapicero est en poder de su dueo. As la identidad de estos lapiceros no est dada por el valor que toma ninguna de sus caractersticas, ni por los servicios que estn en capacidad de prestar; en este caso su identidad est dada por su ubicacin.
En conclusin, se puede decir que un objeto puede tener una o varias caractersticas, o atributos, puede prestar unos servicios, pero ahora se sabe que tambin tiene una identidad que lo hace nico.
4.3 Clases.
Es importante tener presente que hasta ahora se ha hablado de objetos, es decir, de elementos concretos, que pueden ser identificados, pues tienen identidad, y que pueden poseer unos atributos y prestar unos servicios. Sin embargo, no se ha presentado la forma a travs de la cual se define para un objeto determinado cules son las caractersticas que se deben conocer, o qu servicios se puede esperar que ese objeto determinado preste. Esta es la funcin de las clases.
2 Dicionario Enciclopdico Espasa. Tomado de la pgina web: yaviennlosreyes.com Web de los Reyes Magos de Oriente. CONCEPTOS BSICOS DE PROGRAMACIN CON JAVA Tercera edicin LUZ ELENA JIMNEZ COLLAZOS UNIVERSIDAD ICESI 8 Las clases son el patrn que define qu tendr un objeto y qu servicios estar en capacidad de prestar; de manera que los objetos no podran existir si no existieran las clases. Las clases permiten la creacin de los objetos, pues no slo definen qu tiene que tener cada objeto que pertenezca a ella, sino que guarda la informacin requerida para que cada uno de ellos sea capaz de prestar los servicios que de l se requieren. Tambin est en capacidad de prestar servicios comunes a todos sus objetos o guardar valores que ellos puedan requerir. Otra de las funciones de las clases, es decir qu se debe hacer al momento de crear un nuevo objeto, por esto ellas deben definir un servicio que no prestan los objetos, sino que tiene por funcin definir cmo ser la creacin de cada uno de ellos; este mtodo se denomina el constructor. De lo anterior se puede concluir que no podran existir los objetos, de no existir las clases. Defina con sus propias palabras qu es una clase y en qu se diferencia de los objetos.
Responda las siguientes preguntas: Podra existir el Deportivo Huila si no existieran los equipos de ftbol? Podra existir Donald, si no existieran los dibujos animados? Habra podido existir Laika, si los perros no existieran?
4.4 Clases en java 3 .
Java es un lenguaje de programacin orientado a objetos, por ello dentro del lenguaje las construcciones bsicas son las clases. De hecho, hasta el momento cada vez que se ha elaborado cdigo para resolver los problemas propuestos, se ha incluido en este cdigo la sentencia:
3 Se incluye, en el Apndice B de este material, la descripcin de todos los elementos que pueden manejarse al definir clases en Java. Se recomienda que ante cualquier duda se revise dicho documento. CONCEPTOS BSICOS DE PROGRAMACIN CON JAVA Tercera edicin LUZ ELENA JIMNEZ COLLAZOS UNIVERSIDAD ICESI 9 public class ResolviendoProblemas {
Con ella se est diciendo que se empieza la definicin de una clase. Sin embargo, en los cdigos elaborados hasta ahora no se han creado objetos de estas clases, ello tiene un razn clara y es que en java se cuenta con dos grandes grupos de clases, las clases que se emplean para dar estructura a los objetos, y las clases que la mquina virtual de java reconoce como ejecutables. Estas ltimas son las que se han definido hasta el momento, pues en todas ellas se ha incluido la sentencia:
public static void main (String[] arg) {
que es la que permite identificar la clase como ejecutable.
Ahora se empezar a trabajar en la definicin y utilizacin de clases del otro grupo que se mencion: las clases que permiten crear objetos y resolver los problemas trabajando con ellos. Escriba los nombres de las clases a partir de las cuales ha creado objetos en las clases ejecutables que usted ha creado.
4.4.1 Definicin de atributos de instancia en java.
Java permite que cada clase defina qu atributos deben tener los objetos que a partir de ella se creen, para lo cual se debe decir qu visibilidad tendrn 4 , de qu tipo sern y el nombre que se les quiere dar; en este orden. Es importante tener presente que al definir de qu tipo ser cada atributo, este tipo bien puede ser alguno de los tipos bsicos o un tipo referenciado. Describa, usando sus palabras, los elementos fundamentales para definir un atributo de instancia.
4 En este material se trabajarn los atributos con la visibilidad mnima, es decir como privados. CONCEPTOS BSICOS DE PROGRAMACIN CON JAVA Tercera edicin LUZ ELENA JIMNEZ COLLAZOS UNIVERSIDAD ICESI 10
4.4.2 Definicin de mtodos de instancia en java.
Java permite que cada clase defina qu mtodos deben estar en capacidad de prestar los objetos que a partir de ella se creen, para lo cual se debe decir qu visibilidad tendrn 5 , qu retornaran, el nombre que se les quiere dar y, entre parntesis, los parmetros que debe recibir para poder prestar el servicio que se pide; en este orden. Aqu es importante aclarar que se denomina parmetro a los valores que se pasa a un mtodo para que dentro de l se trabaje con ellos; para definirlos se debe indicar el tipo al cual pertenecen y el nombre con el cual se trabajarn en el mtodo, java no establece ninguna restriccin referente a la cantidad de parmetros que puede definir un mtodo. Describa, usando sus palabras, los elementos fundamentales para definir un mtodo de instancia.
Ejercicio Resuelto: Problema: Se necesita escribir, en java, una clase llamada Cuadrado, que permita definir objetos con las caractersticas identificadas: longitud de su lado. y que estn en capacidad de prestar estos servicios: calcular su rea. calcular su permetro. Solucin: Lo primero que debe hacerse es mostrar en un Diagrama de Clases 6 , la informacin que se requiere de los objetos que se crearn a partir de la clase, y describir los mtodos que se deben ofrecer.
5 En este material se trabajarn los mtodos, por lo general, con la visibilidad mxima, es decir como pblicos. 6 Herramienta de diagramacin definida por el Lenguaje de Modelamiento Unificado UML El atributo de instancia que se define en la clase, estar en todos los objetos que se creen de ella, sin importar cuntos sean. Por ejemplo, sera incorrecto definir ms de un atributo para guardar el nmero de la cdula, en la clase Persona, an sabiendo que se van a crear muchos objetos Persona, con cdula diferente.
En adelante, el proceso de anlisis que se haga consistir en la elaboracin del Diagrama de Clases y la descripcin de los mtodos que las clases involucradas en la solucin del problema contengan. CONCEPTOS BSICOS DE PROGRAMACIN CON JAVA Tercera edicin LUZ ELENA JIMNEZ COLLAZOS UNIVERSIDAD ICESI 11 Diagrama de Clases:
Descripcin de mtodos: rea: No recibe nada como parmetro. Retorna el valor del rea del cuadrado: lado * lado: permetro: No recibe nada como parmetro. Retorna el valor del permetro del cuadrado: 4 * lado. Cdigo en java: public class Cuadrado { private double lado; /** La lnea anterior define el nico atributo que tendrn los objetos que a partir de esta clase se creen; lado, de tipo double. */ public Cuadrado(double longitudLado) { lado = longitudLado; } /** Las lneas anteriores corresponden a la definicin del mtodo constructor. */ public double rea() { return (lado * lado); } /** Las lneas anteriores corresponden a la definicin del mtodo rea. */ public double permetro() { return (4 * lado); } /** Las lneas anteriores corresponden a la definicin del mtodo permetro. */ }
Ejercicio Propuesto: Problema: Se necesita escribir, en java, una clase llamada Crculo, que permita definir objetos con las caractersticas identificadas: longitud de su radio. y que estn en capacidad de prestar estos servicios: calcular su rea. calcular su permetro.
Cuadrado - lado: double
+ Cuadrado(double) + rea():double + permetro():double Esta es la forma de incluir comen- tarios en UML. En este recuadro, va el nombre de la clase. En este recuadro se definen los atributos.
En este recuadro se definen los mtodos. CONCEPTOS BSICOS DE PROGRAMACIN CON JAVA Tercera edicin LUZ ELENA JIMNEZ COLLAZOS UNIVERSIDAD ICESI 12 Anlisis: Diagrama de Clases:
Descripcin de mtodos:
Cdigo en java:
CONCEPTOS BSICOS DE PROGRAMACIN CON JAVA Tercera edicin LUZ ELENA JIMNEZ COLLAZOS UNIVERSIDAD ICESI 13 Ejercicio Resuelto: Ahora, y haciendo referencia a la clase Cuadrado, si alguien quisiera conocer la dimensin del lado de un objeto cuadrado, podra ste drsela? No, pues la clase a la cual el objeto pertenece, no posee ningn mtodo que permita conocer la longitud del lado. Para permitir que esto se haga, se debe adicionar al cdigo que se present en el ejercicio anterior el siguiente cdigo: public double getLado() { return lado; }
Por convencin, entre los programadores que trabajan con java, se acostumbra que los mtodos que retornarn el valor contenido en un atributo del objeto reciban como nombre get seguido del nombre del atributo: getLado, en este caso. Tambin existen la convencin de que el mtodo que permite cambiar el valor de un atributo, reciben el nombre set seguido del nombre del atributo; en este caso no se defini, pues no es comn que un cuadrado cambie la longitud de su lado, pero si se hubiese requerido debera llevar el nombre de setLado.
Para el caso particular de los atributos booleanos, en lugar de utilizar el prefijo get, se utiliza el prefijo is. Si se tiene una variable booleana mayorDeEdad, el mtodo para retornar el valor sera isMayorDeEdad y el tipo de dato retornado sera boolean.
Ejercicios Propuestos: 1. Se necesita adicionar a la clase Crculo un mtodo que permita conocer la longitud de su radio. Anlisis: Diagrama de Clases:
Descripcin del mtodo:
Cdigo en java del mtodo:
CONCEPTOS BSICOS DE PROGRAMACIN CON JAVA Tercera edicin LUZ ELENA JIMNEZ COLLAZOS UNIVERSIDAD ICESI 14 2. Se tiene informacin de muchos estudiantes y se quiere crear una clase, en java, que permita guardar la informacin de ellos. De cada uno se requiere saber el cdigo, nombre, plan de estudios y semestre. Adems se requiere que permita modificar y consultar el valor de cada atributo. Se tiene el siguiente diagrama de clase, as que usted debe describir los mtodos y escribir el cdigo en java.
Diagrama de Clases:
4.4.3 Caractersticas de la Programacin Orientada a Objetos.
Los conceptos de orientacin a objetos, por lo general, se presentan enmarcados entre tres grandes caractersticas: abstraccin: Cuando se habla de abstraccin, al menos en este contexto, se hace referencia a la capacidad de construir una estructura que contenga informacin fuertemente relacionada dentro del contexto que se est estudiando. Estas estructuras de que se habla, son lo que se denomina objetos. Pero debe tenerse presente que la unidad mxima de abstraccin es la clase, pues es ella la que recopila la esencia de la abstraccin, o sea qu se necesita para representar un objeto y poder trabajar con l. As que es la clase la responsable de definir, entre otras cosas, las siguientes: qu atributos van a tener los objetos que se construyan a partir de ella. qu servicios van a estar en capacidad de prestar estos objetos. si ella, la clase, va a definir algn atributo o servicio como suyo, es decir va a permitir que pueda ser utilizado an sin crear objetos. de qu manera quiere que se creen objetos, a partir de ella.
encapsulamiento: Se denomina as a la capacidad que tiene un objeto de esconder, a otros, parte de la informacin que contiene o algunos de los servicios que puede prestar. Igual que en el punto anterior, es importante hacer claridad que es la clase la que define el nivel de encapsulamiento de los objetos que pertenezcan a ella. De esta forma puede definir desde a quien quiere dejar saber que ella existe, hasta si quiere o no que los atributos y servicios de sus objetos puedan ser vistos, y por objetos de qu clases. Estudiante - cdigo: String - nombre: String - planDeEstudios: int - semestreQueCursa: int + Estudiante(String,String,int,int) + setNombre(String):void + setPlanDeEstudios(int):void + setSemestreQueCursa(int):void + getCdigo():String + getNombre():String + getPlanDeEstudios():int + getSemestreQueCursa():int Al momento de realizar la abstraccin de la situacin que se desea modelar, es importante tomar solamente los atributos y servicios que son relevantes a la solucin que se pretende realizar. El incluir atributos y servicios innecesarios puede hacer ms compleja y confusa la solucin resultante.
CONCEPTOS BSICOS DE PROGRAMACIN CON JAVA Tercera edicin LUZ ELENA JIMNEZ COLLAZOS UNIVERSIDAD ICESI 15
herencia: Los objetos pueden heredar de otros, tanto informacin como servicios, sin que esto impida que pueda contener nueva informacin o prestar servicios adicionales. Igual que en el caso de la abstraccin y la herencia, son las clases quienes definen la jerarqua de herencia. Y aqu es muy importante dejar presente que la jerarqua de herencia es irrompible, o sea que si una clase dice que va a heredar de otra, los objetos que se creen a partir de ella, heredan TODA la estructura que tiene la clase padre para sus objetos, as ella haya decidido encapsular al mximo sus atributos o mtodos. De acuerdo a lo anterior, si se regresa al ejercicio de las figuras geomtricas, se puede llegar a pensar que existe una clase raz, denominada FiguraGeomtrica, de la cual heredan las clases Tringulo, Crculo y Cuadrado; tambin puede pensarse que la clase TringuloRectngulo debera heredar de Tringulo, en lugar de heredar, directamente, de la clase FiguraGeomtrica. Esta relacin entre clases, la herencia, se representa en UML con una flecha que termina en un tringulo vaco, el cual seala a la clase padre, as:
polimorfismo: Es la capacidad que tiene un servicio para devolver cosas diferentes. Esta capacidad puede depender de dos cosas: De la informacin que se le proporciona para prestarlo, o sea que un mismo servicio se puede prestar de diversas formas, dependiendo del tipo y cantidad de informacin que se suministra al pedirlo. Esto se conoce como polimorfismo a nivel de sobrecarga. Aqu es importante hacer claridad frente al hecho de que a la informacin que se proporciona al utilizar un servicio se le conoce como parmetro. De a quien se le pide este servicio, o sea que un mismo servicio puede ser prestado por diferentes tipos de objetos, y que cada uno de ellos puede prestarlo de forma diferente. Esto se conoce como sobreescritura. FiguraGeomtrica Crculo Cuadrado Tringulo TringuloRectngulo En la mayora de los casos, la opcin a tomar ser dejar los atributos ocultos para ser utilizados solo dentro de la clase; y los servicios visibles para que objetos de otras clases los puedan utilizar.
Este es un ejemplo, y el que todas las clases involucradas en la solucin de la situacin problemtica planteada hereden de una nica clase, no se puede interpretar como que en cada caso deba haber herencia explcita, y de haberla deba haber una nica clase padre.
CONCEPTOS BSICOS DE PROGRAMACIN CON JAVA Tercera edicin LUZ ELENA JIMNEZ COLLAZOS UNIVERSIDAD ICESI 16 Especifique cuales de los elementos fundamentales para definir un mtodo de instancia pueden cambiar cuando se aplica polimorfismo a un servicio.
4.5 Caractersticas de la Programacin Orientada a Objetos en java.
Cada una de las caractersticas que se mencionaron en el tem anterior, tiene una forma de implementacin dentro de java: abstraccin: Tal como se mencion cuando se present el tema, en java las clases permiten definir los atributos y mtodos con que contar cada objeto; constituyndose en la forma ms alta de abstraccin. encapsulamiento: java permite definir varios niveles de encapsulamiento. Por conveniencia en este material se trabajarn todos los atributos con el mximo nivel de encapsulamiento, es decir se definirn todos los atributos como privados; en cambio los mtodos, por lo general, se trabajarn con el mnimo, es decir sern pblicos. Si se requiere conocer todos los niveles existentes, se recomienda consultar el Apndice B. herencia: En java la herencia es obligatoria, es decir todas las clases tienen que heredar de una clase ya existente. La forma en la cual se indica, en java, que una clase hereda de otra es mediante el uso de la palabra reservada extends, en el encabezado de la clase; para ver esto en ms detalle, se recomienda consultar el Apndice B. Sin embargo, en las clases que se han definido hasta ahora no se indica de quien se heredar. Esto no ha representado ningn problema debido a que el lenguaje, cuando no se indica explcitamente de quien se hereda, asume que se hereda de la clase Object.
Ejercicio Resuelto: Problema: Se necesita escribir, en java, las clases necesarias para registrar la informacin de los libros pertenecientes a la biblioteca del Seor Prez. l ha informado que de cada libro desea guardar el nombre del mismo, el nombre del autor o autores, el ao de edicin y si se trata de una edicin de lujo o no. Tambin ha dicho que tiene una serie de libros que forman colecciones, en cuyo caso, adems de lo anterior, requiere guardar el nombre de la coleccin y el nmero que ocupa el libro en la coleccin. La nica aclaracin adicional que ha hecho es que si se trata de un libro con ms de dos autores, quiere guardar el primer autor, y en el nombre del segundo debe aparecer y otros.
CONCEPTOS BSICOS DE PROGRAMACIN CON JAVA Tercera edicin LUZ ELENA JIMNEZ COLLAZOS UNIVERSIDAD ICESI 17 Diagrama de Clases:
Descripcin de mtodos: Constructor de la clase DeColeccin: Este mtodo recibe tantos parmetros como atributos tienen la clase Libro y DeColeccin, ya que por herencia cada objeto creado a partir de la clase DeColeccin tiene los atributos definidos por la clase Libro, y se requiere darles valor al momento de crear cada objeto. Cdigo en java: public class Libro { private String nombre; private String autorUno; private String autorDos; private int aoEdicin; private boolean lujo; public Libro(String elNombre, String uno, String dos, int ao, boolean lujos){ nombre = elNombre; autorUno = uno; autorDos = dos; aoEdicin = ao; lujo = lujos; } public int getAoEdicin(){ return aoEdicin; } public String getNombre(){ return nombre; } public String getAutores(){ if (autorDos == null){ return autorUno; } return (autorUno+" "+autorDos); Libro - nombre: String - autorUno: String - autorDos: String - aoEdicin: int - lujo: boolean + Libro(String,String,String,int,boolean) + getNombre(): String + getAutores(): String + getAoEdicin(): int + isLujo(): boolean - nombreColeccin: String - posicin: int + DeColeccin(String,String,String,int, boolean,String,int) + getNombreColeccin(): String + getPosicin(): int DeColeccin CONCEPTOS BSICOS DE PROGRAMACIN CON JAVA Tercera edicin LUZ ELENA JIMNEZ COLLAZOS UNIVERSIDAD ICESI 18 } public boolean isLujo(){ return lujo; } } public class DeColeccin extends Libro { private String nombreColeccin; private int posicin; public DeColeccin (String nombre, String uno, String dos, int ao, boolean lujo,String coleccin, int laPosicin) { super(nombre, uno, dos, ao, lujo); /** siempre se invoca el constructor de la clase padre, y la forma de invocarlo es con la palabra reservada super. Si se omite, java invoca el constructor del padre sin parmetros, as que si la clase padre no tiene constructor sin parmetros se genera un error al compilar. */ nombreColeccin = coleccin; posicin = laPosicin; } public String getNombreColeccin(){ return nombreColeccin; } public int getPosicin(){ return posicin; } }
4.6 Otros tpicos referentes a la herencia.
Cuando se empez a tratar el tema de la herencia en java, se dijo que en este lenguaje la herencia era obligatoria, es decir que todas las clases tienen una clase padre, excepto Object que es, finalmente, la clase padre de todas. Pero el lenguaje tiene algunas otras definiciones interesantes que deben tenerse en cuenta al abordar el tema de la herencia. Es a estas definiciones a las cuales se har referencia en este tem: la herencia es nica, pues java no permite que una clase herede de dos o ms clases. Sin embargo, lo que si es posible es que una clase determinada sea la clase padre de tantas clases como se requiera. la herencia no tiene relacin con el encapsulamiento. Es decir, no importa si una clase define un atributo, o un mtodo, como privado, las clases que hereden de ella lo tendrn, pero no podrn hacer referencia a l. la herencia permite definir clases que inician una jerarqua, pero no tienen toda la informacin para ser instanciadas. Es decir, una clase puede indicar que tiene la estructura necesaria para que un grupo de clases inicien el proceso de especializacin a partir de ella, pero que ella no debe poder ser instanciada. Para esto se emplea la palabra reservada abstract, en el encabezado de la clase. Por ejemplo, y haciendo referencia al ejemplo de las figuras geomtricas, se tendra:
public abstract class FigurasGeomtricas{
CONCEPTOS BSICOS DE PROGRAMACIN CON JAVA Tercera edicin LUZ ELENA JIMNEZ COLLAZOS UNIVERSIDAD ICESI 19 Con lo cual se estara indicando que la clase FigurasGeomtricas, inicia una jerarqua de clases, pero que cualquier figura geomtrica que se desee crear, debe tener ms informacin de la que contiene dicha clase. En estas clases es posible tener servicios con su comportamiento definido, as como servicios cuyo comportamiento se deja pendiente. Al respecto es interesante anotar, que estas clases pueden definir que todas las clases que hereden directamente de ellas deben prestar uno o varios servicios, pero que cada una tiene que hacerlo de una forma diferente; para ello se usa la misma palabra reservada, abstract, pero en el encabezado del mtodo. Solo las clases que se definen como abstract pueden tener mtodos abstract. Por ejemplo, para indicar que los mtodos rea y permetro los debe definir cada clase que herede de figura geomtrica, se tendra:
public abstract double rea(); public abstract double permetro();
En las dos definiciones anteriores, es importante resaltar, que un mtodo abstracto no puede llevar cuerpo, es decir, no puede asociarse a l llaves ({ }), sino que debe terminar su encabezado con punto y coma (;). Qu diferencia existe entre definir una clase como abstract y definir un mtodo como abstract?
Implica el que una clase sea definida como abstract, que todos sus mtodos deben ser definidos como abstract? Implica el que un mtodo sea definido como abstract, que la clase a la que pertenece deba ser definida como abstract?
Por ltimo, estn las clases que no pueden tener hijos, estas clases, al contrario de las clases abstractas, terminan una jerarqua de herencia determinada. La forma en la cual se definen es utilizando la palabra reservada final en el encabezado de la clase. Por ejemplo, y haciendo referencia al mismo ejemplo pero ahora para definir la clase TringuloRectngulo, se tendra:
public final class TringuloRectngulo{ CONCEPTOS BSICOS DE PROGRAMACIN CON JAVA Tercera edicin LUZ ELENA JIMNEZ COLLAZOS UNIVERSIDAD ICESI 20
Haciendo un smil al tem anterior, tambin existen mtodos final, pero estos mtodos se pueden definir en cualquier clase. Y el significado que tiene esta definicin es que deshabilita el polimorfismo por sobreescritura; es decir si una clase define un mtodo como final, las clases que hereden de ella no podrn sobrescribirlo. Siguiendo con el ejemplo de las figuras geomtricas, si se pidiera que el mtodo permetro definido por la clase Tringulo, no pudiera ser cambiado en ninguna clase que heredara de ella, se tendra:
public final double permetro(){ // Y aqu se escribira el cdigo correspondiente. } Qu diferencia existe entre definir una clase como final y definir un atributo como final?
4.7 Relaciones de asociacin entre clases.
Cuando se present el tema correspondiente a la definicin de atributos de instancia, se dijo que estos atributos podan ser valores o podan ser objetos. Sin embargo en los ejercicios que hasta ahora se han presentado los atributos han sido de algn tipo bsico, o cadenas de caracteres String .
Dentro de los conceptos de orientacin a objetos, no hay ninguna restriccin referente a esto, y de hecho se espera que este tipo de relaciones entre objetos de diferentes clases se d, es decir que un objeto se forme acoplando objetos de otras clases. De manera que es frecuente encontrar que las clases establecen relaciones entre ellas, permitiendo que sus objetos tengan atributos, que a su vez sern objetos. Para lograr lo que se acaba de describir se deben establecer las relaciones entre las clases y, adems, dar las caractersticas correspondientes a cada relacin, es decir la direccin y la cardinalidad.
Referente a la direccin, se debe indicar que las relaciones entre clases pueden ser bidireccionales, es decir cada objeto de la ClaseA tendr, como uno de sus atributos, un objeto de la ClaseB; y cada objeto de la ClaseB tendr, como uno de sus atributos, un objeto de la ClaseA. Pero tambin puede ser que la relacin sea unidireccional, en cuyo caso se entendera que cada objeto de la ClaseA tendr, como uno de sus atributos, un objeto de la ClaseB; pero a los objetos de la ClaseB no les interesa saber con qu objeto de la ClaseA estn relacionados. Debe tenerse presente que, para todas las situaciones presentadas en este prrafo, la ClaseA y la ClaseB pueden ser, realmente, la misma clase. Es decir una clase CONCEPTOS BSICOS DE PROGRAMACIN CON JAVA Tercera edicin LUZ ELENA JIMNEZ COLLAZOS UNIVERSIDAD ICESI 21 puede definir que uno de los atributos que tendrn los objetos que a partir de ella se creen, puede ser otro objeto de esa misma clase.
La forma de representar la direccin de la relacin, en UML es:
Bidireccional: Cada objeto de la ClaseA tendr, como atributo, un objeto de la ClaseB, y viceversa.
Unidireccional: Cada objeto de la ClaseA tendr, como atributo, un objeto de la ClaseB, pero los objetos de la ClaseB no establecern relacin con los objetos de la ClaseA.
Describa, al menos, dos situadiones en las cuales existan objetos que requieren conocer al otro; y otras dos en las cuales slo a uno de ellos le interese conocer al otro.
Referente a la cardinalidad, se puede establecer que la relacin se establece con una cantidad determinada de objetos de la otra clase, o que se establece con un nmero de objetos, que no puede ser menor al mnimo dado, ni mayor al mximo, es decir se establece un rango.
Cantidad nica: Cada objeto de la ClaseA tendr, como atributo, dos objetos de la ClaseB, y cada objeto de la ClaseB tendr, como atributo, un objeto de la ClaseA.
Cada objeto de la ClaseA tendr, como atributo, dos objetos de la ClaseB, pero a los objetos de la ClaseB no les interesa establecer relacin con los objetos de la ClaseA.
Rango: Cada objeto de la ClaseA tendr, como atributo, cero o un objeto de la ClaseB, cada objeto de la ClaseB tendr, como atributo, entre uno y cinco objetos de la ClaseA. ClaseB ClaseA ClaseB ClaseB ClaseA ClaseB ClaseB ClaseA ClaseB 2 1 ClaseA ClaseB 2 CONCEPTOS BSICOS DE PROGRAMACIN CON JAVA Tercera edicin LUZ ELENA JIMNEZ COLLAZOS UNIVERSIDAD ICESI 22
Cada objeto de la ClaseA tendr, como atributo, cero o un objeto de la ClaseB, pero a los objetos de la ClaseB no les interesa establecer relacin con los objetos de la ClaseA.
Hay un caso especial, que es el caso en el cual no se sabe cuntos objetos de la otra clase contendr, en esa situacin se emplea el asterisco (*), y se entiende que cada objeto de la ClaseA, tendr entre 0 y muchos objetos de la ClaseB como sus atributos.
Piense en situaciones, de la vida diaria, en las que un objeto deba conocer o tener algn tipo de relacin con un nmero determinado de objetos de otro tipo.
4.8 El concepto de igualdad entre objetos.
Antes de entrar a definir el concepto de igualdad entre objetos se quiere presentar lo que ocurre en memoria cuando se crean variables asociadas a los tipos bsicos y variables asociadas a los tipos referenciados. Para esto, suponga que se tiene el siguiente cdigo:
System.out.println(Digite la longitud del lado del cuadrado); int lado = lector.nextInt); Cuadrado unCuadrado = new Cuadrado(lado); /** Se crea un objeto Cuadrado, cuyo lado tendr la longitud digitada por el usuario, se le referencia a travs de la variable unCuadrado, y se asumir para todos los casos que el usuario digita 5 */ Cuadrado otroCuadrado = new Cuadrado(lado); /** Se crea otro objeto Cuadrado, cuyo lado tendr tambin la longitud digitada por el usuario, y se le referenciar a travs de la variable otroCuadrado */ Cuadrado elltimo = unCuadrado; /** Se crea una nueva referencia a un objeto Cuadrado, y se le asigna la misma referencia que tiene unCuadrado. */ int otraLongitud = lado; System.out.println(lado y otraLongitud son iguales? +(otraLongitud== lado)); System.out.print(unCuadrado y otroCuadrado son iguales? ); ClaseA ClaseB ClaseA ClaseB 1..5 0..1 0..1 ClaseA ClaseB * CONCEPTOS BSICOS DE PROGRAMACIN CON JAVA Tercera edicin LUZ ELENA JIMNEZ COLLAZOS UNIVERSIDAD ICESI 23 System.out.println(unCuadrado==otroCuadrado); System.out.println(unCuadrado y elltimo son iguales? +(unCuadrado == elltimo));
El resultado que se obtendra sera:
lado y otraLongitud son iguales? true unCuadrado y otroCuadrado son iguales? false unCuadrado y elltimo son iguales? true
Por qu? A continuacin se presenta lo que ocurrira en la memoria del computador:
El operador de la igualdad, verifica si lo contenido por las variables es igual o no. En el ejemplo presentado, se ve que las variables que se definen a travs de los tipos bsicos, contienen los valores que se les asignan, pero las variables que se definen a travs de los tipos referenciados, contienen una referencia a un objeto. As que cuando se emplea el operador de la igualdad, con variables asociadas a tipos referenciados, lo que se est verificando es si ambas variables hacen referencia al mismo objeto; y no si los objetos referenciados son iguales. Por ellos unCuadrado es igual a elltimo, pero no es igual a otroCuadrado.
Pero el comportamiento descrito en los prrafos anteriores no es, siempre, el que se desea; pues la mayora de las veces lo que se desea es verificar si los objetos pertenecen a la misma clase y, adems, si sus atributos tienen los mismos valores. Esto es posible, pero no empleando estos operadores, sino utilizando un mtodo que haga esta comparacin. Para ilustrar esto, y siguiendo con el ejemplo presentado, suponga que a la clase Cuadrado se le agregan los siguientes mtodos:
public boolean equals(Object otro) { if (otro instanceof Cuadrado){ Cuadrado elOtro = (Cuadrado) otro; return elOtro.getLado() == getLado(); } return false; } CONCEPTOS BSICOS DE PROGRAMACIN CON JAVA Tercera edicin LUZ ELENA JIMNEZ COLLAZOS UNIVERSIDAD ICESI 24 /** Las lneas anteriores corresponden a la definicin del mtodo que verifica la igualdad entre objetos. En esta definicin, lo primero que se hace es verificar que el objeto con el cual se le pide a un objeto compararse, se haya creado a travs de la clase Cuadrado, si esto es as, se devuelve el resultado de comparar la longitud de sus lados. De no ser instancia de esta clase, se devuelve que no son iguales: false. */ public void setLado(double nuevaLongitud) { lado = nuevaLongitud; } /** Las lneas anteriores corresponden a la definicin de un mtodo que permite modificar la longitud del lado de un cuadrado. */
y el cdigo a travs del cual se hacen las comparaciones entre los cuadrados creados, en el cdigo previamente presentado, se cambia de esta forma:
System.out.print(unCuadrado y otroCuadrado son iguales? ); System.out.println(unCuadrado.equals(otroCuadrado)); System.out.print(unCuadrado y elltimo son iguales? ); System.out.println(unCuadrado.equals(elltimo));
El resultado que se obtendra, en este caso, sera:
unCuadrado y otroCuadrado son iguales? true unCuadrado y elltimo son iguales? true
Lo que pas fue que ahora java compar los objetos referenciados por unCuadrado y por otroCuadrado, empleando la forma de comparacin que se le dio, y en este caso esa forma retorna que son iguales, pues ambos objetos tienen el mismo valor en su atributo lado. Entonces, qu pasara si se cambiara la longitud del lado a unCuadrado?
unCuadrado.setLado(15);
El resultado que se obtendra al efectuar la comparacin, sera:
unCuadrado y otroCuadrado son iguales? false unCuadrado y elltimo son iguales? true
pues estos dos objetos ya no tienen el mismo valor en su atributo lado.
El mtodo equals se define en la clase Object, y todos los objetos lo tienen. En este caso se redefini, qu tipo de polimorfismo es este?
Cree que siempre se debe modificar la forma de verificar la igualdad entre objetos?
CONCEPTOS BSICOS DE PROGRAMACIN CON JAVA Tercera edicin LUZ ELENA JIMNEZ COLLAZOS UNIVERSIDAD ICESI 25
Ejercicios Propuestos: 1. Explique la razn por la cual, en todas las comparaciones que se presentaron se obtuvo que unCuadrado y elltimo eran iguales. 2. Modifique la clase Crculo, que defini en ejercicio previo, agregando el mtodo que permita decir, a un objeto Crculo, si es igual a otro. Emplee como criterio de comparacin, el que pertenezcan a la misma clase y que la longitud de sus radios sea igual. 3. Modifique la clase Libro de manera que permita a un objeto Libro decir si es igual a otro. Emplee como criterio de comparacin el que pertenezcan a la misma clase y que tengan el mismo nombre. Qu pasa si a un objeto que es instancia de la clase Libro se le pide que se compare con un objeto que sea instancia de la clase DeColeccin? Es esto correcto?
4.9 Atributos y mtodos de la clase static .
Hasta ahora siempre que se ha hablado de definir atributos y mtodos, estos han estado relacionados con los objetos que se creen a partir de la definicin de la clase. Pero hay situaciones en las cuales se requiere poder contar con un servicio determinado, sin necesidad de que existan objetos de la clase que estn en capacidad de prestar este servicio; o puede ocurrir que se requiera contar con un atributo determinado que no pertenezca a ningn objeto, pero que est disponible para todos ellos. Esto es posible, y la forma de hacerlo es utilizando la palabra reservada static, en la definicin del atributo o en el encabezado del mtodo.
Ha resuelto problemas que le hayan obligado a emplear la palabra reservada static? En qu caso? Ahora que ya conoce su significado para java, podra explicar, con sus palabras, por que debi usarla en esas ocasiones?
Ejercicio Resuelto: Problema: Se necesita modificar la clase Estudiante, la cual se elabor en un ejercicio anterior, para que ahora permita saber cuntos estudiantes se han matriculado.
CONCEPTOS BSICOS DE PROGRAMACIN CON JAVA Tercera edicin LUZ ELENA JIMNEZ COLLAZOS UNIVERSIDAD ICESI 26
Diagrama de Clases:
Cdigo en java: public class Estudiante { private String cdigo; private String nombre; private int planDeEstudios; private int semestreQueCursa; private static int matriculados; public Estudiante(String elCdigo, String elNombre, int plan, int semestre){ cdigo = elCdigo; nombre = elNombre; planDeEstudios = plan; semestreQueCursa = semestre; matriculados++; // cada vez que se crea un nuevo estudiante se incrementa la cantidad de matriculados } public String getCdigo(){ return cdigo; } public static int getMatriculados(){ return matriculados; } public String getNombre(){ return nombre; } public int getPlanDeEstudios(){ return planDeEstudios; } public int getSemestreQueCursa(){ return semestreQueCursa; } public void setNombre(String nuevoNombre){ nombre = nuevoNombre; } public void setPlanDeEstudios(int nuevoPlan){ planDeEstudios = nuevoPlan; } public void setSemestreQueCursa(int nuevoSemestre){ semestreQueCursa = nuevoSemestre; } }
Ejercicio Resuelto: Problema: Se necesita crear una clase que pueda ser ejecutada, y permita crear una cantidad de estudiantes dada por el usuario. Despus de tener los estudiantes, debe permitir consultar o modificar su informacin, en ambos casos se debe pedir el cdigo del estudiante cuya informacin se quiere consultar o modificar.
+ Estudiante(String, String, int, int) + getCdigo() : String + getNombre() : String + getPlanDeEstudios() : int + getSemestreQueCursa() : int + setNombre(String) : void + setSemestreQueCursa(int) : void + setPlanDeEstudios(int) : void + getMatriculados() : int Estudiante - cdigo: String - nombre: String - planDeEstudios: int - semestreQueCursa: int - matriculados: int Tanto el atributo como el mtodo que aparecen subrayados son static. Estudiante CONCEPTOS BSICOS DE PROGRAMACIN CON JAVA Tercera edicin LUZ ELENA JIMNEZ COLLAZOS UNIVERSIDAD ICESI 27 Diagrama de Clases:
Cdigo en java: import java.util.Scanner.*; public class GestinEstudiantes { private static Estudiante[] losEstudiantes; private static Scanner = new Scanner(System.in); static { System.out.println("Con cuntos estudiantes desea trabajar?"); int cantidad = lector.nextInt(); losEstudiantes = new Estudiante[cantidad]; } public static Estudiante buscarEstudiante(String elCdigo) { for (int contador = 0; contador <= Estudiante.getMatriculados(); contador++) { if (losEstudiantes[contador] != null){ if (losEstudiantes[contador].getCdigo().equals(elCdigo)) { return losEstudiantes[contador]; } } } return null; } public static void consultarEstudiante() { System.out.println("\nDigite el cdigo del estudiante"); String cdigo = lector.nexLine(); consultarEstudiante(cdigo); } public static void consultarEstudiante(String cdigo) { Estudiante bsqueda = buscarEstudiante(cdigo); System.out.println("\nCdigo: "+cdigo); System.out.println("El nombre del estudiante es: " + bsqueda.getNombre()); System.out.println("El cdigo del plan de estudios que cursa: " + bsqueda.getPlanDeEstudios()); System.out.println("El semestre en el cual est matriculado es: "+ bsqueda.getSemestreQueCursa()); } public static void ingresarEstudiantes() { for (int contador = 0; contador < losEstudiantes.length; contador++) { System.out.println("\nDigite el cdigo del estudiante"); String cdigo = lector.nexLine(); Estudiante bsqueda = buscarEstudiante(cdigo); if (bsqueda == null) { System.out.println("Digite el nombre"); String nombre = lector.nexLine(); System.out.println("Digite el cdigo del plan de estudios"); Estudiante - cdigo: String - nombre: String - planDeEstudios: int - semestreQueCursa: int - matriculados: int + Estudiante(String,String,int,int) + setNombre(String):void + setPlanDeEstudios(int):void + setSemestreQueCursa(int):void + getCdigo():String + getNombre():String + getPlanDeEstudios():int + getSemestreQueCursa():int + getMatriculados():int
GestinEstudiantes + main(String[]):void + ingresarEstudiantes():void + buscarEstudiante(String):Estudiante + consultarEstudiante():void + modificarEstudiante():void * CONCEPTOS BSICOS DE PROGRAMACIN CON JAVA Tercera edicin LUZ ELENA JIMNEZ COLLAZOS UNIVERSIDAD ICESI 28 int planDeEstudios = lector.nextInt(); System.out.println("Digite el semestre que cursa"); int semestre = lector.nextInt(); losEstudiantes[contador] = new Estudiante(cdigo, nombre, planDeEstudios, semestre); } else { System.out.println("\nYa existe un estudiante con ese cdigo\n"); } } } public static void main(java.lang.String[] args) { ingresarEstudiantes(); Estudiante[] otro = losEstudiantes; int opcin = 0; do { do { System.out.println("\n\nMen Gestin de estudiantes"); System.out.println("1. Consultar un estudiante"); System.out.println("2. Modificar la informacin de un estudiante"); System.out.println("3. Consultar todos los estudiantes."); System.out.println("4. Terminar"); System.out.println("==> "); opcin = lector.nextInt(); }while (opcin != 1 && opcin != 2 && opcin != 3 && opcin != 4); switch (opcin){ case 1: { consultarEstudiante(); break; } case 2: { modificarEstudiante(); break; } case 3: { for (int contador = 0; contador < losEstudiantes.length; contador++){ String elCdigo = losEstudiantes[contador].getCdigo(); consultarEstudiante(elCdigo); } break; } } }while (opcin != 4); } public static void modificarEstudiante() { System.out.println("\nDigite el cdigo del estudiante"); String cdigo = lector.nexLine(); Estudiante bsqueda = buscarEstudiante(cdigo); if (bsqueda != null) { System.out.printlnt("Qu desea modificar? \n1. El nombre \n2. El plan de estudios \n3. El semestre que cursa"); int opcin = lector.nextInt(); switch (opcin){ case 1: { System.out.println("Digite el nombre correcto "); String nuevo = lector.nexLine(); bsqueda.setNombre(nuevo); break; } case 2: { System.out.println("Digite el plan de estudios correcto "); int nuevo = lector.nextInt(); bsqueda.setPlanDeEstudios(nuevo); break; } case 3: { System.out.println("Digite el semestre que cursa "); CONCEPTOS BSICOS DE PROGRAMACIN CON JAVA Tercera edicin LUZ ELENA JIMNEZ COLLAZOS UNIVERSIDAD ICESI 29 int nuevo = lector.nextInt(); bsqueda.setSemestreQueCursa(nuevo); break; } default: System.out.println("Opcin no habilitada"); } } else { System.out.println("\nNo existe estudiante con ese cdigo\n"); } } }
Es importante hacer algunas precisiones referentes al uso de atributos y mtodos static, particularmente frente a su comportamiento frente a la herencia, pues no es similar al de los atributos y mtodos de instancia.
Los atributos que son static no se heredan, se hereda el acceso a ellos. Es decir que las clases hijas podrn hacer referencia a un atributo static, definido por la clase padre, como si fuera propio, pero si llega a cambiar su valor, este cambio afectar a la clase padre y a todas las clases que hereden de ella, pues se trata de un atributo nico para todas las clases.
Referente a los mtodos es interesante resaltar que, tambin se hereda el acceso a ellos, y que dentro de la clase hija pueden utilizarse como si estuviesen definidos en ella. Qu situacin, le parece, podra ser apropiada para definir un atributo cuyo valor sea igual para todas las instancias de una clase?
Ejercicio Resuelto: Problema: Se necesita escribir el cdigo correspondiente a las clases FigurasGeomtricas y Crculo que se han discutido hasta ahora. Se requiere que el valor de la constante PI, se defina dentro de la clase FigurasGeomtricas. Cdigo en java: public abstract class FigurasGeomtricas { private final static double PI = 3.1416; public FigurasGeomtricas(){} public static double getPI (){ return PI; } public abstract double rea(); public abstract double permetro(); } public class Crculo extends FigurasGeomtricas { private double radio; public Crculo(double elRadio){ radio = elRadio; } public double rea(){ return super.getPI() * radio * radio; /** para calcular el rea se utiliza el mtodo FigurasGeomtricas.getPI(), para lo cual se emplea la palabra reservada super asociada al nombre del mtodo */ } CONCEPTOS BSICOS DE PROGRAMACIN CON JAVA Tercera edicin LUZ ELENA JIMNEZ COLLAZOS UNIVERSIDAD ICESI 30 public static double getPI(){ return 3.141592; /** esta clase requiere mayor precisin en el valor de la constante, as que define nuevamente el mtodo */ } public double permetro() { return 2 * getPI() * radio; // para el permetro se utiliza el mtodo Crculo.getPI() } }
Ejercicios Propuestos: 1. Para el siguiente cdigo, conteste las preguntas includas en l, y complete el cdigo donde se le pida. package matemtica; public class Fraccionario { private int numerador; private int denominador; private Fraccionario(int numerador, int denominador) { Por qu cree que se define el mtodo constructor privado?
this.numerador = numerador; this.denominador = denominador; } public static Fraccionario crearFraccionario(int numerador, int denominador) { Qu hace este mtodo? Explique el propsito que tiene el mtodo, no las instrucciones que lo componen.
if (denominador == 0) { return null; } return new Fraccionario(numerador, denominador); } public static Fraccionario multiplicarFraccionarios(Fraccionario uno, Fraccionario dos) { int elNumerador = uno.numerador * dos.numerador; int elDenominador = uno.denominador * dos.denominador; Fraccionario resultado = new Fraccionario(elNumerador, elDenominador); return resultado; } public static Fraccionario dividirFraccionarios(Fraccionario uno, Fraccionario dos) { int elNumerador = uno.numerador * dos.denominador; int elDenominador = uno.denominador * dos.numerador; return crearFraccionario(elNumerador, elDenominador); } private static int mnimoComnMltiplo(int primero, int otro) { if (otro == primero) return otro; int menor = otro; int mayor = primero; if (menor > mayor) { mayor = otro; menor = primero; } CONCEPTOS BSICOS DE PROGRAMACIN CON JAVA Tercera edicin LUZ ELENA JIMNEZ COLLAZOS UNIVERSIDAD ICESI 31 if (mayor % menor == 0) return mayor; for (int valor = mayor * 2; valor <= mayor * menor; valor += mayor) { if (valor % menor == 0) { return valor; } } return 0; } public static Fraccionario restaFraccionarios(Fraccionario uno,Fraccionario dos) { int elDenominador = mnimoComnMltiplo(uno.denominador,dos.denominador); int primerTrmino = (elDenominador / uno.denominador) * uno.numerador; int segundoTrmino = (elDenominador / dos.denominador) * dos.numerador; int elNumerador = primerTrmino - segundoTrmino; Fraccionario resultado = new Fraccionario(elNumerador, elDenominador); return resultado; } public static Fraccionario sumarFraccionarios(Fraccionario uno,Fraccionario dos) { int elDenominador = mnimoComnMltiplo(uno.denominador,dos.denominador); int primerTrmino = (elDenominador / uno.denominador) * uno.numerador; int segundoTrmino = (elDenominador / dos.denominador) * dos.numerador; int elNumerador = primerTrmino + segundoTrmino; Fraccionario resultado = new Fraccionario(elNumerador, elDenominador); return resultado; } public String toString() { if (denominador != 1) return (numerador + "/" + denominador); return (numerador + " "); } public int valorEntero() { if (numerador % denominador == 0) { return (numerador / denominador); } return 0; } public boolean setDenominador(int valor) { Normalmente los mtodos set no retornan nada, por qu cree que este set devuelve un valor boolean?
if (valor != 0) { denominador = valor; return true; } return false; } public void setNumerador(int valor) { numerador = valor; } public void simplifica() { int elDenominador = denominador; int elNumerador = numerador; if (elNumerador == elDenominador) { setNumerador(1); setDenominador(1); } else { if (elNumerador % elDenominador == 0) { CONCEPTOS BSICOS DE PROGRAMACIN CON JAVA Tercera edicin LUZ ELENA JIMNEZ COLLAZOS UNIVERSIDAD ICESI 32 setNumerador(elNumerador / elDenominador); setDenominador(1); } else { int divide = mximoComnDivisor(elNumerador, elDenominador); setNumerador(elNumerador / divide); setDenominador(elDenominador / divide); } } } public boolean equals(Object obj) { Este mtodo compara si dos fraccionarios son idnticos, pero 1/3 es igual a 2/6. Se debe modificar este mtodo para que, tambin, indique la igualdad cuando un fraccionario corresponde a la simplificacin del otro. ( Un nmero dividido por si mismo da 0). if (obj instanceof Fraccionario) { Fraccionario uno = (Fraccionario) obj; if (numerador == uno.numerador && denominador == uno.denominador) return true; } return false; } public int mximoComnDivisor(int unValor, int otroValor) { if (otroValor == unValor) return otroValor; int menor = otroValor; int mayor = unValor; if (menor > mayor) { mayor = otroValor; menor = unValor; } if (mayor % menor == 0) return menor; for (int valor = menor / 2; valor > 1; valor--) { if (menor % valor == 0 && mayor % valor == 0) { return valor; } } return 1; } Los mtodos que ofrece esta clase permiten sumar, restar, multiplicar y dividir dos fraccionarios (que se reciben como parmetros), y retorna un nuevo fraccionario que es el resultado; ahora, se requiere agregar los mtodos necesarios para que un fraccionario reciba otro y modifique su numerador y denominador como resultado de sumar, restar, multiplicar o dividir sus valores con los del fraccionario que recibi como parmetro. Estos deben ser los encabezados de los mtodos que se piden: public void sumarse(Fraccionario otro) {} public void restarse(Fraccionario otro) {} public void multiplicarse(Fraccionario otro){} public void dividirse(Fraccionario otro) {} } 2. La Universidad Icesi est organizando un equipo de ftbol, cuyos integrantes deben ser hombres que trabajen o estudien en ella; este equipo deber representar a la universidad en los diversos torneos a los cuales lo inviten. El director de deportes espera el anlisis completo y el software necesario para poder guardar y gestionar la siguiente informacin: "Mira la idea es que podamos formar un equipo bien 'jalao', que se va a llamar La Amenaza Verde, de l necesitamos guardar informacin acerca de cuntos jugadores hay, cuntos partidos ha jugado, cuntos ha ganado, perdido y empatado, adems de CONCEPTOS BSICOS DE PROGRAMACIN CON JAVA Tercera edicin LUZ ELENA JIMNEZ COLLAZOS UNIVERSIDAD ICESI 33 los goles a favor y en contra. De cada jugador queremos guardar el nombre, la edad, el rea de la universidad en que trabaja o el plan de estudio en que est matriculado, la posicin en que juega mejor y una posicin alternativa. Lo que requieren en este momento es: 1. Capturar la informacin de cada miembro de Icesi que quiera ser tenido en cuenta. 2. Registrar el equipo, sin la informacin de los candidatos que no fueron seleccionados. 3. Registrar un campeonato con su nombre y el nmero de partidos que debe jugar Icesi en l. 4. Registrar, al concluir el campeonato, de cada partido jugado: a) Quin fue el equipo contrario. b) Resultado del partido, incluye el marcador. c) Si Icesi hizo goles en ese partido, quien o quienes hicieron los goles. 5. Consultar, al concluir el ingreso de la informacin de un campeonato: a) Goleador del equipo, indicando si se trata de un empleado o un estudiante. b) Rendimiento (puntos obtenidos / puntos posibles) c) Cantidad de partidos empatados. 3. La empresa Disfrutemos el Ro Cauca, le ha contratado para que les ayude con el software necesario para el control de sus embarcaciones y puertos sobre el ro. Para empezar la relacin comercial, le han solicitado que elabore el diagrama de clases para la siguiente situacin: Nosotros ofrecemos dos servicios de transporte, como usted probablemente sabr, el transporte turstico y el trasporte de carga. Para atender el trasporte turstico contamos con dos tipos de embarcaciones, las sencillas que son para recorridos que no sobrepasan las cuatro horas; y las casa - barca, para el resto de recorridos, que pueden durar desde 12 horas hasta una semana. De cada embarcacin necesitamos llevar un registro, el cual debe incluir su nombre, su capacidad y la cantidad de tripulacin que requiere para un viaje. Para las sencillas la capacidad est dada por el nmero de pasajeros que pueden transportar y el costo del pasaje es idntico para todos los pasajeros; pero para las casa-barca est dada, adems de por la cantidad de pasajeros que puede alojar, por el que haya o no un cuarto exclusivo libre para la persona o grupo de personas que lo solicitan, o por el que haya o no cupo en el saln comn, el precio depende del tipo de alojamiento que la persona pida, ya que las personas que viajan en cuartos exclusivos tienen un recargo del 50% sobre el costo del pasaje. Para atender el transporte de carga se tiene un tipo nico de embarcacin, cuya capacidad est dada por la cantidad de toneladas que puede transportar, y el valor del trasporte se calcula de acuerdo al siguiente rango: 1 20 toneladas: transporte = valorTonelada * nmeroToneladas. 21 50 toneladas: tiene un descuento del 5 %. 50 100 toneladas: tiene un descuento del 10%. De estas embarcaciones necesitamos saber, tambin, su nombre, capacidad, cantidad de tripulacin y compaa de seguros que la cubre. De nuestros puertos fluviales necesitamos saber su nombre, el kilmetro del ro en el cual se encuentra ubicado, el responsable del puerto, la capacidad del mismo, el nivel de ocupacin en un momento determinado y el tipo de embarcacin que puede recibir. Si es un puerto para carga, necesitamos conocer la cantidad de bodegas con que cuenta y el nmero de cuartos fros, adems de saber cuntas bodegas y cuartos fros estn disponibles en un momento determinado. De los puertos tursticos se requiere CONCEPTOS BSICOS DE PROGRAMACIN CON JAVA Tercera edicin LUZ ELENA JIMNEZ COLLAZOS UNIVERSIDAD ICESI 34 saber cuntos restaurantes tiene y el tipo de comida que ofrece cada uno, adems de saber si tiene tienda de recuerdos o no. Tambin le han pedido que, de acuerdo al diagrama de clases que elabor escriba el cdigo en java, correspondiente al manejo de los puertos. 4. Como hoy en da hay tantas posibilidades de intercambios comerciales entre los pases, se ha decidido crear la Asamblea de los Pases Amigables. En esta asamblea los pases podrn establecer lazos de cooperacin entre ellos. Los organizadores de la asamblea quieren tener la informacin de los pases que la conforman. De cada pas desean tener su nombre, extensin y nmero de habitantes. De los pases con democracia se necesita saber los aos de cada perodo de gobierno y de los otros pases se debe saber cul es el nombre de su sistema de gobierno. Para todos los pases es importante saber con cules pases comercia, cules son los productos que exporta y cules los productos que importa. Los productos tienen un nombre, descripcin, precio e indicacin de si pagan impuestos o no. Con todo muy bien organizado se podr insertar la informacin de nuevos pases que se inscriban en la asamblea, consultar la informacin de un pas y definir nuevos convenios entre pases. La Asamblea de Pases Amigables desea evaluar su habilidad en la programacin OO, para saber si lo contrata para trabajar con ellos, y por esto le pedido que elabore: El diagrama de clases. El cdigo correspondiente a las clases, atributos y encabezados de los mtodos. No es necesario hacer el cdigo de los mtodos. 5. La compaa de salas de cine Cine Locura quiere organizar todo su sistema, para poder automatizar algunos de sus procesos. Un ingeniero que tiene algunos conocimientos de OO ha elaborado un diagrama de clases preliminar. Sin embargo, en este diagrama falta definir los atributos y los mtodos de la clase SalaPreferencial. Usted debe, de acuerdo con la descripcin que hay despus del diagrama de clases: Completar el diagrama de clases. Elaborar el cdigo completo de las clases SalaPreferencial y Multiplex. NO es necesario hacer el cdigo de la clase SalaNormal, pues el ingeniero que trabaja en la compaa de cine ya la elabor.
SalaNormal - nmero: int - capacidad: int - boletasVendidas: int + precioBsico: double
SalaPreferencial CONCEPTOS BSICOS DE PROGRAMACIN CON JAVA Tercera edicin LUZ ELENA JIMNEZ COLLAZOS UNIVERSIDAD ICESI 35 En esta compaa se tienen diferentes salas de cine, que pueden ser normales o preferenciales (que tienen asientos ms cmodos y cafetera interna). Todas las salas de cine tienen un nmero y la capacidad (nmero de sillas). Para cada sala tambin deben saber cuntas boletas se han vendido para una funcin. Cada sala preferencial tiene un tipo de cafetera, que puede ser de alimentos dietticos, de comidas de sal o de dulces. Adems, algunas de las salas preferenciales pueden tener sonido ambiental. El valor de cada boleta depende de la sala. En las salas normales se cobra el precio bsico (que es igual para todas las salas), pero si la sala tiene ms de 100 asientos se da un 10% de descuento. En las salas preferenciales se cobra el precio bsico ms un incremento de $200 si tiene sonido ambiental, y otro incremento dependiendo del tipo de cafetera: para las cafeteras dietticas hay un incremento de $500, para las de dulce $300 y para las de sal $400. Los administradores del mltiplex desean que el sistema les permita: ingresar la informacin de nuevas salas, consultar la informacin de una sala dado su nmero, decir cuando se va a iniciar una venta de boletas para una sala de cine y vender boletas. Para vender boletas se debe preguntar el nmero de la sala y mostrar el nmero de asientos disponibles (se descuenta de la capacidad las boletas vendidas). Luego se pregunta al usuario cuntas boletas desea y se le muestra el valor total a pagar. Si el usuario acepta se deben incrementar el nmero de boletas vendidas para esa sala. Cuando se dice que se iniciar la venta de boletas para una sala se debe volver a cero el nmero de boletas vendidas, pues ahora comienza una nueva funcin.
4.10 Diseo de medios interactivos Ejercicios resueltos Los siguientes ejercicios pueden ser ejecutados en Processing, han sido elaborados en la versin 0135, la ltima versin se puede descargar gratuitamente desde http://processing.org
4.10.1 Mtodos
4.10.1.1 Ejemplo de mtodo para dibujar figura con posicin como parmetro /* Repeticin de figuras - mtodos Dibujar anillos compuestos de crculos que se repitan con desplazamiento diagonal en el lienzo. Autor: Juan Carlos Muoz - Marzo 2008 Para: Fundamentos de programacin para el diseo - Universidad Icesi Descripcin: Se utiliza un mtodo para definir una figura y sus parmetros para dibujarla variando la posicin. **No se utilizan tildes ni caracteres especiales por compatibilidad con Processing en Mac */ Anlisis Variables globales: 1. cantidadFiguras 2. separacionFiguras 3. posicionInicial setup(): variables globales utilizadas: 1, 2, 3 salidas: dibujar las figuras (lienzo) proceso: establecer el tamao de la ventana y color de fondo desde contador =0 hasta contador igual a cantidadFiguras - 1 incrementando de uno en uno Resultado obtenido CONCEPTOS BSICOS DE PROGRAMACIN CON JAVA Tercera edicin LUZ ELENA JIMNEZ COLLAZOS UNIVERSIDAD ICESI 36 llamar al mtodo anillo para dibujar la figura en posicionInicial+separacionFiguras*contador anillo(): entradas: posicionX posicionY retorno: salidas: La figura en las coordenadas (lienzo) proceso: fijar los parmetros inicializar el ngulo en 0 desde contador = 0 hasta contador igual a cantidadFiguras -1 incrementando de uno en uno calcular la posicin relativa en X y Y con seno y coseno de acuerdo al ngulo y el radio. dibujar el crculo en la posicin absoluta ms la relativa incrementar el ngulo de acuerdo a cantidadFiguras */ Cdigo // Variables int cantidadFiguras = 5,posicionInicial = 30; int separacionFiguras = 35; void setup(){ size(200,200); background(0); // Dibuja cinco veces la figura for (int cont = 0; cont < cantidadFiguras; cont++) { // Llama al mtodo que dibuja la figura con valores // aleatorios para posicin anillo (posicionInicial + separacionFiguras * cont, posicionInicial + separacionFiguras * cont); } } void anillo(int pPosX, int pPosY){ // Valores que definen la figura base int ancho = 10, cantidadCirculos = 10, radio = 20; // ngulo para recorrer la circunferencia imaginaria float angulo = 0; // Dibuja la figura y obteniendo cada posicin cartesiana for (int cont = 0; cont < cantidadCirculos; cont++) { // Calcula las posiciones en X y Y de acuerdo al ngulo int x = (int)(sin(angulo) * radio); int y = (int)(cos(angulo) * radio); ellipse(x + pPosX, y + pPosY, ancho, ancho); // Incrementa el ngulo de acuerdo a la cantidad de // crculos angulo += 2* PI / cantidadCirculos; } }
4.10.1.2 Ejemplo de mtodo para dibujar figura con posicin, tamao y color como parmetros /* Repeticin de figuras Dibujar anillos en posiciones aleatorias del lienzo, variando el color y tamao tambin aleatoriamente. Autor: Juan Carlos Muoz - Marzo 2008 Para: Fundamentos de programacin para el diseo - Universidad Icesi Descripcin: Se utiliza un mtodo para definir una figura y sus parmetros para dibujarla variando caractersticas **No se utilizan tildes ni caracteres especiales por compatibilidad con Processing en Mac */ Anlisis Resultado obtenido CONCEPTOS BSICOS DE PROGRAMACIN CON JAVA Tercera edicin LUZ ELENA JIMNEZ COLLAZOS UNIVERSIDAD ICESI 37 /* Variables globales: cantidadFiguras setup(): variables globales utilizadas: cantidadFiguras entradas: retorno: salidas: Las figuras (lienzo) proceso: establecer el tamao de la ventana y color de fondo desde contador=0 hasta contador igual a cantidadFiguras-1 incrementando de uno en uno llamar al mtodo anillo para dibujar la figura generando los valores aleatorios para posicin, tamao y color anillo(): entradas: posicionX, posicionY, escala, color retorno: salidas: La figura de acuerdo las coordenadas, escala y color (lienzo) proceso: fijar los parmetros inicializar el ngulo en 0 desde contador = 0 hasta contador igual a cantidadFiguras-1 incrementando de uno en uno calcular la posicin relativa en X y Y con seno y coseno de acuerdo al ngulo, el radio y la escala. dibujar el crculo en la posicin absoluta ms la relativa, su tamao depende de la escala incrementar el ngulo de acuerdo a cantidadFiguras */ Codigo // Variables int cantidadFiguras = 5; void setup(){ size(200,200); background(0); // Dibuja cinco veces la figura for (int cont = 0; cont < cantidadFiguras; cont++) { // Llama al mtodo que dibuja la figura con valores // aleatorios para posicin, tamao y color anillo ((int)random(2,18)*10, (int)random(2,18)*10, random(0.5,2), color(random(30,255), random(30,255), random(30,255))); } } void anillo(int pPosX, int pPosY,float pEscala, color pColor){ // Valores que definen la figura base int ancho = 10, cantidadCirculos = 10, radio = 20; // ngulo para recorrer la circunferencia imaginaria float angulo = 0; // Dibuja la figura y obteniendo cada posicin cartesiana for (int cont = 0; cont < cantidadCirculos; cont++) { // Calcula las posiciones en X y Y de acuerdo al ngulo int x = (int)(sin(angulo) * radio * pEscala); int y = (int)(cos(angulo) * radio * pEscala); fill(pColor); ellipse(x + pPosX, y + pPosY, ancho * pEscala, ancho * pEscala); // Incrementa el ngulo de acuerdo a la cantidad de // crculos angulo += 2* PI / cantidadCirculos; }
CONCEPTOS BSICOS DE PROGRAMACIN CON JAVA Tercera edicin LUZ ELENA JIMNEZ COLLAZOS UNIVERSIDAD ICESI 38 }
4.10.1.3 Ejemplo de mtodo para dibujar figura con posicin, tamao, color y forma como parmetros
/* Repeticin de figuras 3 Dibujar anillos en posiciones aleatorias del lienzo, variando el color, forma y tamao tambin aleatoriamente Autor: Juan Carlos Muoz - Marzo 2008 Para: Fundamentos de programacin para el diseo - Universidad Icesi Descripcin : Se utiliza un mtodo para definir una figura y sus parmetros para dibujarla variando forma y otros aspectos **No se utilizan tildes ni caracteres especiales por compatibilidad con Processing en Mac */ Anlisis /* Variables Globales: cantidadFiguras setup(): variables globales utilizadas: cantidadFiguras entradas: retorno: salidas: Las figuras (lienzo) proceso: establecer el tamao de la ventana y color de fondo desde contador=0 hasta contador igual cantidadFiguras-1 incrementando de uno en uno llamar al mtodo anillo para dibujar la figura generando los valores aleatorios para posicin, tamao y color anillo(): entradas: posicionX, posicionY, escala, color, forma retorno: salidas: La figura de acuerdo las coordenadas, escala y color (lienzo) proceso: fijar los parmetros calcular el valor del radio en cada dimensin dependiendo del parmetro inicializar el ngulo en 0 desde contador=0 hasta contador igual a cantidadFiguras-1 incrementando de uno en uno calcular la posicin relativa en X y Y con seno y coseno de acuerdo al ngulo, el radio y la escala. dibujar el crculo en la posicin absoluta ms la relativa, su tamao depende de la escala incrementar el ngulo de acuerdo a la cantidadFiguras */ Cdigo // Variables int cantidadFiguras = 5; void setup(){ size(200,200); background(0); // Dibuja cinco veces la figura for (int cont = 0; cont < cantidadFiguras; cont++) { // Llama al mtodo que dibuja la figura con valores // aleatorios para posicin, tamao y color anillo ((int)random(2,18)*10, (int)random(2,18)*10, random(0.5,2), color(random(30,255),random(30,255),random(30,255)), Resultado obtenido
CONCEPTOS BSICOS DE PROGRAMACIN CON JAVA Tercera edicin LUZ ELENA JIMNEZ COLLAZOS UNIVERSIDAD ICESI 39 (int)random(1,4.9)); } } void anillo(int pPosX, int pPosY,float pEscala, color pColor, int pForma){ // Valores que definen la figura base int ancho = 10; int cantidadCirculos = 10; int radio = 20; int radioX = (int)(pForma%2==0?radio:radio*1.5); int radioY = (int)(pForma/2==0?radio:radio*0.5); // ngulo para recorrer la circunferencia imaginaria float angulo = 0; // Dibuja la figura y obteniendo cada posicin cartesiana for (int cont = 0; cont < cantidadCirculos; cont++) { // Calcula las posiciones en X y Y de acuerdo al ngulo int x = (int)(sin(angulo) * radioX * pEscala); int y = (int)(cos(angulo) * radioY * pEscala); fill(pColor); ellipse(x + pPosX, y + pPosY, ancho * pEscala, ancho * pEscala); // Incrementa el ngulo de acuerdo a la cantidad de // crculos angulo += 2* PI / cantidadCirculos; } }
4.10.2 Objetos
4.10.2.1 Ejemplo de creacin de mltiples objetos a partir de una clase
/ * Bosque en crecimiento Dibujar rboles (con tringulos y rectngulos) de colores y tamaos variados que vayan creciendo conforme pasa el tiempo con desplazamiento diagonal en el lienzo. Autor: Juan Carlos Muoz - Abril 2008 Para: Fundamentos de programacin para el diseo - Universidad Icesi Descripcin: Se utiliza una clase que define los atributos del rbol y su comportamiento; son creados en el mtodo setup y modificados y mostrados en el mtodo draw **No se utilizan tildes ni caracteres especiales por compatibilidad con Processing en Mac */ //******** TAB principal ******** /* Variables globales: 1. cantidadArboles 2. arboles (arreglo) setup(): variables globales utilizadas: 1, 2 salidas: proceso: establecer el tamao de la ventana y velocidad de actualizacin desde contArbol = 0 hasta cantidadArboles incrementando de uno en uno arboles[contArbol] = nuevo Arbol con valores aleatorios draw(): variables globales utilizadas: 1, 2 salidas: dibujo de los rboles (lienzo) proceso: llamar al mtodo crecer en arboles[posicion aleatoria] desde contArbol = 0 hasta cantidadArboles incrementando de uno en uno llamar al mtodo pintar en arboles[contArbol] */ int cantidadArboles = 30; CONCEPTOS BSICOS DE PROGRAMACIN CON JAVA Tercera edicin LUZ ELENA JIMNEZ COLLAZOS UNIVERSIDAD ICESI 40 Arbol [] arboles = new Arbol[cantidadArboles]; void setup(){ size(350, 400); frameRate(5); smooth(); //Se crean todos los arboles for (int contArbol = 0; contArbol < cantidadArboles; contArbol++) { arboles[contArbol] = new Arbol((int) random(0,300), (int) random(10,280), color(200, (int) random(150,251), 123), (int) random(5,10), (int) random(10,15)); } } void draw(){ background(0); //Aleatoriamente a un rbol se lle realiza el llamado al mtodo crecer arboles[(int)random(0,cantidadArboles)].crecer(); //Se dibujan nuevamente todos los arboles for (int contArbol = 0; contArbol < cantidadArboles; contArbol++) { arboles[contArbol].pintar(); } } //******** TAB Arbol ******** * Descripcin: Define los atributos del rbol y su comportamiento permite pintarlo e incrementar el tamao * Anlisis: Atributos: 1. alturaMaxRama 2. alturaRama 3. cantidadRamas 4. colorRamas 5. posX 6. posY Arbol(int, int, color, int int): atributos utilizados: todos (excepto 1) salidas: proceso: asignar todos los atributos, excepto el 1. pintar(): atributos utilizados: todos (excepto 1) salidas: dibuja un rbol (lienzo) proceso: definir variable ancho = 10 establecer como color de relleno colorRamas desde contRama = 0 hasta cantidadRamas incrementando de uno en uno dibujar un tringulo ancho += alturaRama / 2 definir el color del tallo dibujar el tallo crecer(): atributos utilizados: 1, 2, 6 salidas: proceso: Si alturaMaxRama es mayor alturaRama alturaRama++ posY -= cantidadRama */ public class Arbol{ private int alturaMaxRama = 15; private int alturaRama; private int cantidadRamas; private color colorRamas; private int posX; private int posY; public Arbol(int pPosX, int pPosY, color pColorRamas, int pAlturaRama, int pCantidadRamas) { posX = pPosX; posY = pPosY; colorRamas = pColorRamas; alturaRama = pAlturaRama; CONCEPTOS BSICOS DE PROGRAMACIN CON JAVA Tercera edicin LUZ ELENA JIMNEZ COLLAZOS UNIVERSIDAD ICESI 41 cantidadRamas = pCantidadRamas; } public void pintar() { int ancho = 10; fill(colorRamas); for (int contRama = 0; contRama < cantidadRamas; contRama++) { triangle(posX + (cantidadRamas - contRama) * alturaRama / 4 , posY + alturaRama * (contRama + 1), posX + (cantidadRamas - contRama) * alturaRama / 4 + ancho, posY + alturaRama * (contRama + 1), posX + (cantidadRamas - contRama) * alturaRama / 4 + ancho/2, posY + alturaRama * contRama); ancho += alturaRama / 2; } fill(100, 48, 4); rect(posX + ancho / 2 - 3, posY + alturaRama * (cantidadRamas), 6,20); } public void crecer() { if (alturaMaxRama > alturaRama) { alturaRama++; posY -= cantidadRamas; } } }
Resultado obtenido
4.10.2.2 Ejemplo de creacin de una animacin utilizando mltiples objetos de una clase /* Animacin del recorrido del mouse Autor: Juan Carlos Muoz - Mayo 2008 Para: Fundamentos de programacin para el diseo - Universidad Icesi Descripcin: Se utiliza un ArrayList para almacenar cada uno de los objetos que se van creando como rastro del mouse, despus de un tiempo se animan y finalmente se borran **No se utilizan tildes ni caracteres especiales por compatibilidad con Processing en Mac */ CONCEPTOS BSICOS DE PROGRAMACIN CON JAVA Tercera edicin LUZ ELENA JIMNEZ COLLAZOS UNIVERSIDAD ICESI 42 //TAB principal /* Variables globales: 1. cuadros (ArrayList) 2. contGuardadas setup(): variables globales utilizadas: ninguna salidas: proceso: establecer el tamao de la ventana quitar las lineas draw(): variables globales utilizadas: 1 salidas: dibujo de los cuadros (lienzo) proceso: establecer el color de fondo desde contCuadros = 0 hasta tamao del ArrayList incrementando de uno en uno si (decimas de segundo mayor momentoDibujo de cuadros en posicion contCuadros +100) borrar de cuadros la posicin contCuadros sino llamar a pintar de cuadros en contCuados con apha 95 llamar a pintar de cuadros en contCuados con apha 100 mouseMoved(): variables globales utilizadas: 1 salidas: proceso: adicionar el nuevo cuadro al arreglo con las posiciones del mouse y el tiempo actual mousePressed(): variables globales utilizadas: 2 salidas: proceso: guardar una imagen jpg cada vez que se hace clic en la carpeta del proyecto, incrementando el contador */ // Se define y crea un ArrayList el cual es un arreglo de capacidad dinmica que adicional a la // capacidad de almacenar brinda unos servicios para administrar los elementos ArrayList cuadros = new ArrayList(); int contGuardadas=0; void setup() { size (350,400); noStroke(); } void draw(){ background(0); noStroke(); for (int contCuadros = 0; contCuadros<cuadros.size();contCuadros++){ //La funcin millis se obtiene la cantidad de milisegundos que han transcurrido desde el inicio if (millis()/100 > ((Cuadro)cuadros.get(contCuadros)).getMomentoDibujo()+100){ //borrar del ArrayList elementos que han estado por lo menos 10 segundos visualizados cuadros.remove(contCuadros); } else { ((Cuadro)cuadros.get(contCuadros)).pintar(95); ((Cuadro)cuadros.get(contCuadros)).pintar(100); } } } void mouseMoved() { //Se adiciona un nuevo elemento al ArrayList con las coordenadas del mouse cuadros.add(new Cuadro(mouseX, mouseY, color(140, 15, 60), (int)millis() / 100)); } void mousePressed() { saveFrame("frame"+contGuardadas++ +".jpg"); } CONCEPTOS BSICOS DE PROGRAMACIN CON JAVA Tercera edicin LUZ ELENA JIMNEZ COLLAZOS UNIVERSIDAD ICESI 43 //TAB Cuadro / * Descripcin: Define los atributos del cuadro y su comportamiento Permite pintarlo dependiendo del momento * Anlisis: Atributos: 1. colorReal 2. iteracion 3. posX 4. posY 5. momentoDibujo Cuadro(int, int, color, int): atributos utilizados: todos salidas: proceso: asignar todos los atributos, excepto el 2 de los parmetros. iteracion = 50 pintar(int): atributos utilizados: todos salidas: dibuja un cuadro (lienzo) proceso: si decimas de segundo mayor a momentoDibujo + 30 si iteracion mayor 0 fijar color de relleno colorReal-3000+iteracion *2 y apha-30 iteracion sino fijar color de relleno colorReal - 3000 y apha 30 sino fijar color de relleno colorReal y apha - 30 dibujar rectangulo con posX posY y alpha getMomentoDibujo(): */ public class Cuadro{ private color colorReal; // define la cantidad de cambios que se realizan antes de obtener el color final private int iteracion; private int posX; private int posY; private int momentoDibujo; public Cuadro (int pPosX, int pPosY, color pColorReal, int pMomentoDibujo){ posX = pPosX; posY = pPosY; colorReal = pColorReal; momentoDibujo = pMomentoDibujo; iteracion = 50; }
public int getMomentoDibujo() { return momentoDibujo; } public void pintar(int pAlpha) { //Valida si pararon 3 segundos, para iniciar la animacion del elemento if (millis() / 100 > momentoDibujo + 30){ if (iteracion > 0) { fill (colorReal - 3000 + iteracion * 2, pAlpha - 30); iteracion--; } else { fill(colorReal - 3000, pAlpha - 30); } } else { fill(colorReal, pAlpha - 30); } rect (posX+(-95+pAlpha)/2, posY+(-95+pAlpha)/2,20+100-pAlpha, 20+100-pAlpha); } }
Resultado obtenido CONCEPTOS BSICOS DE PROGRAMACIN CON JAVA Tercera edicin LUZ ELENA JIMNEZ COLLAZOS UNIVERSIDAD ICESI 44
4.10.3 Herencia
4.10.3.1 Ejemplo de utilizacin de herencia y polimorfismo para modificar la forma de dibujar los elementos
/ * Exhibicin de sillas Mostrar sillas de tres tipos diferentes, que tienen como atributos en comn los colores, altura, y posicin. Una silla mvil adicionalmente tiene una cantidad de patas. Una silla con ruedas adicionalmente tiene el color del las ruedas. Autor: Juan Carlos Muoz - Abril 2008 Para: Fundamentos de programacin para el diseo - Universidad Icesi Descripcin: Se utiliza una clase general y dos clases ms que heredan una de la otra, adicionando los nuevos atributos solicitados. Dependiendo de los atributos, se definen o sobrescriben los mtodos para dibujar las partes de objetos. Se crea un arreglo de sillas y de los colores para cambiarlos fcilmente **No se utilizan tildes ni caracteres especiales por compatibilidad con Processing en Mac */ // TAB principal /* Variables globales: 1. cantidadSillas 2. sillas (arreglo) 3. coloresBase (arreglo) 4. coloresTela (arreglo) 5. coloresRuedas (arreglo) setup(): variables globales utilizadas: todas salidas: mostrar las lneas divisorias y las sillas (lienzo) proceso: establecer el tamao de la ventana y color de fondo crear la silla 0, 1, 4 de tipo Silla crear la silla 2, 3, 5 de tipo SillaMovil crear la silla 6, 7, 8 de tipo SillaHidraulica desde contSillas = 0 hasta cantidadSillas incrementando de uno en uno llamar a pintar() en sillas[contSillas] */ int cantidadSillas = 9; Silla sillas[] = new Silla[cantidadSillas]; //Se crean los arreglos que definen los colores color coloresBase[] = {color(20,20,20),color(30,30,20),color(30,30,20),color(30,30,20)}; CONCEPTOS BSICOS DE PROGRAMACIN CON JAVA Tercera edicin LUZ ELENA JIMNEZ COLLAZOS UNIVERSIDAD ICESI 45 color coloresTela[] = {color(193,0,0),color(0,4,193),color(25,193,0),color(30,30,120)}; color coloresRuedas[] = {color(16,116,1),color(16,116,1),color(1,17,116)}; void setup () { size(400,350); background(255); noStroke(); fill(150,150,150); rect(40,310,320,10); rect(40,210,320,10); rect(40,110,320,10); rect(40,10,320,10); //Se crean todas las sillas, cada una con atributos diferentes sillas[0] = new Silla(40,270,coloresBase[0],coloresTela[0],30); sillas[1] = new Silla(130,260,coloresBase[1],coloresTela[1],40); sillas[4] = new Silla(130,170,coloresBase[0],coloresTela[0],30); sillas[2] = new SillaMovil(220,270,coloresBase[2],coloresTela[2],30,4); sillas[3] = new SillaMovil(310,260,coloresBase[3],coloresTela[3],40,4); sillas[5] = new SillaMovil(220,160,coloresBase[1],coloresTela[1],40,5); sillas[6] = new SillaHidraulica(310,170,coloresBase[2],coloresTela[2],30,4,coloresRuedas[0]); sillas[7] = new SillaHidraulica(220,60,coloresBase[2],coloresTela[2],40,4,coloresRuedas[1]); sillas[8] = new SillaHidraulica(310,70,coloresBase[3],coloresTela[3],30,4,coloresRuedas[2]); for (int contSillas = 0; contSillas < cantidadSillas; contSillas++) { sillas[contSillas].pintar(); } } //****TAB Silla /* * Descripcin: Define los atributos de la silla y su comportamiento. Permite pintarla * Anlisis: Atributos: 1. altura 2. anchoSilla 3. colorBase 4. colorTela 5. posX 6. posY Silla(int, int, color, color, int): atributos utilizados: todos (excepto 2) salidas: proceso: asignar todos los atributos. pintarAsiento(): atributos utilizados: 2, 4, 5, 6 salidas: dibujar el asiento de la silla (lienzo) proceso: establecer como color de relleno colorTela dibujar una elipse con posX, posY y anchoSilla pintarPatas(): atributos utilizados: 1, 3, 4, 5, 6 salidas: dibuja la pata de la silla (lienzo) proceso: establecer como color de relleno colorBase dibujar un rectngulo con posX, posY y altura pintar(): atributos utilizados: salidas: dibuja la silla (lienzo) proceso: llamar a pintarAsiento llamar a pintarPatas get* */ public class Silla{ private int altura; private int anchoSilla; private color colorBase; private color colorTela; CONCEPTOS BSICOS DE PROGRAMACIN CON JAVA Tercera edicin LUZ ELENA JIMNEZ COLLAZOS UNIVERSIDAD ICESI 46 private int posX; private int posY; public Silla (int pPosX, int pPosY, color pColorBase, color pColorTela, int pAltura){ anchoSilla = 50; posX = pPosX; posY = pPosY; colorBase = pColorBase; colorTela = pColorTela; altura = pAltura; } public void pintarAsiento() { fill(colorTela); ellipse(posX + anchoSilla / 2, posY + 5, anchoSilla, 10); } public void pintarPatas() { fill(colorBase); stroke(colorBase); rect (posX + anchoSilla / 2 - 3, posY + 10, 6, altura); } //Dibuja la silla sencilla public void pintar () { pintarPatas(); pintarAsiento(); } public int getPosX() { return posX; } public int getPosY() { return posY; }
public int getAnchoSilla(){ return anchoSilla; } public int getAltura() { return altura; } public int getColorTela(){ return colorTela; } public int getColorBase(){ return colorBase; } } //****TAB Silla Movil * Descripcin: Define los atributos de la silla mvil y su comportamiento, heredando de Silla. Sobrescribe el mtodo para pintar las patas * Anlisis: Atributos: 1. numeroPatas SillaMovil(int, int, color, color, int,int): atributos utilizados: 1 salidas: proceso: llamar al constructor de la clase padre asignar atributo adicional. pintarPatas(): atributos utilizados: 1 salidas: dibuja las patas de la silla (lienzo) proceso: establecer el grosor de la lnea en 4 desde contPatas = 0 hasta numeroPatas incrementando de uno en uno dibujar una linea desde el punto medio de la silla hacia abajo establecer el grosor de la linea en 1 get* */ public class SillaMovil extends Silla{ CONCEPTOS BSICOS DE PROGRAMACIN CON JAVA Tercera edicin LUZ ELENA JIMNEZ COLLAZOS UNIVERSIDAD ICESI 47 private int numeroPatas; //Constructor public SillaMovil (int pPosX, int pPosY, color pColorBase, color pColorTela,int pAltura, int pNumeroPatas) { super (pPosX, pPosY, pColorBase, pColorTela, pAltura ); numeroPatas = pNumeroPatas; } //Se cambia el mtodo pintarPatas para pintar todas las patas public void pintarPatas() { strokeWeight(4); stroke(getColorBase()); for (int contPatas = 0; contPatas < numeroPatas; contPatas++) { line(getPosX()+getAnchoSilla()/2, getPosY()+10, getPosX()+getAnchoSilla()/numeroPatas*(contPatas + 0.5), getPosY()+10+getAltura()); } strokeWeight(1); } public int getNumeroPatas(){ return numeroPatas; } } //**** TAB Silla Hidrulica * Descripcin: Define los atributos de la silla hidrulica y su comportamiento, heredando de SillaMovil. Sobrescribe el mtodo para pintar * Anlisis: Atributos: 1. colorRuedas SillaMovil(int, int, color, color, int, int, color): atributos utilizados: 1 salidas: proceso: llamar al constructor de la clase padre asignar atributo adicional. pintarRuedas(): atributos utilizados: 1 salidas: dibuja las ruedas de la silla (lienzo) proceso: establecer el color de relleno con colorRuedas desde contRuedas = 0 hasta numeroRuedas incrementando de uno en uno dibujar una elipse con la ubicacin dependiendo de contRuedas pintar() atributos utilizados: salidas: dibuja la silla (lienzo) proceso: llamar a pintar de la clase padre llamar a pintarRuedas get* */ public class SillaHidraulica extends SillaMovil{ private color colorRuedas; public SillaHidraulica (int pPosX, int pPosY, color pColorBase, color pColorTela,int pAltura, int pNumeroPatas, color pColorRuedas) { super (pPosX, pPosY, pColorBase, pColorTela, pAltura, pNumeroPatas ); colorRuedas = pColorRuedas; } public void pintarRuedas() { fill (colorRuedas); for (int contRuedas = 0; contRuedas < getNumeroPatas(); contRuedas++){ ellipse(getPosX()+getAnchoSilla()/getNumeroPatas()*(contRuedas+0.5)-3, getPosY()+10+getAltura(), 6, 6); } } CONCEPTOS BSICOS DE PROGRAMACIN CON JAVA Tercera edicin LUZ ELENA JIMNEZ COLLAZOS UNIVERSIDAD ICESI 48 //Se modifica el mtodo pintar para mostrar tambin las ruedas public void pintar() { super.pintar(); pintarRuedas(); } } Resultado obtenido
Ejercicios propuestos Los siguientes ejercicios se proponen para ser realizados en Processing. Se sugiere primero realizar el anlisis y posteriormente escribir el cdigo.
4.10.4 Mtodos Disee una figura que pueda ser elaborada a partir de uno o varios elementos simples. Elabore un mtodo para dibujar cada uno de los elementos simples que va a requerir. Posteriormente elabore un mtodo que dibuje la figura haciendo uso de los mtodos inicialmente definidos. Finalmente realice una animacin de una o varias de estas figuras realizando cambios en los parmetros desde el mtodo draw al mtodo que dibuja las figuras.
4.10.5 Objetos Crear una hilera de hormigas arrieras que caminan estrictamente una detrs de la otra. La primera hormiga de la hilera desde una esquina de la pantalla en forma lineal hasta otra esquina, las dems debern seguir en orden a su predecesora hasta que todas salgan de la pantalla. Cada hormiga debe ser una instancia de la clase hormiga. Aunque todas las hormigas son hijas de la clase hormiga, no deben ser idnticas, deben existir variaciones en sus atributos, por ejemplo unas pueden ser ms negritas que otras, o tener patas ms largas que otras o simplemente ser ms gorditas que las otras.