CONCEPTOS BÁSICOS DE PROGRAMACIÓN CON JAVA – Tercera edición

LUZ ELENA JIMÉNEZ COLLAZOS UNIVERSIDAD ICESI
1
4 Conceptos Básicos de Programación Orientada a Objetos.

4.1 Programación Orientada a Objetos

La programación orientada a objetos, se basa en que una situación puede ser
modelada, y los problemas que se presenten en su interior resueltos, mediante la
utilización de objetos de clases existentes o que deben ser creadas. En este libro,
en los capítulos previos, se han presentado problemas cuya solución ha requerido
el uso de objetos creados a partir de clases que trae java; por ello, este capítulo
estará dedicado a la identificación objetos, cuyo comportamiento, creación y
relaciones se definirá a través de clases que se aprenderán 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 características y, además, estar en capacidad de prestar servicios.
Liste algunas de las clases, cuyos objetos ha utilizado en el código que hasta ahora ha
elaborado. Incluya, también, los métodos 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.
Solución:
Objeto: mi perro
Características: Tiene color: Es negro y blanco.
Tiene una raza: Es Shih Tzu.
Servicio: Juega con los niños.
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 características y servicios para el color rojo.
CONCEPTOS BÁSICOS DE PROGRAMACIÓN CON JAVA – Tercera edición
LUZ ELENA JIMÉNEZ COLLAZOS UNIVERSIDAD ICESI
2
Solución: Esto no es posible, ya que no es una unidad que posea características, ni preste
servicios, o sea que no es un objeto. El color rojo bien podría ser una característica de un
objeto determinado.

Ejercicio Propuesto
Seleccione cuales de las siguientes menciones corresponden a objetos.

Mención
¿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 cafetería 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 fútbol

Ejemplo:
A continuación se presenta un ejercicio, en el cual se trabaja con diferentes objetos, para
llegar a identificar algunas de las características que ellos presentan, este ejercicio se
retomará a lo largo del capítulo, así que se pide al lector prestar mucha atención.

Se está trabajando con una compañía que quiere producir un software para que la gente
pueda trabajar con figuras geométricas de diferentes tipos, así que se requiere que se
describa la siguiente figura geométrica:
1












"Se trata de un triángulo, cuyo lado base mide 3 centímetros y su lado altura mide 4 centímetros.
Además uno de sus ángulos es recto, por lo cual se puede afirmar que se trata de un triángulo
rectángulo. Para los triángulos 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
geometría 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 BÁSICOS DE PROGRAMACIÓN CON JAVA – Tercera edición
LUZ ELENA JIMÉNEZ COLLAZOS UNIVERSIDAD ICESI
3
por la longitud de la altura - 4 cm. - y esto dividido entre 2. O sea que este triángulo tiene un área
de 6 cm
2
. Además como es un triángulo rectángulo se sabe que su hipotenusa - el lado cuya
longitud desconocemos - se calcula como la raíz cuadrada de la suma de los cuadrados de los
catetos - que son los lados cuyas longitudes conocemos, o sea que la hipotenusa de este triángulo,
mide 5 centímetros -. También se podría calcular su perímetro, que sería la suma de las longitudes
de sus lados, en este caso 3 cm. + 4 cm. + 5 cm. = 12 centímetros. "

Al revisar el párrafo anterior, se puede identificar que las características que se
mencionan para esta figura geométrica son:
• la longitud de sus lados.
• el ángulo de uno de sus vértices.

y los servicios:
• el contar con un método para calcular su área.
• el contar con un método para calcular su perímetro.
• el contar con un método para calcular la longitud de su hipotenusa.

Y ahora se pide describir esta figura:










"Se trata de un triángulo, que tiene un lado que mide 3 centímetros, de los otros dos lados se
desconoce su longitud. Sin embargo, se nos dice que su altura es de 4 centímetros. Además los
dos lados, cuya longitud se desconoce, parecen medir lo mismo, así que parece ser un triángulo
isósceles. Como sigue siendo un triángulo 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
triángulo también tiene un área de 6 cm
2
. Su perímetro también 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 línea desde el punto más alto al centro de la base, este triángulo estará formado por
dos triángulos rectángulos unidos, y la longitud de sus catetos se conoce (cateto uno = 1.5
centímetros, cateto dos = 4 centímetros), 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
centímetros (que es la raíz cuadrada de (1.5
2
+ 4
2
)). Con esta información se puede obtener el
perímetro como la suma de 4.27 centímetros + 4.27 centímetros + 3 centímetros = 11.54
centímetros."

En esta figura se identifican estas características:
• la longitud de su base: 3 centímetros.
• la longitud de su altura: 4 centímetros.

y servicios:
• el método para calcular su área.
• el método para calcular el perímetro.
• el método para obtener la longitud de sus lados, a partir de su base y altura.
3 cm.
4 cm.
CONCEPTOS BÁSICOS DE PROGRAMACIÓN CON JAVA – Tercera edición
LUZ ELENA JIMÉNEZ COLLAZOS UNIVERSIDAD ICESI
4

Ahora una figura realmente diferente:
















"Se trata de un círculo, que tiene un radio de 2 centímetros. Al ser un círculo, 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 centímetros, en este caso -. O sea que este círculo tiene un área de
12.5664 centímetros cuadrados. Los círculos también tiene un perímetro, y la fórmula para
obtenerlo es 2π por la longitud del radio, o sea que el perímetro de este círculo es 12.5664
centímetros"

De lo cual se puede decir que la característica que se presenta de esta figura es:
• la longitud de su radio: 2 centímetros.

y sus servicios:
• el método para calcular su área.
• el método para calcular el perímetro
¡Sigue prestando estos servicios! - aunque lo haga de forma diferente -

Por último se requiere la descripción de la siguiente figura:












"Se trata de un cuadrado, que tiene como longitud de lado 3 centímetros. Para los cuadrados la
fórmula para calcular el área se reduce a elevar al cuadrado la longitud de su lado, o sea que en
este caso correspondería a 3
2
, o sea que sería 9 centímetros cuadrados, y el perímetro se calcula
3 cm.
3 cm.
radio: 2 cm.
CONCEPTOS BÁSICOS DE PROGRAMACIÓN CON JAVA – Tercera edición
LUZ ELENA JIMÉNEZ COLLAZOS UNIVERSIDAD ICESI
5
multiplicando la longitud del lado por 4, o sea que este cuadrado tendría como perímetro 12
centímetros."

Y las características de esta figura, según la descripción, son:
• la longitud de su lado: 3 centímetros.

y sus servicios:
• el método para calcular su área.
• el método para calcular su perímetro.
De nuevo presta estos servicios, y también lo hace en forma diferente a las figuras
vistas anteriormente.

Si se revisan las descripciones presentadas hasta ahora, ¿qué cosas se tienen en común
estas figuras geométricas?

• en cuanto a características:

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
perímetro
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 podría decir que:
• las figuras geométricas tienen un nombre.
• permiten calcular un área
• permiten calcular un perímetro.

Pero también se podría decir que las figuras uno y dos tienen varias cosas en común
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 podría afirmar que toda figura geométrica tiene un nombre, un área y un
perímetro, también se podría decir que algunas figuras geométricas tienen una base, una
altura y pueden calcular la longitud de la hipotenusa.

CONCEPTOS BÁSICOS DE PROGRAMACIÓN CON JAVA – Tercera edición
LUZ ELENA JIMÉNEZ COLLAZOS UNIVERSIDAD ICESI
6
Después de estos ejercicios se debe tratar de volver a la definición de lo que es un
objeto, y se podría decir que un objeto es la unidad básica con la cual se trabaja
en programación orientada a objetos. Esta unidad contiene una información, y a
partir de esta información el objeto está en capacidad de prestar una serie de
servicios que le pueden ser solicitados. La información que de él se guarda, lo que
hasta ahora se ha presentado como características, se conoce como sus atributos
y los servicios que puede prestar se denominan métodos. Es importante dejar
presente el hecho de que los atributos son las características 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 características para los objetos casa; después dé algunos
ejemplos de los valores que podrían tomar.
Solución: Algunas de las características de los objetos casa son:
• Número de pisos.
• Número de habitaciones.
• Cantidad de baños.
• Cantidad de parqueaderos.
• Si está dentro de una unidad.

