Programación Orientada a Objetos - Ejercicios y ejemplos de clase
Última modificación: 14/03/12
Ejercicio 1
Partiendo del programa Vector3D.java similar a los
ejemplos elaborados en
clase:
- Añadir (en el mismo fichero) una clase Plano3D con las siguientes
operaciones:
- Un método toString para convertir un plano a forma String (para mostrarlo por
pantalla, etc.).
- Un método "perpendicular" que compruebe si el plano es o no
perpendicular a otro.
- Una segunda versión del mismo método que compruebe si el plano es
perpendicular a un vector.
- Añadir a la clase Vector3D:
- Un método "perpendicular" que compruebe si el vector es o no
perpendicular a otro.
- Una segunda versión del método para comparar con un plano.
- Añadir un par de líneas a la función main para probar estas extensiones.
Nota: para el tipo de retorno del método perpendicular, Java tiene un tipo
primitivo "boolean".
Solución: Vector3D-v2.java.
Ejercicio 2
- Añadir un método a la clase Plano3D que compruebe si es igual a otro plano.
- Describir a grandes rasgos (en una o dos frases) qué tipo de variables y
llamadas se necesitarían para implementar un programa de dibujo con un comando
para calcular el área de una figura seleccionada (ver conceptos.pdf,
transparencia 32).
Solución
- Vector3D-v3.java.
- Se necesitará declarar una variable 'seleccion' (o
similar) con la superclase Figura. Se necesitará que cada subclase de Figura
implemente su propia versión del método area ( ). Se necesitará que area ( )
esté también declarado en la clase Figura. La llamada 'seleccion.area ( )' se
resolverá en tiempo de ejecución directamente mediante ligadura dinámica, de
forma que se ejecutará la versión de area ( ) definida en la clase específica
del objeto almacenado en 'seleccion' en ese instante. Es probablemente
deseable (por complejo e innecesario) no implementar el método area en la
clase Figura, lo cual es posible declarándolo como método abstracto, lo que
implica que la clase Figura será abstracta. La consecuencia es que no se
podrán crear instancias directas de Figura, lo cual en este caso es razonable
(normalmente se dibujan siempre figuras de algún tipo contemplado en la
aplicación, pero no figuras de tipo indefinido).
Ejercicio 3
¿En qué versiones de Java se introdujeron los siguientes
elementos del lenguaje?
- Swing.
- Framework de colecciones.
- Generics.
- Enumeraciones.
- Enhanced for.
- Conversión automática entre tipos primitivos y clases
"wrapper" (p.e. int e Integer).
- Métodos printf, format.
- StringBuilder.
- Console.
Respuesta: Swing y el framework de colecciones se
introducen en la JDK 1.2. La clase Console en la 1.6, y el resto de elementos en
la 1.5.
Ejemplo 4
Ejecutar el programa Test.java. Observar los resultados
y entender bien todos los casos. Probar a introducir variaciones y observar los
cambios resultantes.
El ejemplo reúne los diversos casos que pueden darse respecto de la
sobreescritura y la sobrecarga, y el efecto de los tipos estáticos y dinámicos.
Ejercicio 5
-
Sin utilizar ninguna clase del paquete java.util, definir una
clase Lista basada en un array que permita guardar una lista de valores de
cualquier tipo, con un método para añadir un valor (al final de la lista) y otro
para extraer un valor (el último de la lista).
-
Definir una clase Circulo con centro y radio, y un método que
devuelva su área. Utilizando la clase Lista, definir una clase Grupo al que se
puedan añadir y eliminar círculos. Definir un método area en esta clase, que
devuelva la suma de las áreas de los círculos que contiene.
Nota: además de lo indicado, será útil definir en la clase
Lista un método que devuelva el número de valores que contiene, y otro método
que devuelva el valor en la posición i-ésima.
Solución: Grupo.java.
Ejercicio 6
-
Definir una clase Rectangulo con cuatro valores (left, top,
witdth, height), y un método que calcule su área.
-
Generalizar la clase Grupo del ejercicio 4 para que pueda
agrupar círculos y rectángulos indistintamente. Generalizar aún más para que
un Grupo pueda contener otros Grupos.
-
Afinar el control de acceso (declaraciones public, private,
etc.) de las variables, métodos y clases, para reforzar la separación entre
interfaz e implementación de las mismas.
-
En otra línea, no relacionada con lo anterior: ¿los métodos
estáticos tienen ligadura dinámica? ¿Por qué?
Solución
1, 2 y 3 - Grupo-v2.java.
Nota: respecto a la pregunta 3, las clases deberían ser públicas, para lo cual
deberían separarse en un fichero por clase, con el nombre de ésta.
4 - Los métodos estáticos tienen ligadura estática ya que no acceden a un objeto
(ni por tanto a su tipo dinámico), a diferencia de los métodos de instancia.
Ejercicio 7
-
Mejorar la clase Lista del ejercicio 5 para que permita
especificar el tipo de valores que contiene. Utilizar esta nueva versión para
mejorar la
clase Grupo.
-
Redefinir la clase Grupo utilizando un ArrayList tipado en lugar
de la clase Lista.
Solución
-
Grupo-v3.java.
-
Grupo-v4.java.
Ejercicio 8
-
Utilizando el método Collections.sort ( ), añadir un método
ordenar a la clase Grupo del ejercicio 6, que ordene sus figuras por área, de
menor a mayor.
-
Redefinir toString en todas las clases, para facilitar su
visualización por pantalla.
Solución: Grupo-v5.java
Ejemplo 9
Ejemplos de interfaz de usuario:
Ejemplo 10
Movimiento de un rectángulo dibujado: Dibujo.java
Ejemplo 11
Soluciones (informales) del control intermedio.
Ejemplo 12
Ejemplos de RMI
- Ejemplo de aplicación sencilla RMI con un objeto remoto calculadora: ejemplo-rmi.zip.
- Calculadora con callbacks: calculadora.zip.
- Ejemplo sencillo de paso de objetos por valor vs. stub (usuarios de una red social): social.zip.
- Ejemplo de aplicación sencilla RMI con objetos remotos para entidades y cuentas bancarias: ejemplo-banco.zip.