Y, algunos de los valores que podrían tomar estas características son:

Número
de pisos

Número de
habitaciones
Cantidad de
baños
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 párrafo de qué tipo de objetos se está hablando, y
mencione, al menos, cinco características que se presenten de ellos.

Se conoce a los Reyes Magos a aquellos que, guiados por una estrella, fueron de Oriente a Belén para adorar
al Niño Jesús. El Evangelio de San Mateo narra la ofrenda de oro, incienso y mirra, hecha a Dios Niño, recién
nacido, por tres poderosos y sabios peregrinos.
Así, la tradición popular ha ido perfilando las figuras de los tres oferentes, a quienes el evangelista llama
Magos, aunque la exégesis les niega condición real. Fue San Cesáreo de Arlés quien, en el s. VI, así los
clasificó extendiéndose entonces por la Cristiandad el apelativo.
CONCEPTOS BÁSICOS DE PROGRAMACIÓN CON JAVA – Tercera edición
LUZ ELENA JIMÉNEZ COLLAZOS UNIVERSIDAD ICESI
7
De su país de origen, sólo dice San Mateo que procedían de Oriente; los testimonios más antiguos de la
Iglesia de Siria y de los padres griegos afirman que procedían de Persia, donde, como es sabido, existía la
casta de los magos o astrólogos. Otros hablan de Caldea, de donde surgió la astrología. También se remonta
al s. V la suposición 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 Collectánea, recogido en la tradición 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 pleitesía la Epifanía y la Teofanía: manifestación, revelación de Dios, y a modo
de primicia en la conversión de los gentiles. La estrella que con su fulgor guió a los Reyes Magos, fue luz
milagrosa, no astro natural, y aunque la Epifanía se celebra por la Iglesia pocos días después de la Natividad,
el 6 de enero, parece ser que entre ambos hechos medió más tiempo, acaso más de un año.
De los regalos que ofrecieron los Reyes al Niño, procede la costumbre española y, por ende, de muchos
países iberoamericanos, de los obsequios a los pequeños en la fecha precitada. En otros países cumplen
análoga misión en los días navideños otros personajes santos o laicos, como Santa Claus o San Nicolás de
Bari, en Holanda, que, según la tradición, llega de España; y el norte de Europa adoptó la figura laica de un
anciano grueso y bonachón, de cabello, barba y bigote blancos y vestido de rojo (al que los franceses, que
han adoptado esta costumbre, llaman Papa Noel), cuyo símbolo es el árbol, como el belén o nacimiento lo es
de los Reyes Magos.
2


Además de los atributos y métodos que hasta ahora se han identificado en los
diferentes objetos que se han presentado, es muy importante mencionar que los
objetos tienen algo más, 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, aún si todos los
atributos tienen los mismos valores y están 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? ¿Cómo
se puede diferenciar cuál es el de cada uno? La forma más sencilla es por su
ubicación, se podría pensar que cada lapicero está en poder de su dueño. Así la
identidad de estos lapiceros no está dada por el valor que toma ninguna de sus
características, ni por los servicios que están en capacidad de prestar; en este
caso su identidad está dada por su ubicación.

En conclusión, se puede decir que un objeto puede tener una o varias
características, o atributos, puede prestar unos servicios, pero ahora se sabe que
también 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 través de la cual se define para un objeto determinado
cuáles son las características que se deben conocer, o qué servicios se puede
esperar que ese objeto determinado preste. Esta es la función de las clases.


2
Dicionario Enciclopédico Espasa. Tomado de la página web: yaviennlosreyes.com – Web de los Reyes
Magos de Oriente.
CONCEPTOS BÁSICOS DE PROGRAMACIÓN CON JAVA – Tercera edición
LUZ ELENA JIMÉNEZ COLLAZOS UNIVERSIDAD ICESI
8
Las clases son el patrón que define qué tendrá un objeto y qué servicios estará en
capacidad de prestar; de manera que los objetos no podrían existir si no existieran
las clases. Las clases permiten la creación de los objetos, pues no sólo definen
qué tiene que tener cada objeto que pertenezca a ella, sino que guarda la
información requerida para que cada uno de ellos sea capaz de prestar los
servicios que de él se requieren. También 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 función definir cómo será la creación de cada uno de ellos; este
método se denomina el constructor. De lo anterior se puede concluir que no
podrían 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:
• ¿Podría existir el Deportivo Huila si no existieran los equipos de fútbol?
• ¿Podría existir Donald, si no existieran los dibujos animados?
• ¿Habría podido existir Laika, si los perros no existieran?









4.4 Clases en java
3
.

Java es un lenguaje de programación orientado a objetos, por ello dentro del
lenguaje las construcciones básicas son las clases. De hecho, hasta el momento
cada vez que se ha elaborado código para resolver los problemas propuestos, se
ha incluido en este código la sentencia:


3
Se incluye, en el Apéndice B de este material, la descripción de todos los elementos que pueden
manejarse al definir clases en Java. Se recomienda que ante cualquier duda se revise dicho documento.
CONCEPTOS BÁSICOS DE PROGRAMACIÓN CON JAVA – Tercera edición
LUZ ELENA JIMÉNEZ COLLAZOS UNIVERSIDAD ICESI
9
public class ResolviendoProblemas {

Con ella se está diciendo que se empieza la definición de una clase. Sin embargo,
en los códigos elaborados hasta ahora no se han creado objetos de estas clases,
ello tiene un razón 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 máquina 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 definición y utilización 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 Definición 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 tendrán
4
, de qué
tipo serán 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 básicos o un tipo referenciado.
Describa, usando sus palabras, los elementos fundamentales para definir un atributo
de instancia.







4
En este material se trabajarán los atributos con la visibilidad mínima, es decir como privados.
CONCEPTOS BÁSICOS DE PROGRAMACIÓN CON JAVA – Tercera edición
LUZ ELENA JIMÉNEZ COLLAZOS UNIVERSIDAD ICESI
10







4.4.2 Definición de métodos de instancia en java.

Java permite que cada clase defina qué métodos deben estar en capacidad de
prestar los objetos que a partir de ella se creen, para lo cual se debe decir qué
visibilidad tendrán
5
, qué retornaran, el nombre que se les quiere dar y, entre
paréntesis, los parámetros que debe recibir para poder prestar el servicio que se
pide; en este orden. Aquí es importante aclarar que se denomina parámetro a los
valores que se pasa a un método 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
trabajarán en el método, java no establece ninguna restricción referente a la
cantidad de parámetros que puede definir un método.
Describa, usando sus palabras, los elementos fundamentales para definir un método
de instancia.












Ejercicio Resuelto:
Problema: Se necesita escribir, en java, una clase llamada Cuadrado, que permita definir
objetos con las características identificadas:
• longitud de su lado.
y que estén en capacidad de prestar estos servicios:
• calcular su área.
• calcular su perímetro.
Solución: Lo primero que debe hacerse es mostrar en un Diagrama de Clases
6
, la
información que se requiere de los objetos que se crearán a partir de la clase, y describir
los métodos que se deben ofrecer.


5
En este material se trabajarán los métodos, por lo general, con la visibilidad máxima, es decir como
públicos.
6
Herramienta de diagramación 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 cuántos sean. Por ejemplo, sería incorrecto definir más de un atributo para
guardar el número de la cédula, en la clase Persona, aún sabiendo que se van a crear muchos
objetos Persona, con cédula diferente.

En adelante, el proceso de análisis que se haga consistirá en la elaboración del Diagrama de
Clases y la descripción de los métodos que las clases involucradas en la solución del problema
contengan.
CONCEPTOS BÁSICOS DE PROGRAMACIÓN CON JAVA – Tercera edición
LUZ ELENA JIMÉNEZ COLLAZOS UNIVERSIDAD ICESI
11
Diagrama de Clases:

Descripción de métodos:
área: No recibe nada como parámetro.
Retorna el valor del área del cuadrado: lado * lado:
perímetro: No recibe nada como parámetro.
Retorna el valor del perímetro del cuadrado: 4 * lado.
Código en java:
public class Cuadrado {
private double lado;
/** La línea anterior define el único atributo que tendrán los objetos que a partir de esta
clase se creen; lado, de tipo double. */
public Cuadrado(double longitudLado) {
lado = longitudLado; }
/** Las líneas anteriores corresponden a la definición del método constructor. */
public double área() {
return (lado * lado); }
/** Las líneas anteriores corresponden a la definición del método área. */
public double perímetro() {
return (4 * lado); }
/** Las líneas anteriores corresponden a la definición del método perímetro. */
}

Ejercicio Propuesto:
Problema: Se necesita escribir, en java, una clase llamada Círculo, que permita definir
objetos con las características identificadas:
• longitud de su radio.
y que estén en capacidad de prestar estos servicios:
• calcular su área.
• calcular su perímetro.




Cuadrado
- lado: double

+ Cuadrado(double)
+ área():double
+ perímetro():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
métodos.
CONCEPTOS BÁSICOS DE PROGRAMACIÓN CON JAVA – Tercera edición
LUZ ELENA JIMÉNEZ COLLAZOS UNIVERSIDAD ICESI
12
Análisis:
• Diagrama de Clases:










• Descripción de métodos:










• Código en java:
























CONCEPTOS BÁSICOS DE PROGRAMACIÓN CON JAVA – Tercera edición
LUZ ELENA JIMÉNEZ COLLAZOS UNIVERSIDAD ICESI
13
Ejercicio Resuelto:
¿Ahora, y haciendo referencia a la clase Cuadrado, si alguien quisiera conocer la
dimensión del lado de un objeto cuadrado, podría éste dársela? No, pues la clase a la
cual el objeto pertenece, no posee ningún método que permita conocer la longitud del
lado. Para permitir que esto se haga, se debe adicionar al código que se presentó en el
ejercicio anterior el siguiente código:
public double getLado() {
return lado; }

Por convención, entre los programadores que trabajan con java, se acostumbra
que los métodos que retornarán el valor contenido en un atributo del objeto
reciban como nombre get seguido del nombre del atributo: getLado, en este caso.
También existen la convención de que el método 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 común que un cuadrado cambie la longitud de su lado, pero
si se hubiese requerido debería 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 método
para retornar el valor sería isMayorDeEdad y el tipo de dato retornado sería
boolean.

Ejercicios Propuestos:
1. Se necesita adicionar a la clase Círculo un método que permita conocer la longitud de
su radio.
Análisis:
• Diagrama de Clases:










• Descripción del método:





• Código en java del método:

CONCEPTOS BÁSICOS DE PROGRAMACIÓN CON JAVA – Tercera edición
LUZ ELENA JIMÉNEZ COLLAZOS UNIVERSIDAD ICESI
14
2. Se tiene información de muchos estudiantes y se quiere crear una clase, en java, que
permita guardar la información de ellos. De cada uno se requiere saber el código,
nombre, plan de estudios y semestre. Además 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 métodos y escribir el código en java.

Diagrama de Clases:











4.4.3 Características de la Programación Orientada a Objetos.

Los conceptos de orientación a objetos, por lo general, se presentan enmarcados
entre tres grandes características:
• abstracción: Cuando se habla de abstracción, al menos en este contexto, se
hace referencia a la capacidad de construir una estructura que contenga
información 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 máxima de abstracción es la clase,
pues es ella la que recopila la esencia de la abstracción, 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 algún atributo o servicio como suyo, es decir va a
permitir que pueda ser utilizado aún 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 información 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
- código: String
- nombre: String
- planDeEstudios: int
- semestreQueCursa: int
+ Estudiante(String,String,int,int)
+ setNombre(String):void
+ setPlanDeEstudios(int):void
+ setSemestreQueCursa(int):void
+ getCódigo():String
+ getNombre():String
+ getPlanDeEstudios():int
+ getSemestreQueCursa():int
Al momento de realizar la abstracción de la situación que se desea modelar, es importante
tomar solamente los atributos y servicios que son relevantes a la solución que se pretende realizar.
El incluir atributos y servicios innecesarios puede hacer más compleja y confusa la solución
resultante.

CONCEPTOS BÁSICOS DE PROGRAMACIÓN CON JAVA – Tercera edición
LUZ ELENA JIMÉNEZ COLLAZOS UNIVERSIDAD ICESI
15





• herencia: Los objetos pueden heredar de otros, tanto información como
servicios, sin que esto impida que pueda contener nueva información o prestar
servicios adicionales. Igual que en el caso de la abstracción y la herencia, son
las clases quienes definen la jerarquía de herencia. Y aquí es muy importante
dejar presente que la jerarquía 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 máximo sus atributos o métodos.
De acuerdo a lo anterior, si se regresa al ejercicio de las figuras geométricas, se
puede llegar a pensar que existe una clase raíz, denominada FiguraGeométrica,
de la cual heredan las clases Triángulo, Círculo y Cuadrado; también puede
pensarse que la clase TriánguloRectángulo debería heredar de Triángulo, en
lugar de heredar, directamente, de la clase FiguraGeométrica.
Esta relación entre clases, la herencia, se representa en UML con una flecha
que termina en un triángulo vacío, el cual señala 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 información que se le proporciona para prestarlo, o sea que un mismo
servicio se puede prestar de diversas formas, dependiendo del tipo y
cantidad de información 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 información que se proporciona al utilizar un servicio se
le conoce como parámetro.
• 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.
FiguraGeométrica
Círculo Cuadrado Triángulo
TriánguloRectángulo
En la mayoría de los casos, la opción 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 solución de la situación
problemática planteada hereden de una única clase, no se puede interpretar como que en cada
caso deba haber herencia explícita, y de haberla deba haber una única clase padre.

CONCEPTOS BÁSICOS DE PROGRAMACIÓN CON JAVA – Tercera edición
LUZ ELENA JIMÉNEZ COLLAZOS UNIVERSIDAD ICESI
16
Especifique cuales de los elementos fundamentales para definir un método de
instancia pueden cambiar cuando se aplica polimorfismo a un servicio.





4.5 Características de la Programación Orientada a Objetos en java.

Cada una de las características que se mencionaron en el ítem anterior, tiene una
forma de implementación dentro de java:
• abstracción: Tal como se mencionó cuando se presentó el tema, en java las
clases permiten definir los atributos y métodos con que contará cada objeto;
constituyéndose en la forma más alta de abstracción.
• encapsulamiento: java permite definir varios niveles de encapsulamiento. Por
conveniencia en este material se trabajarán todos los atributos con el máximo
nivel de encapsulamiento, es decir se definirán todos los atributos como
privados; en cambio los métodos, por lo general, se trabajarán con el mínimo,
es decir serán públicos. Si se requiere conocer todos los niveles existentes, se
recomienda consultar el Apéndice 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 más detalle, se
recomienda consultar el Apéndice B.
Sin embargo, en las clases que se han definido hasta ahora no se indica de
quien se heredará. Esto no ha representado ningún problema debido a que el
lenguaje, cuando no se indica explícitamente 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 información
de los libros pertenecientes a la biblioteca del Señor Pérez. Él ha informado que de cada
libro desea guardar el nombre del mismo, el nombre del autor o autores, el año de edición
y si se trata de una edición de lujo o no. También ha dicho que tiene una serie de libros
que forman colecciones, en cuyo caso, además de lo anterior, requiere guardar el nombre
de la colección y el número que ocupa el libro en la colección. La única aclaración
adicional que ha hecho es que si se trata de un libro con más de dos autores, quiere
guardar el primer autor, y en el nombre del segundo debe aparecer “y otros”.







CONCEPTOS BÁSICOS DE PROGRAMACIÓN CON JAVA – Tercera edición
LUZ ELENA JIMÉNEZ COLLAZOS UNIVERSIDAD ICESI
17
Diagrama de Clases:



Descripción de métodos:
Constructor de la clase DeColección: Este método recibe tantos parámetros como
atributos tienen la clase Libro y DeColección, ya que por herencia cada objeto creado a
partir de la clase DeColección tiene los atributos definidos por la clase Libro, y se requiere
darles valor al momento de crear cada objeto.
Código en java:
public class Libro {
private String nombre;
private String autorUno;
private String autorDos;
private int añoEdición;
private boolean lujo;
public Libro(String elNombre, String uno, String dos, int año, boolean lujos){
nombre = elNombre;
autorUno = uno;
autorDos = dos;
añoEdición = año;
lujo = lujos;
}
public int getAñoEdición(){
return añoEdición;
}
public String getNombre(){
return nombre;
}
public String getAutores(){
if (autorDos == null){
return autorUno;
}
return (autorUno+" "+autorDos);
Libro
- nombre: String
- autorUno: String
- autorDos: String
- añoEdición: int
- lujo: boolean
+ Libro(String,String,String,int,boolean)
+ getNombre(): String
+ getAutores(): String
+ getAñoEdición(): int
+ isLujo(): boolean
- nombreColección: String
- posición: int
+ DeColección(String,String,String,int,
boolean,String,int)
+ getNombreColección(): String
+ getPosición(): int
DeColección
CONCEPTOS BÁSICOS DE PROGRAMACIÓN CON JAVA – Tercera edición
LUZ ELENA JIMÉNEZ COLLAZOS UNIVERSIDAD ICESI
18
}
public boolean isLujo(){
return lujo;
}
}
public class DeColección extends Libro {
private String nombreColección;
private int posición;
public DeColección (String nombre, String uno, String dos, int año, boolean lujo,String
colección, int laPosición) {
super(nombre, uno, dos, año, 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
parámetros, así que si la clase padre no tiene constructor sin parámetros se genera un
error al compilar.
*/
nombreColección = colección;
posición = laPosición;
}
public String getNombreColección(){
return nombreColección;
}
public int getPosición(){
return posición;
}
}

4.6 Otros tópicos 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 más
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 relación con el encapsulamiento. Es decir, no importa si
una clase define un atributo, o un método, como privado, las clases que
hereden de ella lo tendrán, pero no podrán hacer referencia a él.
• la herencia permite definir clases que inician una jerarquía, pero no tienen toda
la información para ser instanciadas. Es decir, una clase puede indicar que
tiene la estructura necesaria para que un grupo de clases inicien el proceso de
especialización 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
geométricas, se tendría:

public abstract class FigurasGeométricas{

CONCEPTOS BÁSICOS DE PROGRAMACIÓN CON JAVA – Tercera edición
LUZ ELENA JIMÉNEZ COLLAZOS UNIVERSIDAD ICESI
19
Con lo cual se estaría indicando que la clase FigurasGeométricas, inicia una
jerarquía de clases, pero que cualquier figura geométrica que se desee crear,
debe tener más información 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 método. Solo las
clases que se definen como abstract pueden tener métodos abstract. Por
ejemplo, para indicar que los métodos área y perímetro los debe definir cada
clase que herede de figura geométrica, se tendría:

public abstract double área();
public abstract double perímetro();

En las dos definiciones anteriores, es importante resaltar, que un método
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 método
como abstract?





¿Implica el que una clase sea definida como abstract, que todos sus métodos deben
ser definidos como abstract? ¿Implica el que un método sea definido como abstract, que
la clase a la que pertenece deba ser definida como abstract?








• Por último, están las clases que no pueden tener hijos, estas clases, al
contrario de las clases abstractas, terminan una jerarquía 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 TriánguloRectángulo, se
tendría:

public final class TriánguloRectángulo{
CONCEPTOS BÁSICOS DE PROGRAMACIÓN CON JAVA – Tercera edición
LUZ ELENA JIMÉNEZ COLLAZOS UNIVERSIDAD ICESI
20

Haciendo un símil al ítem anterior, también existen métodos final, pero estos
métodos se pueden definir en cualquier clase. Y el significado que tiene esta
definición es que deshabilita el polimorfismo por sobreescritura; es decir si una
clase define un método como final, las clases que hereden de ella no podrán
sobrescribirlo. Siguiendo con el ejemplo de las figuras geométricas, si se pidiera
que el método perímetro definido por la clase Triángulo, no pudiera ser
cambiado en ninguna clase que heredara de ella, se tendría:

public final double perímetro(){
// Y aquí se escribiría el código correspondiente.
}
¿Qué diferencia existe entre definir una clase como final y definir un atributo como
final?







4.7 Relaciones de asociación entre clases.

Cuando se presentó el tema correspondiente a la definición de atributos de
instancia, se dijo que estos atributos podían ser valores o podían ser objetos. Sin
embargo en los ejercicios que hasta ahora se han presentado los atributos han
sido de algún tipo básico, o cadenas de caracteres – String –.

Dentro de los conceptos de orientación a objetos, no hay ninguna restricción
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
serán objetos. Para lograr lo que se acaba de describir se deben establecer las
relaciones entre las clases y, además, dar las características correspondientes a
cada relación, es decir la dirección y la cardinalidad.

Referente a la dirección, 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 también puede ser que la relación sea
unidireccional, en cuyo caso se entendería 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 están relacionados. Debe
tenerse presente que, para todas las situaciones presentadas en este párrafo, la
ClaseA y la ClaseB pueden ser, realmente, la misma clase. Es decir una clase
CONCEPTOS BÁSICOS DE PROGRAMACIÓN CON JAVA – Tercera edición
LUZ ELENA JIMÉNEZ COLLAZOS UNIVERSIDAD ICESI
21
puede definir que uno de los atributos que tendrán los objetos que a partir de ella
se creen, puede ser otro objeto de esa misma clase.

La forma de representar la dirección de la relación, 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 establecerán relación 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 sólo a uno de ellos le interese conocer al otro.






Referente a la cardinalidad, se puede establecer que la relación se establece con
una cantidad determinada de objetos de la otra clase, o que se establece con un
número de objetos, que no puede ser menor al mínimo dado, ni mayor al máximo,
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 relación 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 BÁSICOS DE PROGRAMACIÓN CON JAVA – Tercera edición
LUZ ELENA JIMÉNEZ 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 relación con los objetos
de la ClaseA.




Hay un caso especial, que es el caso en el cual no se sabe cuántos objetos de la
otra clase contendrá, en esa situación 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
algún tipo de relación con un número 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 básicos
y variables asociadas a los tipos referenciados. Para esto, suponga que se tiene el
siguiente código:

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 través 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á – también – la longitud digitada por el
usuario, y se le referenciará a través de la variable otroCuadrado */
Cuadrado elÚltimo = 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 BÁSICOS DE PROGRAMACIÓN CON JAVA – Tercera edición
LUZ ELENA JIMÉNEZ COLLAZOS UNIVERSIDAD ICESI
23
System.out.println(unCuadrado==otroCuadrado);
System.out.println(“¿unCuadrado y elÚltimo son iguales? “+(unCuadrado == elÚltimo));

El resultado que se obtendría sería:

lado y otraLongitud son iguales? true
¿unCuadrado y otroCuadrado son iguales? false
¿unCuadrado y elÚltimo son iguales? true

¿Por qué? A continuación se presenta lo que ocurriría 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 través de los
tipos básicos, contienen los valores que se les asignan, pero las variables que se
definen a través 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 elÚltimo, pero no es igual a otroCuadrado.

Pero el comportamiento descrito en los párrafos anteriores no es, siempre, el que
se desea; pues la mayoría de las veces lo que se desea es verificar si los objetos
pertenecen a la misma clase y, además, si sus atributos tienen los mismos
valores. Esto es posible, pero no empleando estos operadores, sino utilizando un
método que haga esta comparación. Para ilustrar esto, y siguiendo con el ejemplo
presentado, suponga que a la clase Cuadrado se le agregan los siguientes
métodos:

public boolean equals(Object otro) {
if (otro instanceof Cuadrado){
Cuadrado elOtro = (Cuadrado) otro;
return elOtro.getLado() == getLado();
}
return false;
}
CONCEPTOS BÁSICOS DE PROGRAMACIÓN CON JAVA – Tercera edición
LUZ ELENA JIMÉNEZ COLLAZOS UNIVERSIDAD ICESI
24
/** Las líneas anteriores corresponden a la definición del método que verifica la igualdad
entre objetos. En esta definición, lo primero que se hace es verificar que el objeto con el
cual se le pide a un objeto compararse, se haya creado a través 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 líneas anteriores corresponden a la definición de un método que permite modificar
la longitud del lado de un cuadrado. */

y el código a través del cual se hacen las comparaciones entre los cuadrados
creados, en el código 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 elÚltimo son iguales? ”);
System.out.println(unCuadrado.equals(elÚltimo));

El resultado que se obtendría, en este caso, sería:

¿unCuadrado y otroCuadrado son iguales? true
¿unCuadrado y elÚltimo son iguales? true

Lo que pasó fue que ahora java comparó los objetos referenciados por
unCuadrado y por otroCuadrado, empleando la forma de comparación 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é pasaría si se cambiara la
longitud del lado a unCuadrado?

unCuadrado.setLado(15);

El resultado que se obtendría al efectuar la comparación, sería:

¿unCuadrado y otroCuadrado son iguales? false
¿unCuadrado y elÚltimo son iguales? true

pues estos dos objetos ya no tienen el mismo valor en su atributo lado.

El método 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 BÁSICOS DE PROGRAMACIÓN CON JAVA – Tercera edición
LUZ ELENA JIMÉNEZ COLLAZOS UNIVERSIDAD ICESI
25


Ejercicios Propuestos:
1. Explique la razón por la cual, en todas las comparaciones que se presentaron se
obtuvo que unCuadrado y elÚltimo eran iguales.
2. Modifique la clase Círculo, que definió en ejercicio previo, agregando el método que
permita decir, a un objeto Círculo, si es igual a otro. Emplee como criterio de
comparación, 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 comparación 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 DeColección?
¿Es esto correcto?

4.9 Atributos y métodos de la clase – static – .

Hasta ahora siempre que se ha hablado de definir atributos y métodos, estos han
estado relacionados con los objetos que se creen a partir de la definición 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 estén en
capacidad de prestar este servicio; o puede ocurrir que se requiera contar con un
atributo determinado que no pertenezca a ningún objeto, pero que esté disponible
para todos ellos. Esto es posible, y la forma de hacerlo es utilizando la palabra
reservada static, en la definición del atributo o en el encabezado del método.

¿Ha resuelto problemas que le hayan obligado a emplear la palabra reservada static?
¿En qué caso? Ahora que ya conoce su significado para java, ¿podría 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 cuántos estudiantes se han matriculado.




CONCEPTOS BÁSICOS DE PROGRAMACIÓN CON JAVA – Tercera edición
LUZ ELENA JIMÉNEZ COLLAZOS UNIVERSIDAD ICESI
26

Diagrama de Clases:














Código en java:
public class Estudiante {
private String código;
private String nombre;
private int planDeEstudios;
private int semestreQueCursa;
private static int matriculados;
public Estudiante(String elCódigo, String elNombre, int plan, int semestre){
código = elCódigo;
nombre = elNombre;
planDeEstudios = plan;
semestreQueCursa = semestre;
matriculados++;
// cada vez que se crea un nuevo estudiante se incrementa la cantidad de matriculados
}
public String getCódigo(){
return código; }
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. Después de tener los estudiantes, debe
permitir consultar o modificar su información, en ambos casos se debe pedir el código del
estudiante cuya información se quiere consultar o modificar.

+ Estudiante(String, String, int, int)
+ getCódigo() : String
+ getNombre() : String
+ getPlanDeEstudios() : int
+ getSemestreQueCursa() : int
+ setNombre(String) : void
+ setSemestreQueCursa(int) : void
+ setPlanDeEstudios(int) : void
+ getMatriculados() : int
Estudiante
- código: String
- nombre: String
- planDeEstudios: int
- semestreQueCursa: int
- matriculados: int
Tanto el atributo como el método
que aparecen subrayados son
static.
Estudiante
CONCEPTOS BÁSICOS DE PROGRAMACIÓN CON JAVA – Tercera edición
LUZ ELENA JIMÉNEZ COLLAZOS UNIVERSIDAD ICESI
27
Diagrama de Clases:

Código en java:
import java.util.Scanner.*;
public class GestiónEstudiantes {
private static Estudiante[] losEstudiantes;
private static Scanner = new Scanner(System.in);
static {
System.out.println("¿Con cuántos estudiantes desea trabajar?");
int cantidad = lector.nextInt();
losEstudiantes = new Estudiante[cantidad];
}
public static Estudiante buscarEstudiante(String elCódigo) {
for (int contador = 0; contador <= Estudiante.getMatriculados(); contador++) {
if (losEstudiantes[contador] != null){
if (losEstudiantes[contador].getCódigo().equals(elCódigo)) {
return losEstudiantes[contador];
}
}
}
return null;
}
public static void consultarEstudiante() {
System.out.println("\nDigite el código del estudiante");
String código = lector.nexLine();
consultarEstudiante(código);
}
public static void consultarEstudiante(String código) {
Estudiante búsqueda = buscarEstudiante(código);
System.out.println("\nCódigo: "+código);
System.out.println("El nombre del estudiante es: " + búsqueda.getNombre());
System.out.println("El código del plan de estudios que cursa: " +
búsqueda.getPlanDeEstudios());
System.out.println("El semestre en el cual está matriculado es: "+
búsqueda.getSemestreQueCursa());
}
public static void ingresarEstudiantes() {
for (int contador = 0; contador < losEstudiantes.length; contador++) {
System.out.println("\nDigite el código del estudiante");
String código = lector.nexLine();
Estudiante búsqueda = buscarEstudiante(código);
if (búsqueda == null) {
System.out.println("Digite el nombre");
String nombre = lector.nexLine();
System.out.println("Digite el código del plan de estudios");
Estudiante
- código: String
- nombre: String
- planDeEstudios: int
- semestreQueCursa: int
- matriculados: int
+ Estudiante(String,String,int,int)
+ setNombre(String):void
+ setPlanDeEstudios(int):void
+ setSemestreQueCursa(int):void
+ getCódigo():String
+ getNombre():String
+ getPlanDeEstudios():int
+ getSemestreQueCursa():int
+ getMatriculados():int

GestiónEstudiantes
+ main(String[]):void
+ ingresarEstudiantes():void
+ buscarEstudiante(String):Estudiante
+ consultarEstudiante():void
+ modificarEstudiante():void
*
CONCEPTOS BÁSICOS DE PROGRAMACIÓN CON JAVA – Tercera edición
LUZ ELENA JIMÉNEZ COLLAZOS UNIVERSIDAD ICESI
28
int planDeEstudios = lector.nextInt();
System.out.println("Digite el semestre que cursa");
int semestre = lector.nextInt();
losEstudiantes[contador] = new Estudiante(código, nombre, planDeEstudios,
semestre);
} else {
System.out.println("\nYa existe un estudiante con ese código\n");
}
}
}
public static void main(java.lang.String[] args) {
ingresarEstudiantes();
Estudiante[] otro = losEstudiantes;
int opción = 0;
do {
do {
System.out.println("\n\nMenú Gestión de estudiantes");
System.out.println("1. Consultar un estudiante");
System.out.println("2. Modificar la información de un estudiante");
System.out.println("3. Consultar todos los estudiantes.");
System.out.println("4. Terminar");
System.out.println("==> ");
opción = lector.nextInt();
}while (opción != 1 && opción != 2 && opción != 3 && opción != 4);
switch (opción){
case 1:
{ consultarEstudiante();
break; }
case 2:
{ modificarEstudiante();
break; }
case 3:
{ for (int contador = 0; contador < losEstudiantes.length; contador++){
String elCódigo = losEstudiantes[contador].getCódigo();
consultarEstudiante(elCódigo);
}
break; }
}
}while (opción != 4);
}
public static void modificarEstudiante() {
System.out.println("\nDigite el código del estudiante");
String código = lector.nexLine();
Estudiante búsqueda = buscarEstudiante(código);
if (búsqueda != null) {
System.out.printlnt("¿Qué desea modificar? \n1. El nombre \n2. El plan de estudios
\n3. El semestre que cursa");
int opción = lector.nextInt();
switch (opción){
case 1:
{ System.out.println("Digite el nombre correcto ");
String nuevo = lector.nexLine();
búsqueda.setNombre(nuevo);
break; }
case 2:
{ System.out.println("Digite el plan de estudios correcto ");
int nuevo = lector.nextInt();
búsqueda.setPlanDeEstudios(nuevo);
break; }
case 3:
{ System.out.println("Digite el semestre que cursa ");
CONCEPTOS BÁSICOS DE PROGRAMACIÓN CON JAVA – Tercera edición
LUZ ELENA JIMÉNEZ COLLAZOS UNIVERSIDAD ICESI
29
int nuevo = lector.nextInt();
búsqueda.setSemestreQueCursa(nuevo);
break; }
default: System.out.println("Opción no habilitada");
}
} else {
System.out.println("\nNo existe estudiante con ese código\n");
}
}
}

Es importante hacer algunas precisiones referentes al uso de atributos y métodos
static, particularmente frente a su comportamiento frente a la herencia, pues no es
similar al de los atributos y métodos de instancia.

Los atributos que son static no se heredan, se hereda el acceso a ellos. Es decir
que las clases hijas podrán 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 métodos es interesante resaltar que, también se hereda el acceso
a ellos, y que dentro de la clase hija pueden utilizarse como si estuviesen definidos
en ella.
¿Qué situación, le parece, podría ser apropiada para definir un atributo cuyo valor
sea igual para todas las instancias de una clase?




Ejercicio Resuelto:
Problema: Se necesita escribir el código correspondiente a las clases FigurasGeométricas
y Círculo que se han discutido hasta ahora. Se requiere que el valor de la constante PI, se
defina dentro de la clase FigurasGeométricas.
Código en java:
public abstract class FigurasGeométricas {
private final static double PI = 3.1416;
public FigurasGeométricas(){}
public static double getPI (){
return PI; }
public abstract double área();
public abstract double perímetro();
}
public class Círculo extends FigurasGeométricas {
private double radio;
public Círculo(double elRadio){
radio = elRadio; }
public double área(){
return super.getPI() * radio * radio;
/** para calcular el área se utiliza el método FigurasGeométricas.getPI(),
para lo cual se emplea la palabra reservada super asociada al nombre del método */
}
CONCEPTOS BÁSICOS DE PROGRAMACIÓN CON JAVA – Tercera edición
LUZ ELENA JIMÉNEZ COLLAZOS UNIVERSIDAD ICESI
30
public static double getPI(){
return 3.141592;
/** esta clase requiere mayor precisión en el valor de la constante, así que define
nuevamente el método */
}
public double perímetro() {
return 2 * getPI() * radio;
// para el perímetro se utiliza el método Círculo.getPI()
}
}

Ejercicios Propuestos:
1. Para el siguiente código, conteste las preguntas incluídas en él, y complete el código
donde se le pida.
package matemática;
public class Fraccionario {
private int numerador;
private int denominador;
private Fraccionario(int numerador, int denominador) {
¿Por qué cree que se define el método constructor privado?


this.numerador = numerador;
this.denominador = denominador;
}
public static Fraccionario crearFraccionario(int numerador, int denominador) {
¿Qué hace este método? Explique el propósito que tiene el método, 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 mínimoComúnMúltiplo(int primero, int otro) {
if (otro == primero)
return otro;
int menor = otro;
int mayor = primero;
if (menor > mayor) {
mayor = otro;
menor = primero;
}
CONCEPTOS BÁSICOS DE PROGRAMACIÓN CON JAVA – Tercera edición
LUZ ELENA JIMÉNEZ 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 = mínimoComúnMúltiplo(uno.denominador,dos.denominador);
int primerTérmino = (elDenominador / uno.denominador) * uno.numerador;
int segundoTérmino = (elDenominador / dos.denominador) * dos.numerador;
int elNumerador = primerTérmino - segundoTérmino;
Fraccionario resultado = new Fraccionario(elNumerador, elDenominador);
return resultado;
}
public static Fraccionario sumarFraccionarios(Fraccionario uno,Fraccionario dos) {
int elDenominador = mínimoComúnMúltiplo(uno.denominador,dos.denominador);
int primerTérmino = (elDenominador / uno.denominador) * uno.numerador;
int segundoTérmino = (elDenominador / dos.denominador) * dos.numerador;
int elNumerador = primerTérmino + segundoTérmino;
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 métodos 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 BÁSICOS DE PROGRAMACIÓN CON JAVA – Tercera edición
LUZ ELENA JIMÉNEZ COLLAZOS UNIVERSIDAD ICESI
32
setNumerador(elNumerador / elDenominador);
setDenominador(1);
} else {
int divide = máximoComúnDivisor(elNumerador, elDenominador);
setNumerador(elNumerador / divide);
setDenominador(elDenominador / divide);
}
}
}
public boolean equals(Object obj) {
Este método compara si dos fraccionarios son idénticos, pero 1/3 es igual a 2/6. Se debe
modificar este método para que, también, indique la igualdad cuando un fraccionario corresponde
a la simplificación del otro. ( Un número 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 máximoComúnDivisor(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 métodos que ofrece esta clase permiten sumar, restar, multiplicar y dividir dos
fraccionarios (que se reciben como parámetros), y retorna un nuevo fraccionario que es el
resultado; ahora, se requiere agregar los métodos 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 parámetro.
Estos deben ser los encabezados de los métodos 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 fútbol, 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 análisis completo y el software necesario para poder guardar y gestionar la
siguiente información:
"Mira la idea es que podamos formar un equipo bien 'jalao', que se va a llamar La
Amenaza Verde, de él necesitamos guardar información acerca de cuántos jugadores
hay, cuántos partidos ha jugado, cuántos ha ganado, perdido y empatado, además de
CONCEPTOS BÁSICOS DE PROGRAMACIÓN CON JAVA – Tercera edición
LUZ ELENA JIMÉNEZ 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
posición en que juega mejor y una posición alternativa.
Lo que requieren en este momento es:
1. Capturar la información de cada miembro de Icesi que quiera ser tenido en cuenta.
2. Registrar el equipo, sin la información de los candidatos que no fueron
seleccionados.
3. Registrar un campeonato con su nombre y el número de partidos que debe jugar
Icesi en él.
4. Registrar, al concluir el campeonato, de cada partido jugado:
a) Quién 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 información 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 Río Cauca”, le ha contratado para que les ayude con el
software necesario para el control de sus embarcaciones y puertos sobre el río.
Para empezar la relación comercial, le han solicitado que elabore el diagrama de
clases para la siguiente situación:
“Nosotros ofrecemos dos servicios de transporte, como usted probablemente sabrá, el
transporte turístico y el trasporte de carga.
Para atender el trasporte turístico 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 embarcación necesitamos llevar un registro, el cual debe incluir su
nombre, su capacidad y la cantidad de tripulación que requiere para un viaje. Para las
sencillas la capacidad está dada por el número de pasajeros que pueden transportar y
el costo del pasaje es idéntico para todos los pasajeros; pero para las casa-barca está
dada, además 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 salón común, 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 embarcación, 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 * númeroToneladas.
• 21 – 50 toneladas: tiene un descuento del 5 %.
• 50 – 100 toneladas: tiene un descuento del 10%.
De estas embarcaciones necesitamos saber, también, su nombre, capacidad, cantidad
de tripulación y compañía de seguros que la cubre.
De nuestros puertos fluviales necesitamos saber su nombre, el kilómetro del río en el
cual se encuentra ubicado, el responsable del puerto, la capacidad del mismo, el nivel
de ocupación en un momento determinado y el tipo de embarcación que puede recibir.
Si es un puerto para carga, necesitamos conocer la cantidad de bodegas con que
cuenta y el número de cuartos fríos, además de saber cuántas bodegas y cuartos fríos
están disponibles en un momento determinado. De los puertos turísticos se requiere
CONCEPTOS BÁSICOS DE PROGRAMACIÓN CON JAVA – Tercera edición
LUZ ELENA JIMÉNEZ COLLAZOS UNIVERSIDAD ICESI
34
saber cuántos restaurantes tiene y el tipo de comida que ofrece cada uno, además de
saber si tiene tienda de recuerdos o no.”
También le han pedido que, de acuerdo al diagrama de clases que elaboró escriba el
código en java, correspondiente al manejo de los puertos.
4. Como hoy en día hay tantas posibilidades de intercambios comerciales entre los
países, se ha decidido crear la Asamblea de los Países Amigables. En esta
asamblea los países podrán establecer lazos de cooperación entre ellos. Los
organizadores de la asamblea quieren tener la información de los países que la
conforman. De cada país desean tener su nombre, extensión y número de
habitantes. De los países con democracia se necesita saber los años de cada
período de gobierno y de los otros países se debe saber cuál es el nombre de su
sistema de gobierno.
Para todos los países es importante saber con cuáles países comercia, cuáles son los
productos que exporta y cuáles los productos que importa. Los productos tienen un
nombre, descripción, precio e indicación de si pagan impuestos o no.
Con todo muy bien organizado se podrá insertar la información de nuevos países que
se inscriban en la asamblea, consultar la información de un país y definir nuevos
convenios entre países.
La Asamblea de Países Amigables desea evaluar su habilidad en la programación OO,
para saber si lo contrata para trabajar con ellos, y por esto le pedido que elabore:
• El diagrama de clases.
• El código correspondiente a las clases, atributos y encabezados de los métodos. No
es necesario hacer el código de los métodos.
5. La compañía 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 métodos de la clase
“SalaPreferencial”. Usted debe, de acuerdo con la descripción que hay después del
diagrama de clases:
• Completar el diagrama de clases.
• Elaborar el código completo de las clases “SalaPreferencial” y “Multiplex”. NO es
necesario hacer el código de la clase “SalaNormal”, pues el ingeniero que trabaja en la
compañía de cine ya la elaboró.


















SalaNormal
- número: int
- capacidad: int
- boletasVendidas: int
+ precioBásico: double

+ SalaNormal(String, int, int)
+ toString(): String
+ getCapacidad():int
+ getBoletasVendidas():int
+ setBoletasVendidas(int):void
+ valorBoleta(): double
+ venderBoletas(int):void
Multiplex
- salas: ArrayList

+ main(String[]):void
+ iniciarVenta():void
+ venderBoletas():void
+ adicionarSala():void
+ consultarSala():void



SalaPreferencial
CONCEPTOS BÁSICOS DE PROGRAMACIÓN CON JAVA – Tercera edición
LUZ ELENA JIMÉNEZ COLLAZOS UNIVERSIDAD ICESI
35
En esta compañía se tienen diferentes salas de cine, que pueden ser normales o
preferenciales (que tienen asientos más cómodos y cafetería interna). Todas las salas
de cine tienen un número y la capacidad (número de sillas). Para cada sala también
deben saber cuántas boletas se han vendido para una función. Cada sala preferencial
tiene un tipo de cafetería, que puede ser de alimentos dietéticos, de comidas de sal o
de dulces. Además, 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 básico (que es igual para todas las salas), pero si la sala tiene más de 100
asientos se da un 10% de descuento. En las salas preferenciales se cobra el precio
básico más un incremento de $200 si tiene sonido ambiental, y otro incremento
dependiendo del tipo de cafetería: para las cafeterías dietéticas hay un incremento de
$500, para las de dulce $300 y para las de sal $400.
Los administradores del múltiplex desean que el sistema les permita: ingresar la
información de nuevas salas, consultar la información de una sala dado su número,
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 número de la sala y mostrar el
número de asientos disponibles (se descuenta de la capacidad las boletas vendidas).
Luego se pregunta al usuario cuántas boletas desea y se le muestra el valor total a
pagar. Si el usuario acepta se deben incrementar el número 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 número de boletas vendidas, pues ahora comienza una nueva función.

4.10 Diseño de medios interactivos
Ejercicios resueltos
Los siguientes ejercicios pueden ser ejecutados en Processing, han sido
elaborados en la versión 0135, la última versión se puede descargar gratuitamente
desde http://processing.org

4.10.1 Métodos

4.10.1.1 Ejemplo de método para dibujar figura con posición como
parámetro
/* Repetición de figuras - métodos
Dibujar anillos compuestos de círculos que se repitan con desplazamiento diagonal en el lienzo.
Autor: Juan Carlos Muñoz - Marzo 2008
Para: Fundamentos de programación para el diseño - Universidad Icesi
Descripción: Se utiliza un método para definir una figura y sus parámetros para dibujarla variando la
posición.
**No se utilizan tildes ni caracteres especiales por compatibilidad con Processing en Mac
*/
Análisis
Variables globales: 1. cantidadFiguras 2. separacionFiguras
3. posicionInicial
setup():
variables globales utilizadas: 1, 2, 3
salidas: dibujar las figuras (lienzo)
proceso:
establecer el tamaño de la ventana y color de fondo
desde contador =0 hasta contador igual a cantidadFiguras - 1
incrementando de uno en uno
Resultado obtenido
CONCEPTOS BÁSICOS DE PROGRAMACIÓN CON JAVA – Tercera edición
LUZ ELENA JIMÉNEZ COLLAZOS UNIVERSIDAD ICESI
36
llamar al método anillo para dibujar la figura en
posicionInicial+separacionFiguras*contador
anillo():
entradas: posicionX
posicionY
retorno:
salidas: La figura en las coordenadas (lienzo)
proceso:
fijar los parámetros
inicializar el ángulo en 0
desde contador = 0 hasta contador igual a cantidadFiguras -1
incrementando de uno en uno
calcular la posición relativa en X y Y con seno y coseno de
acuerdo al ángulo y el radio.
dibujar el círculo en la posición absoluta más la relativa
incrementar el ángulo de acuerdo a cantidadFiguras
*/
Código
// 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 método que dibuja la figura con valores
// aleatorios para posición
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 posición 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
// círculos
angulo += 2* PI / cantidadCirculos;
}
}




4.10.1.2 Ejemplo de método para dibujar figura con posición, tamaño y
color como parámetros
/* Repetición de figuras
Dibujar anillos en posiciones aleatorias del lienzo, variando el color y tamaño también aleatoriamente.
Autor: Juan Carlos Muñoz - Marzo 2008
Para: Fundamentos de programación para el diseño - Universidad Icesi
Descripción: Se utiliza un método para definir una figura y sus parámetros para dibujarla variando
características
**No se utilizan tildes ni caracteres especiales por compatibilidad con Processing en Mac
*/
Análisis Resultado obtenido
CONCEPTOS BÁSICOS DE PROGRAMACIÓN CON JAVA – Tercera edición
LUZ ELENA JIMÉNEZ COLLAZOS UNIVERSIDAD ICESI
37
/*
Variables globales: cantidadFiguras
setup():
variables globales utilizadas: cantidadFiguras
entradas:
retorno:
salidas: Las figuras (lienzo)
proceso:
establecer el tamaño de la ventana y color de fondo
desde contador=0 hasta contador igual a cantidadFiguras-1
incrementando de uno en uno
llamar al método anillo para dibujar la figura generando los
valores aleatorios para posición, tamaño y color
anillo():
entradas: posicionX, posicionY, escala, color
retorno:
salidas: La figura de acuerdo las coordenadas, escala y
color (lienzo)
proceso:
fijar los parámetros
inicializar el ángulo en 0
desde contador = 0 hasta contador igual a cantidadFiguras-1
incrementando de uno en uno
calcular la posición relativa en X y Y con seno y coseno de
acuerdo al ángulo, el radio y la escala.
dibujar el círculo en la posición absoluta más la relativa, su
tamaño 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 método que dibuja la figura con valores
// aleatorios para posición, tamaño 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 posición 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
// círculos
angulo += 2* PI / cantidadCirculos;
}



CONCEPTOS BÁSICOS DE PROGRAMACIÓN CON JAVA – Tercera edición
LUZ ELENA JIMÉNEZ COLLAZOS UNIVERSIDAD ICESI
38
}

4.10.1.3 Ejemplo de método para dibujar figura con posición, tamaño,
color y forma como parámetros

/* Repetición de figuras 3
Dibujar anillos en posiciones aleatorias del lienzo, variando el color, forma y tamaño también
aleatoriamente
Autor: Juan Carlos Muñoz - Marzo 2008
Para: Fundamentos de programación para el diseño - Universidad Icesi
Descripción : Se utiliza un método para definir una figura y sus parámetros para dibujarla variando
forma y otros aspectos
**No se utilizan tildes ni caracteres especiales por compatibilidad con Processing en Mac
*/
Análisis
/*
Variables Globales: cantidadFiguras
setup():
variables globales utilizadas: cantidadFiguras
entradas:
retorno:
salidas: Las figuras (lienzo)
proceso:
establecer el tamaño de la ventana y color de fondo
desde contador=0 hasta contador igual cantidadFiguras-1
incrementando de uno en uno
llamar al método anillo para dibujar la figura generando
los valores aleatorios para posición, tamaño y color
anillo():
entradas: posicionX, posicionY, escala, color, forma
retorno:
salidas: La figura de acuerdo las coordenadas, escala y color
(lienzo)
proceso:
fijar los parámetros
calcular el valor del radio en cada dimensión dependiendo
del parámetro
inicializar el ángulo en 0
desde contador=0 hasta contador igual a cantidadFiguras-1
incrementando de uno en uno
calcular la posición relativa en X y Y con seno y coseno de
acuerdo al ángulo, el radio y la escala.
dibujar el círculo en la posición absoluta más la relativa, su
tamaño depende de la escala
incrementar el ángulo de acuerdo a la cantidadFiguras
*/
Código
// 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 método que dibuja la figura con valores
// aleatorios para posición, tamaño 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 BÁSICOS DE PROGRAMACIÓN CON JAVA – Tercera edición
LUZ ELENA JIMÉNEZ 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 posición 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
// círculos
angulo += 2* PI / cantidadCirculos;
}
}


4.10.2 Objetos

4.10.2.1 Ejemplo de creación de múltiples objetos a partir de una clase

/ * Bosque en crecimiento
Dibujar árboles (con triángulos y rectángulos) de colores y tamaños variados que vayan creciendo
conforme pasa el tiempo con desplazamiento diagonal en el lienzo.
Autor: Juan Carlos Muñoz - Abril 2008
Para: Fundamentos de programación para el diseño - Universidad Icesi
Descripción: Se utiliza una clase que define los atributos del árbol y su comportamiento; son creados
en el método setup y modificados y mostrados en el método 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 tamaño de la ventana y velocidad de actualización
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 método crecer en arboles[posicion aleatoria]
desde contArbol = 0 hasta cantidadArboles incrementando de uno en uno
llamar al método pintar en arboles[contArbol]
*/
int cantidadArboles = 30;
CONCEPTOS BÁSICOS DE PROGRAMACIÓN CON JAVA – Tercera edición
LUZ ELENA JIMÉNEZ 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 método 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 ********
* Descripción: Define los atributos del árbol y su comportamiento permite pintarlo e incrementar el
tamaño
* Análisis:
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 triángulo 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 BÁSICOS DE PROGRAMACIÓN CON JAVA – Tercera edición
LUZ ELENA JIMÉNEZ 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 creación de una animación utilizando múltiples
objetos de una clase
/* Animación del recorrido del mouse
Autor: Juan Carlos Muñoz - Mayo 2008
Para: Fundamentos de programación para el diseño - Universidad Icesi
Descripción: Se utiliza un ArrayList para almacenar cada uno de los objetos que se van creando como
rastro del mouse, después de un tiempo se animan y finalmente se borran
**No se utilizan tildes ni caracteres especiales por compatibilidad con Processing en Mac
*/
CONCEPTOS BÁSICOS DE PROGRAMACIÓN CON JAVA – Tercera edición
LUZ ELENA JIMÉNEZ COLLAZOS UNIVERSIDAD ICESI
42
//TAB principal
/*
Variables globales: 1. cuadros (ArrayList) 2. contGuardadas
setup():
variables globales utilizadas: ninguna
salidas:
proceso:
establecer el tamaño 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 tama–o del ArrayList incrementando de uno en uno
si (decimas de segundo mayor momentoDibujo de cuadros en posicion contCuadros +100)
borrar de cuadros la posición 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 dinámica 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 función 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 BÁSICOS DE PROGRAMACIÓN CON JAVA – Tercera edición
LUZ ELENA JIMÉNEZ COLLAZOS UNIVERSIDAD ICESI
43
//TAB Cuadro
/ * Descripción: Define los atributos del cuadro y su comportamiento
Permite pintarlo dependiendo del momento
* Análisis:
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 parámetros.
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 BÁSICOS DE PROGRAMACIÓN CON JAVA – Tercera edición
LUZ ELENA JIMÉNEZ COLLAZOS UNIVERSIDAD ICESI
44


4.10.3 Herencia

4.10.3.1 Ejemplo de utilización de herencia y polimorfismo para
modificar la forma de dibujar los elementos

/ * Exhibición de sillas
Mostrar sillas de tres tipos diferentes, que tienen como atributos en común los colores, altura, y
posición. Una silla móvil adicionalmente tiene una cantidad de patas. Una silla con ruedas
adicionalmente tiene el color del las ruedas.
Autor: Juan Carlos Muñoz - Abril 2008
Para: Fundamentos de programación para el diseño - Universidad Icesi
Descripción: Se utiliza una clase general y dos clases más que heredan una de la otra, adicionando los
nuevos atributos solicitados. Dependiendo de los atributos, se definen o sobrescriben los métodos
para dibujar las partes de objetos. Se crea un arreglo de sillas y de los colores para cambiarlos
fácilmente
**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 líneas divisorias y las sillas (lienzo)
proceso:
establecer el tamaño 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 BÁSICOS DE PROGRAMACIÓN CON JAVA – Tercera edición
LUZ ELENA JIMÉNEZ 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
/*
* Descripción: Define los atributos de la silla y su comportamiento.
Permite pintarla
* Análisis:
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 rectángulo 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 BÁSICOS DE PROGRAMACIÓN CON JAVA – Tercera edición
LUZ ELENA JIMÉNEZ 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
* Descripción: Define los atributos de la silla móvil y su comportamiento, heredando de Silla.
Sobrescribe el método para pintar las patas
* Análisis:
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 línea 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 BÁSICOS DE PROGRAMACIÓN CON JAVA – Tercera edición
LUZ ELENA JIMÉNEZ 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 método 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 Hidráulica
* Descripción: Define los atributos de la silla hidráulica y su comportamiento, heredando de SillaMovil.
Sobrescribe el método para pintar
* Análisis:
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 ubicación 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 BÁSICOS DE PROGRAMACIÓN CON JAVA – Tercera edición
LUZ ELENA JIMÉNEZ COLLAZOS UNIVERSIDAD ICESI
48
//Se modifica el método pintar para mostrar también 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 análisis y posteriormente escribir el código.

4.10.4 Métodos
Diseñe una figura que pueda ser elaborada a partir de uno o varios elementos simples.
Elabore un método para dibujar cada uno de los elementos simples que va a requerir.
Posteriormente elabore un método que dibuje la figura haciendo uso de los métodos
inicialmente definidos. Finalmente realice una animación de una o varias de estas figuras
realizando cambios en los parámetros desde el método draw al método que dibuja las
figuras.

4.10.5 Objetos
Crear una hilera de hormigas arrieras que caminan estrictamente una detrás de la otra.
La primera hormiga de la hilera desde una esquina de la pantalla en forma lineal hasta
otra esquina, las demás deberán 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 idénticas, deben existir
variaciones en sus atributos, por ejemplo unas pueden ser más negritas que otras, o
tener patas más largas que otras o simplemente ser más gorditas que las otras.