Escolar Documentos
Profissional Documentos
Cultura Documentos
1. Introducción Polimorfismo
2. Otros ejemplos generales de polimorfismo
3. Demostración del comportamiento polimórfico
4. Clases y métodos abstractos
5. Ejemplo práctico: sistema de nómina utilizando polimorfismo.
6. Conversión de tipos: Casting y el operador instanceof
6.1 Conversión de tipos.
6.2 Operador instanceof.
6.3 Método getClass de las clase Object y método getName de la clase Class
6.4 Demostración en el procesamiento polimórfico del operador instanceof y la conversión
descendente
6.5 Resumen de las asignaciones permitidas entre variables de la superclase y de la
subclase
Ejercicio I
1 - 130
Tema 12. Programación orientada a objetos: polimorfismo
1. Introducción Polimorfismo
El polimorfismo debe verse como una forma flexible de usar un grupo de objetos como si
fueran sólo uno.
La concordancia de tipos que hace posible el polimorfismo se puede lograr en java mediante:
• Jerarquía de Herencia
• Implementación de Interfaces
2 - 130
Tema 12. Programación orientada a objetos: polimorfismo
3 - 130
Tema 12. Programación orientada a objetos: polimorfismo
Ejemplo de polimorfismo
Supón que creamos un programa que simula el movimiento de varios tipos de animales para
un estudio biológico. Las clases Pez, Rana y Ave representan los tres tipos de animales bajo
investigación. Imagina que cada una de estas clases extiende a la superclase Animal.
Animal superclase
Cada tipo específico de Animal responde a un mensaje mover de manera única; un Pez
podría nadar un metro, una Rana podría saltar medio metro y un Ave podría volar 1 kilómetro.
El programa ejecuta el método mover de cada objeto animal de forma gneral, pero cada
objeto animal (pez, rana y ave) jecuta un método específico. Confiar en que cada objeto
sepa cómo “hacer lo correcto” (es decir, lo que sea apropiado para ese tipo de objeto)
en respuesta a la llamada al mismo método es el concepto clave del polimorfismo.
El mismo mensaje (en este caso, mover) que se envía a una variedad de objetos tiene
“muchas formas” de resultados; de aquí que se utilice el término polimorfismo.
4 - 130
Tema 12. Programación orientada a objetos: polimorfismo
Ejemplo 1.
Estas operaciones también pueden realizarse en otros objetos Cuadrilatero, como Cuadrado,
Paralelogramo y Trapezoide.
Cuadrilatero
Ejemplo 2.
Un programa mantiene un array del tipo ObjetoEspacial con referencias a objetos de las
diversas clases mencionadas. Para refrescar la pantalla, el programa envía en forma
periódica el mismo mensaje a cada objeto; a saber, dibujar. No obstante, cada objeto
responde de una manera única.
Supón que deseamos agregar objetos Mercuriano a nuestro videojuego. Para ello, debemos
crear una clase Mercuriano que extienda a ObjetoEspacial y proporcione su propia
implementación del método dibujar.
5 - 130
Tema 12. Programación orientada a objetos: polimorfismo
Superclase ClaseA
ClaseA
Sublclase ClaseB
En los ejemplos del tema 11 (herencia) se llamaron a los métodos de la superclase utilizando
variables de la superclase y a los métodos de la subclase utilizando variables de la subclase.
a1.calularX(); b1.calcularX();
Se ejecuta el método de la Se ejecuta el método de la subclase
superclase con los valores del objeto con los valores del objeto
referenciado por la variable a1 referenciado por la variable b1
6 - 130
Tema 12. Programación orientada a objetos: polimorfismo
Estas asignaciones son naturales y directas; las variables de la superclase están diseñadas
para referirse a objetos de la superclase, y las variables de la subclase están diseñadas para
referirse a objetos de la subclase.
También se puede invocar un método de la subclase a través de una variable del tipo de la
superclase, gracias a que un objeto de una subclase puede tratarse como un objeto de su
superclase, pero no viceversa.
En tiempo de ejecución, se hace una llamada a la versión correcta del método, dependiendo
de que la variable de la superclase guarde una referencia a un objeto de la superclase o a un
objeto de la sublclase.
a3= a1;
a3.metodoX(); Se ejecuta el método de la superclase
a3= b1;
a3.metodoX(); Se ejecuta el método de la subclase
7 - 130
Tema 12. Programación orientada a objetos: polimorfismo
EmpleadoPorComisión superclase
EmpleadoBaseMasComisión subclase
1º Invoque a un método de la variable de la clase (“lo normal”), sigue los siguientes pasos:
8 - 130
Tema 12. Programación orientada a objetos: polimorfismo
Cuando pensamos en un tipo de clase, asumimos que los programas crearán objetos de ese
tipo.
Como se utilizan sólo como superclases en jerarquías de herencia, nos referimos a ellas
como superclases abstractas.
9 - 130
Tema 12. Programación orientada a objetos: polimorfismo
Las clases que pueden utilizarse para instanciar objetos se llaman clases concretas.
Dichas clases proporcionan implementaciones de cada método que declaran (algunas de las
implementaciones pueden heredarse).
Las superclases abstractas son demasiado generales como para crear objetos
reales; sólo especifican lo que tienen en común las subclases.
Algunas veces las clases abstractas constituyen varios niveles de la jerarquía. En el ejemplo
el primer y segundo nivel de la jerarquia son clases abstractas:
- Figura
- FiguraBidimensional
- FiguraTridimensional
Las clases concretas Circulo, Cuadrado, Triangulo, ….. sí implementan de forma concreta el
método dibujar.
10 - 130
Tema 12. Programación orientada a objetos: polimorfismo
No todas las jerarquías de herencia contienen clases abstractas. Sin embargo, a menudo los
programadores escriben código utilizando superclases abstractas. Por ejemplo, un
programador puede escribir un método con un parámetro de un tipo de superclase abstracta.
Cuando se llama, ese método puede recibir un objeto de cualquier clase concreta que herede
en forma directa o indirecta a la superclase abstracta.
Para hacer una clase abstracta, ésta se declara con la palabra clave abstract:
Por lo general, una clase abstracta contiene uno o más métodos abstractos. Un método
abstracto tiene la palabra clave abstract en su declaración:
Una clase que contiene métodos abstractos debe declararse como clase
abstracta, aun si esa clase contiene métodos concretos (no abstractos).
11 - 130
Tema 12. Programación orientada a objetos: polimorfismo
En las jerarquías de herencia con clases abstractas las subclases heredan la “interfaz” que
representa sus métodos abstractos y la implementación de sus métodos concretos.
(2) Los atributos y los métodos concretos de una clase abstracta están sujetos a
las reglas normales de la herencia.
(5) Podemos usar superclases abstractas para declarar variables que puedan
guardar referencias a objetos de cualquier clase concreta que se derive de esas
superclases abstractas. Los programas, por lo general, utilizan dichas variables
para manipular los objetos de las subclases mediante el polimorfismo.
12 - 130
Tema 12. Programación orientada a objetos: polimorfismo
Supongamos una empresa que paga a sus empleados por semana. Los empleados son
de cuatro tipos:
- Empleados por horas (EmpleadoPorHora) que reciben un sueldo por hora y pago
por tiempo extra, todas las horas trabajadas que excedan a 40 horas.
13 - 130
Tema 12. Programación orientada a objetos: polimorfismo
La siguiente figura muestra la “interfaz” polimórfica para cada una de las cinco clases en
la jerarquía de Empleado.
- nombre
- apellidoPrimero
- apellidoSegundo
- numeroSeguroSocial
14 - 130
Tema 12. Programación orientada a objetos: polimorfismo
15 - 130
Tema 12. Programación orientada a objetos: polimorfismo
Además la clase Empleado proporciona los métodos ingresos y toString, y también los
métodos obtener y establecer que manipulan sus variables de instancia.
Es evidente que un método ingresos se aplica en forma genérica a todos los empleados.
Pero cada cálculo de los ingresos depende de la clase de cada empleado. Por lo tanto,
declaramos el método ingresos como abstract.
Cada una de las subclases redefine a ingresos con una implementación apropiada.
16 - 130
Tema 12. Programación orientada a objetos: polimorfismo
Como veremos más adelante, cada subclase de Empleado sobrescribe el método toString
para crear una representación String de un objeto de esa clase que contiene el tipo del
empleado ("empleado asalariado:", "empleado por horas:", "empleado por comisión:",
"empleado con salario base más comisión:"), seguido del resto de su información (según
tipo de empleado).
17 - 130
Tema 12. Programación orientada a objetos: polimorfismo
….
}
Un método toString que devuelve un objeto String que incluye el tipo del empleado, a
saber, "empleado asalariado: ", seguido de la información del empleado producida por el
método toString de la superclase Empleado y el salario semanal ( getSalarioSemanal).
18 - 130
Tema 12. Programación orientada a objetos: polimorfismo
….....
}
El método setSueldo asegura que sueldo sea positivo, y el método setHoras asegura que
horas esté entre 0 y 168 (el número total de horas en una semana), inclusive.
La clase EmpleadoPorHoras también incluye métodos obtener para devolver los valores
de sueldo y horas, respectivamente.
19 - 130
Tema 12. Programación orientada a objetos: polimorfismo
Y un método toString, que devuelve el tipo del empleado, a saber, "empleado por horas: ",
e información específica para ese Empleado.
http://puntocomnoesunlenguaje.blogspot.com.es/2012/08/java-printf.html
20 - 130
Tema 12. Programación orientada a objetos: polimorfismo
…..
}
Esta clase incluye a un constructor que recibe como argumentos nombre, apellido1,
apellido2, un número de seguro social, importe de ventas y una tarifa de comisión.
Y el método toString
21 - 130
Tema 12. Programación orientada a objetos: polimorfismo
…...
}
22 - 130
Tema 12. Programación orientada a objetos: polimorfismo
Para probar nuestra jerarquía de Empleado, la aplicación Nomina crea un objeto de cada
una de las cuatro clases concretas: EmpleadoAsalariado, EmpleadoPorHoras,
EmpleadoPorComision y EmpleadoBaseMasComision.
Por ejemplo:
EmpleadoPorHoras empleadoPorHoras =
new EmpleadoPorHoras( "Catalina", "Fernández", "Fernández","222-22-2222", 20.75, 45 );
EmpleadoPorComision empleadoPorComision =
new EmpleadoPorComision( "Susana", "Pómez", "Galindo", "333-33-3333", 10000, 0.06 );
EmpleadoBaseMasComision empleadoBaseMasComision =
new EmpleadoBaseMasComision( "Bob", "Nieto", "Bolaños", "444-44-4444", 5000, 0.04, 300 );
Como resultado de la vinculación dinámica, Java decide qué método toString e ingresos
llamará en tiempo de ejecución, Java procesa estas llamadas a los métodos en forma
polimórfica.
23 - 130
Tema 12. Programación orientada a objetos: polimorfismo
Resultado de la ejecución:
24 - 130
Tema 12. Programación orientada a objetos: polimorfismo
25 - 130
Tema 12. Programación orientada a objetos: polimorfismo
Ejemplo4. Jerarquía de clases, utilizamos una clase abstracta ClaseA y las clases que la
extienden ClaseB, ClaseC y ClaseD
ClaseA
//Saludo Gallego
public class ClaseB extends ClaseA{
public String saludo(){
return "Ola";
}
//Saludo Euskera
public class ClaseC extends ClaseA{
public String saludo(){
return "kaixo";
}
//Saludo Catalán
public class ClaseD extends ClaseA{
public String saludo(){
return "Hola";
}
Guarda en un array de variables de ClaseA una referencia a cada clase concreta (objeto);
y genera un número aleatorio para obtener un saludo en una determinada lengua.
Pregunta antes de escribir el método el tipo de objeto que representa la variable de la
superclase y según proceda escribe antes del saludo un mensaje (“Eu son de
Galicia”,“Sóc de catalunya” o “Ni Euskadi naiz”).
Lógicamente, y como tú bien sabes, la operativa de esta aplicación se podría resolver sin
utilizar herencia, polimorfismo y las técnicas de POO, es (como muchas otras) una
aplicación didáctica para aplicar conceptos de POO.
26 - 130
Tema 12. Programación orientada a objetos: polimorfismo
27 - 130
Tema 12. Programación orientada a objetos: polimorfismo
(ClaseB) a1;
28 - 130
Tema 12. Programación orientada a objetos: polimorfismo
El operador instanceof sirve para consultar si la referencia que guarda una variable
(objeto) es una instancia de una clase determinada
6.3 Método getClass de las clase Object y método getName de la clase Class.
El método getClass() es un método final (no puede sobreescribirse) que devuelve una
representación en tiempo de ejecución de la clase del objeto.
Este método devuelve un objeto de tipo Class que permite el uso de los métodos
definidos en la clase Class sobre ese objeto y que nos pueden dar diversa información
(nombre, el nombre de su superclase, los nombres de los interfaces que implementa, … ).
29 - 130
Tema 12. Programación orientada a objetos: polimorfismo
Realiza una nueva aplicación CopyOfNomina2, que antes de escribir los ingresos en la
estructura repetitiva “for” modifica el salario base (incrementa en un 10%) si el objeto es
del tipo EmpleadoBaseMasComision.
Realiza las pruebas para comprobar que se ha realizado el cálculo correcto en los
ingresos de todos los objetos.
30 - 130
Tema 12. Programación orientada a objetos: polimorfismo
Solución ejemplo5
}
System.out.printf( "ingresos %,.2f€", empleadoActual.ingresos() );
System.out.println();
}
31 - 130
Tema 12. Programación orientada a objetos: polimorfismo
La condición
if ( empleadoActual instanceof EmpleadoBaseMasComision ) {
32 - 130
Tema 12. Programación orientada a objetos: polimorfismo
Se produce un error:
Tampoco se puede asignar una variable de la superclase a una variable de la subclase sin
una conversión descendente explícita, es un error de compilación.
Para hacer la operación hay que utilizar la técnica DownCasting: conversión de un tipo en
otro inferior en la jerarquía de clases.
Para ello se utiliza el operador instanceof para determinar si el tipo de referencia que
guarda la variable de la superclase es un objeto del tipo EmpleadoBaseMasComision.
(EmpleadoBaseMasComision)empleadoActual
33 - 130
Tema 12. Programación orientada a objetos: polimorfismo
}
System.out.printf( "ingresos %,.2f€", empleadoActual.ingresos() );
System.out.println();
}
34 - 130
Tema 12. Programación orientada a objetos: polimorfismo
}
System.out.printf( "ingresos %,.2f€", empleadoActual.ingresos() );
System.out.println();
35 - 130
Tema 12. Programación orientada a objetos: polimorfismo
Aunque una variable de una subclase también es una variable de su superclase, las dos
variables son distintas. Las variables de la superclase no pueden hacer referencia a
métodos o atributos especificos de la subclase.
Resumen de lo que se puede y no se puede hacer con los objetos y variables de las
superclases y las subclases:
a1 = a2;
b1= b2;
36 - 130
Tema 12. Programación orientada a objetos: polimorfismo
37 - 130
Tema 12. Programación orientada a objetos: polimorfismo
Las variables que se declaran como final son constantes, no pueden modificarse una vez
que se inicializan.
Métodos final.
Definiendo un método como final conseguimos que ninguna otra clase pueda sobrescribirlo.
Un método que se declara como final en una superclase no puede sobrescribirse en una
subclase.
- Los métodos que se declaran como private son implícitamente final, ya que es
imposible sobrescribirlos en una subclase.
38 - 130
Tema 12. Programación orientada a objetos: polimorfismo
La declaración de un método final nunca puede cambiar, por lo cual todas las subclases
utilizan la misma implementación del método, y las llamadas a los métodos final se
resuelven en tiempo de compilación. Esto se le conoce como vinculación estática.
(Como el compilador sabe que los métodos final no se pueden sobrescribir, puede
optimizar los programas eliminando las llamadas a los métodos final, y reemplazándolas
con el código expandido de sus declaraciones en la ubicación de cada una de las
llamadas a los métodos).
Clase Final.
Definiendo una clase como final conseguimos que ninguna otra clase pueda
heredar de ella.
Una clase que se declara como final no puede ser una superclase (es decir, una clase no
puede extender a una clase final).
Al hacer la clase final también se evita que los programadores creen subclases que
podrían ignorar las restricciones de seguridad.
39 - 130
Tema 12. Programación orientada a objetos: polimorfismo
8. Interfaces.
En apartados anteriores hemos estudiado que una clase sólo hereda de la superclase, y
hemos aplicado el concepto de polimorfismo a la herencia.
40 - 130
Tema 12. Programación orientada a objetos: polimorfismo
De los interfaces también se hereda, aunque se suele utilizar más el término implementa
por la palabra reservada utilizada: implements.
… …
} }
Ejemplo:
41 - 130
Tema 12. Programación orientada a objetos: polimorfismo
Consideraciones importantes:
Una clase puede heredar de otra clase (como máximo de una) y a la vez heredar
de múltiples interfaces.
Si una clase implementa una interface y no implementa todos sus métodos deberá
ser definida como abstracta.
42 - 130
Tema 12. Programación orientada a objetos: polimorfismo
Un interface es una construcción similar a una clase abstracta en Java, pero con las
siguientes diferencias:
1. Para declarar una interfaz se utiliza la palabra clave interface en lugar de class o
abstract class.:
....
43 - 130
Tema 12. Programación orientada a objetos: polimorfismo
Por lo tanto un interface en Java no implementa ninguno de los métodos que declara:
ninguno de sus métodos tiene cuerpo.
Las interfaces solo pueden declarar constantes, las clases abstractas pueden declarar
datos constantes y no constantes.
No hace falta incluir las palabras public static final porque todos los campos serán
tratados como si llevaran estas palabras. Recordemos que static equivalía a “de clase” y
final a “constante”.
Las interfaces pueden ser un lugar interesante para declarar constantes que van a ser
usadas por diferentes clases en nuestros programas.
5. Una clase puede derivar de un interface de la misma manera en que puede derivar de
otra clase. No obstante, se dice que el interface se implementa (implements),
no se extiende (extends) por sus subclases. Por tanto para declarar la “herencia” de
un interface se usa la palabra clave implements en lugar de extends.
44 - 130
Tema 12. Programación orientada a objetos: polimorfismo
Una clase puede implementar uno o varios interfaces en Java, pero sólo puede extender
una clase. Implementar varios interfaces en una sola clase es lo más parecido que tiene
Java a la herencia múltiple.
Diremos que una interfaz en Java define un tipo cuyos métodos están todos sin
implementar y que resulta equivalente a una herencia múltiple (de clases abstractas) en
una clase. Si una clase implementa una interface, puede suceder:
45 - 130
Tema 12. Programación orientada a objetos: polimorfismo
46 - 130
Tema 12. Programación orientada a objetos: polimorfismo
La empresa quiere utilizar una sola aplicación de cuentas por pagar, para calcular los
ingresos de nómina que deben pagarse a cada empleado y que sirva también para
calcular el pago vencido en las facturas (por los bienes o servicios comprados).
Son operaciones (los pagos de los empleados y el pago de las facturas) que tienen que
ver con el cálculo de un importe o monto a pagar a los empleados o a los proveedores.
Para un empleado, el pago se refiere a sus ingresos. Para una factura, el pago se refiere
al coste total de los bienes o servicios listados en la factura.
¿Podemos calcular esas cosas distintas, como los pagos para los empleados y las
facturas, en forma polimórfica en una sola aplicación?
¿Ofrece Java una herramienta que permita que las clases no relacionadas implementen
un conjunto de métodos comunes (por ejemplo, un método que calcule un monto a
pagar)?
La interfaz PorPagar describe la funcionalidad de cualquier objeto que deba ser capaz de
calcular un pago y, por lo tanto, debe ofrecer un método para determinar el importe
(monto) de pago.
La declaración de una interfaz empieza con la palabra clave interface y sólo puede
contener constantes y métodos abstract.
A diferencia de las clases, todos los miembros de la interfaz deben ser public, y las
interfaces no pueden especificar ningún detalle de implementación, como las
declaraciones de métodos concretos y variables de instancia. Por lo tanto, todos los
métodos que se declaran en una interfaz son public abstract de manera implícita, y todos
los campos son implícitamente public, static y final.
47 - 130
Tema 12. Programación orientada a objetos: polimorfismo
Para utilizar una interfaz, una clase debe especificar que implementa (implements) a esa
interfaz y debe declarar cada uno de sus métodos con la firma especificada en la
declaración de la interfaz. Una clase que no implementa a todos los métodos de la interfaz
es una clase abstracta, y debe declararse como abstract.
Por lo general, una interfaz se utiliza cuando clases dispares (es decir, no relacionadas
mediante herencia) necesitan compartir métodos y constantes comunes. Esto permite
que los objetos de clases no relacionadas se procesen en forma
polimórfica; los objetos de clases que implementan la misma interfaz pueden
responder a las mismas llamadas a métodos.
A menudo, una interfaz se utiliza en vez de una clase abstract cuando no hay una
implementación predeterminada que heredar; esto es, no hay campos ni
implementaciones de métodos que heredar.
Puedes crear una interfaz que describa la funcionalidad deseada y después implementar
esta interfaz en cualquier clase que requiera esa funcionalidad.
48 - 130
Tema 12. Programación orientada a objetos: polimorfismo
Recomendación:
Al declarar un método en una interfaz, selecciona un nombre para el método que
describa su propósito en forma general, ya que el método podría implementarse
por muchas clases no relacionadas.
La jerarquía comienza con la interfaz PorPagar. UML diferencia a una interfaz de otras
clases colocando la palabra “interface” por encima del nombre de la interfaz.
49 - 130
Tema 12. Programación orientada a objetos: polimorfismo
UML expresa la relación entre una clase y una interfaz a través de una relación conocida
como realización. Se dice que una clase “realiza”, o implementa, los
métodos de una interfaz. Un diagrama de clases modela una realización como una
flecha punteada que parte de la clase que realizará la implementación, hasta la interfaz.
El diagrama indica que cada una de las clases Factura y Empleado pueden realizar (es
decir, implementar) la interfaz PorPagar.
50 - 130
Tema 12. Programación orientada a objetos: polimorfismo
La interfaz PorPagar sólo tiene un método; las interfaces pueden tener cualquier número
de métodos.
// PorPagar.java
// Declaración de la interfaz PorPagar.
public interface PorPagar {
double obtenerMontoPago(); // calcula el pago; no hay implementación
}
51 - 130
Tema 12. Programación orientada a objetos: polimorfismo
52 - 130
Tema 12. Programación orientada a objetos: polimorfismo
Modificar la clase Empleado para que implemente la interfaz PorPagar, dos cosas:
En primer lugar, indica que la clase Empleado ahora implementa a la interfaz PorPagar.
Recuerda que cuando una clase implementa a una interfaz, hace un contrato con el
compilador, en el que se establece que la clase implementará cada uno de los métodos
de la interfaz, o de lo contrario la clase se declara como abstract. Si se elige la última
opción, no necesitamos declarar los métodos de la interfaz como abstract en la clase
abstracta; ya están declarados como tales de manera implícita en la interfaz. Cualquier
subclase concreta de la clase abstracta debe implementar a los métodos de la interfaz
para cumplir con el contrato de la superclases con el compilador. Si la subclase no lo
hace, también debe declararse como abstract.
53 - 130
Tema 12. Programación orientada a objetos: polimorfismo
54 - 130
Tema 12. Programación orientada a objetos: polimorfismo
9.6 Uso de la interfaz PorPagar para procesar objetos Factura y Empleado mediante el
polimorfismo.
Cuando una clase implementa a una interfaz, se aplica la misma relación “es un” que
proporciona la herencia.
Por ejemplo, la clase Empleado implementa a PorPagar, por lo que podemos decir que un
objeto Empleado es un objeto PorPagar. De hecho, los objetos de cualquier clase que
extienda a Empleado son también objetos PorPagar. Por ejemplo, los objetos
EmpleadoAsalariado son objetos PorPagar.
Al igual que con las relaciones de herencia, un objeto de una clase que implemente a una
interfaz puede considerarse como un objeto del tipo de la interfaz. Los objetos de
cualquier subclase de la clase que implementa a la interfaz también pueden considerarse
como objetos del tipo de la interfaz.
Define un array de cuatro variables PorPagar. Asignan las referencias de objetos Factura
a los primeros dos elementos, asignan las referencias de objetos EmpleadoAsalariado a
los dos siguiente elementos del array.
55 - 130
Tema 12. Programación orientada a objetos: polimorfismo
Utiliza una instrucción for mejorada para procesar cada objeto PorPagar de manera
polimórfica, imprimiendo en pantalla el objeto como un String, junto con el pago vencido.
56 - 130
Tema 12. Programación orientada a objetos: polimorfismo
De manera implícita, los campos (atributos) de una interfaze son public, static y
final; aunque no se especifiquen estas palabras palabras en la declaración.
Una clase puede usar estas constantes, para lo cual importa la interfaz y después hace
referencia a cada constante como
Constantes.UNO
Constantes.DOS
Constantes.TRES.
Observaciones:
Una clase puede hacer referencia a las constantes importadas sólo con sus nombres (es
decir, UNO, DOS y TRES) si utiliza una declaración static import para importar la interfaz.
http://puntocomnoesunlenguaje.blogspot.com.es/2013/04/java-enum- enumerados-en-
java.html
57 - 130
Tema 12. Programación orientada a objetos: polimorfismo
Una breve descripción de algunas de las interfaces que se encuentran en la API de Java.
El poder y la flexibilidad de las interfaces se utilizan con frecuencia a lo largo de la API de
Java.
Estas interfaces se implementan y usan de la misma forma que las interfaces que crea un
programador (la interface PorPagar). Las interfaces de la API de Java permiten utilizar
clases propias dentro de los marcos de trabajo que proporciona Java, como el comparar
objetos de sus propios tipos y crear tareas que se ejecuten de manera concurrente con
otras tareas en el mismo programa.
Interface Descripción
Comparable Java contiene varios operadores de comparación (<, <=, >, >=, ==, !=) que nos permiten
comparar valores primitivos. Sin embargo, estos operadores no se pueden utilizar para
comparar el contenido de los objetos.
La interface Comparable se utiliza para permitir que los objetos de una clase que implementa
a la interface se comparen entre sí.
La interface contiene un método, compareTo, que compara el objeto que llama al método con
el objeto que se pasa como argumento para el método.
Las clases deben implementar el método compareTo de tal forma que devuelva un valor
indicando si el objeto en el cual se invoca es menor (valor de retorno entero negativo), igual
(valor de retorno 0) o mayor (valor de retorno entero positivo) que el objeto que se pasa
como argumento, utilizando cualquier criterio especificado por el programador. (Por ejemplo,
si la clase Empleado implementa a Comparable, su método compareTo podría comparar
objetos Empleado en base a sus montos de ingresos.)
La interface Comparable se utiliza comúnmente para ordenar objetos en una colección como
un array.
Serializable Una interface que se utiliza para identificar clases cuyos objetos pueden escribirse en
(serializarse), o leerse desde (deserializarse) algún tipo de almacenamiento (archivo en disco,
campo de base de datos) o transmitirse a través de una red.
Uno de sus usos es con Archivos y flujos y Redes.
Runnable La implementa cualquier clase para la cual sus objetos deban poder ejecutarse en paralelo,
usando una técnica llamada subprocesamiento múltiple.
La interface contiene el método run que describe el comportamiento de un objeto al
ejecutarse.
Interfaces de Cuando escribe una dirección de un sitio Web o cuando hace clic en un botón en el
escucha navegador Web, éste debe responder a su interacción y realizar la tarea que se le indica.
de eventos de la GUI La interacción se conoce como evento, y el código que utiliza el navegador para responder a
un evento se conoce como manejador de eventos.
Se crean GUIs y los manejadores de eventos para responder a las interacciones del usuario.
Los manejadores de eventos se declaran en clases que implementan una interface de escucha
de eventos apropiada. Cada interface de escucha de eventos especifica uno o más métodos
que deben implementarse para responder a las interacciones de los usuarios.
58 - 130
Tema 12. Programación orientada a objetos: polimorfismo
12 Interface List
Esta secuencia de elementos en forma de lista (al igual que los arrays) está “basada en
0”. Esto quiere decir que el primer elemento no es el que está en la posición “1”, sino en la
posición “0”.
Debido a la gran variedad y tipo de listas que puede haber con distintas características
como permitir que contengan o no elementos null, o que tengan restricciones en los tipos
de sus elementos, hay una gran cantidad de clases que implementan esta interfaz.
– ArrayList
– LinkedList
– Stack
– Vector
– …....
Por ejemplo: el hecho de declarar una variable de tipo lista, por ejemplo
nos dice que miLista va a ser una variable de tipo List, pero todavía no hemos definido
cuál de las posibles implementaciones va a ser, por ejemplo LinkedList, ArrayList u otras.
59 - 130
Tema 12. Programación orientada a objetos: polimorfismo
El código podría definir que se implementara de una u otra manera en función de las
circunstancias usando condicionales. O a nivel de programación, mantendríamos la
definición como List y nos permitiría comprobar el rendimiento de distintas configuraciones
(hacer funcionar miLista bien como ArrayList o bien como LinkedList viendo su
rendimiento).
60 - 130
Tema 12. Programación orientada a objetos: polimorfismo
13 La clase ArrayList
http://docs.oracle.com/javase/7/docs/api/
Java utiliza clases abstractas en el API de la misma forma que podemos nosotros usarlas
en nuestros programas. La clase AbstractList del paquete java.util es una clase abstracta
con tres subclases:
61 - 130
Tema 12. Programación orientada a objetos: polimorfismo
La clase ArrayList pertenece a la biblioteca java.util. Por tanto, para emplearla en nuestras
clases o programas debemos importa la clase o el paquete
import java.util.ArrayList
(o import java.util.*).
La clase ArrayList tiene métodos como, por ejemplo, para añadir un objeto en una
posición determinada, añadir un objeto al final de la lista, recuperar un objeto situado en
determinada posición, etc.
Esta instrucción crea el ArrayList vacío llamado “array”, que puede contener object
(objetos de cualquier tipo).
62 - 130
Tema 12. Programación orientada a objetos: polimorfismo
Un ArrayList de objects puede tener alguna complicación a la hora de trabajar con él,
necesidad, por ejemplo, de realizar casting. Por eso, una alternativa a esta declaración es
indicar el tipo de objetos que contiene. En este caso, el ArrayList solo podrá contener
objetos de ese tipo.
<tipo> debe ser una clase. Indica el tipo de objetos que contendrá el ArrayList. No se
pueden usar tipos primitivos. Para un tipo primitivo se debe utilizar su clase envolvente.
Por ejemplo: crea el ArrayList “numeros” de números enteros.
También podremos crear un ArrayList desde los datos que contenga una colección, se
estudiará más adelante.
63 - 130
Tema 12. Programación orientada a objetos: polimorfismo
MÉTODO DESCRIPCIÓN
http://docs.oracle.com/javase/7/docs/api/java/util/ArrayList.html
64 - 130
Tema 12. Programación orientada a objetos: polimorfismo
Ejemplo 7
Esta instrucción crea el ArrayList “array” vacío que puede contener objetos de cualquier
tipo.
Crea un array con la edad de 10 personas adultas en edad laboral (18 a 65) y calcula su
media. Mostrar los números generados y la media:
Array[0]: 40
Array[1]: 23
Array[2]: 51
Array[3]: 25
Array[4]: 39
Array[5]: 41
Array[6]: 53
Array[7]: 36
Array[8]: 20
Array[9]: 57
Media: 38
Para introducir la edad vamos a utilizar la generación de un número aleatorio entero entre
18 y 65.
Los números enteros generados no son objetos. Son datos de tipos básicos (int) pero el
compilador los convierte automáticamente en objetos de su clase envolvente (clase
contenedora o wrapper ) antes de añadirlos al array.
65 - 130
Tema 12. Programación orientada a objetos: polimorfismo
66 - 130
Tema 12. Programación orientada a objetos: polimorfismo
for(Integer i: numeros){
System.out.println(i);
}
http://docs.oracle.com/javase/7/docs/api/java/util/Iterator.html
67 - 130
Tema 12. Programación orientada a objetos: polimorfismo
Implementar Iterable obliga a sobreescribir un método que es iterator() que nos devuelve
un objeto de tipo Iterator que permite iterar o recorrer los elementos de una colección.
Todas las colecciones implementan Iterable. Implementar Iterable tan sólo obliga a sobreescribir
un método que es iterator()
Iterator iterator();
Lo primero es tener claro que hay que distinguir el método iterator (en minúsculas,
método de la interface Interable) y el tipo definido en el api de Java Iterator (con
mayúsculas). Iterator con mayúsculas es un tipo definido por la Interface Iterator:
java.util.Iterator.
El método iterator() nos va a permitir obtener un objeto de tipo Iterator que representa la
colección a recorrer. Los métodos para los objetos de tipo Iterator nos van a permitir
operar con cada elemento de la colección.
68 - 130
Tema 12. Programación orientada a objetos: polimorfismo
Ejemplo:
// Se importan las clases ArrayLis e Iterator
import java.util.ArrayList;
import java.util.Iterator;
69 - 130
Tema 12. Programación orientada a objetos: polimorfismo
Ejemplo9. Prueba a recorrer el arrayList del ejemplo ejemplo7 utilizando las 3 formas de
recorrer un ArrayList.
El ejemplo se puede realizar utilizando un arrayList de objetos indefinidos llamado array
Bucle for
array[0]: 20
array[1]: 43
array[2]: 56
array[3]: 57
array[4]: 40
array[5]: 25
array[6]: 32
array[7]: 64
array[8]: 27
array[9]: 40
70 - 130
Tema 12. Programación orientada a objetos: polimorfismo
Ejemplo10: La clase Persona tiene los atributos dni, nombre, apellido y edad (valor
positivo, 0 en caso contrario).
Crea una clase Test que guarde 5 objetos del tipo Persona en un arrayList.
71 - 130
Tema 12. Programación orientada a objetos: polimorfismo
Ejemplo10Bis. En el ejemplo anterior hemos supuesto (muy mal supuesto) que no existen
dos personas con la misma edad, mejora el código teniendo en cuenta que pueden existir
personas en el array con la misma edad.
Muestra de la persona o personas con la máxima edad su nombre y apellido. Escribe
antes el número de personas que tienen la máxima edad.
Ejemplo:
72 - 130
Tema 12. Programación orientada a objetos: polimorfismo
para (pas=1;pas<array.size();pas=pas+1)
si array.get[ele].getEdad()>array.get[ele+1].getEdad()
auxPersona=array.get[ele]
array.set([ele], array.get[ele+1])
array.set([ele+1],auxPersona)
fin_si
fin_para
fin_para
Fin_Algortimo
.Collections.sort(arrayPersona);
73 - 130
Tema 12. Programación orientada a objetos: polimorfismo
Vamos a realizar un ejercicio acerca de cómo una clase debe hacer uso de la interfaz
Comparable.
Esto nos va a permitir que en dicha clase se pueda realizar la comparación de objetos,
permitiendo hacer ordenaciones de los mismos.
74 - 130
Tema 12. Programación orientada a objetos: polimorfismo
Ejemplo:
p1.compareTo(p2) devuelve:
p1 es menor: negativo
p1=p2: 0
p1 es mayor: positivo
Lo primero es determinar el criterio de cuando dos Personas son iguales, mayor o menor.
En nuestro ejemplo vamos a decir que un objeto persona es “más grande que otro” si
tiene la edad mayor, en cambio será menor si tiene una edad menor y serán iguales, si y
solo si, su edad es igual.
Fíjate que el criterio de ordenación lo hemos decidido nosotros. Una vez decidido, lo
implementaremos en forma de código. Distintos programadores pueden aplicar distintos
criterios a la hora de implementar el método compareTo.
75 - 130
Tema 12. Programación orientada a objetos: polimorfismo
Con los criterios elegidos, nuestro código para la clase Persona quedaría de la siguiente
manera:
if (this.edad<per.edad){
resultado = -1;
}else if (this.edad>per.edad) {
resultado = 1;
}else{
resultado=0;
}
return resultado;
Ejemplo11Comparable
Implementa la intefaz Comparable en la clase Persona.
Para probar lo hecho, vamos a codificar una clase “Programa”, que generar 2 Personas y
los compara mostrando cuál es la mayor.
if (p1.compareTo(p2) < 0 ) {
System.out.println("La persona p1: es menor."); }
}
}
76 - 130
Tema 12. Programación orientada a objetos: polimorfismo
//Ordenación ascendente
Collections.sort(array);
//Ordenación descendente
Collections.sort(array, Collections.reverseOrder());
77 - 130
Tema 12. Programación orientada a objetos: polimorfismo
Las edades se pueden repetir, es decir, pueden existir varias personas con la mima edad.
Comprobar que la solución planteada vale para todos los casos, primero tendrás que
identificar cual puede ser la casuística posible para posteriormente comprobar su
funcionamiento.
78 - 130
Tema 12. Programación orientada a objetos: polimorfismo
COPIAR UN ARRAYLIST
La instrucción:
ArrayList<Integer> ventas1 = ventas;
No copia el array ventas en el nuevo array ventas1 sino que crea una nueva
referencia.
79 - 130
Tema 12. Programación orientada a objetos: polimorfismo
80 - 130
Tema 12. Programación orientada a objetos: polimorfismo
Los tipos de datos primitivos no son objetos pero en ocasiones es necesario tratarlos
como tales. Por ejemplo, hay determinadas clases que manipulan objetos (ArrayList, …).
Una forma de conseguir esto es utilizar un Wrapper, esto es un objeto cuya variable
miembro es el tipo primitivo. Es decir se encapsula al tipo primitivo en una clase.
Estas clases equiparan en funcionalidad a los tipos primitivos con el resto de clases y
además les proporcionan métodos para realizar otras tareas como conversión con
cadenas de caracteres en uno y otro sentido.
Existe una clase Wrapper para cada uno de los tipos primitivos, esto es, existen las
clases Byte, Short, Integer, Long, Float, Double, Boolean y Char (los nombres de las
clases wrapper empiezan por mayúscula, siguiendo la nomenclatura típica de Java).
Lo wrapper numéricos Byte, Short, Integer, Long, Float, Double son subclases de la clase
abstracta Number1.
1 Hay otras cuatro subclases de Number que no se discuten aquí. BigDecimal y BigInteger se usan
para cálculos de alta precisión. AtomicInteger y AtomicLong se usan para aplicaciones multihilo.
81 - 130
Tema 12. Programación orientada a objetos: polimorfismo
byte Byte
short Short
int Integer
long Long
float Float
double Double
char Character
boolean Boolean
Las conversiones entre los tipos primitivos y sus clases envolventes son automáticas (no
es necesario hacer un casting).
Ejemplo de Boxing:
double x = 29.95;
Double y;
y = x; // auto-boxing
y=new Double(x); // sin auto-boxing
Ejemplo de Unboxing:
double x;
Double y = 29.95;
x = y; // auto-unboxing
82 - 130
Tema 12. Programación orientada a objetos: polimorfismo
1. Métodos para obtener el valor del objeto en cada uno de los diferentes formatos
numéricos primitivos (byte, short, int..), que convierten el contenido del objeto this en el
valor primitivo.
byte byteValue()
short shortValue()
int intValue() Convierte el valor de este objeto Number al tipo de
long longValue() datos primitivo devuelto.
float floatValue()
double doubleValue()
Ejemplos:
Integer i1; // i1 es un objeto (referencia a un objeto)
int i2; // i2 es una variable primitiva de tipo
float f1;
i2= i1.intValue();
f1= i1.floatValue();
2. Método de comparación por igualdad. Determina si el contenido del objeto this es igual
al pasado como argument.
83 - 130
Tema 12. Programación orientada a objetos: polimorfismo
//Comparación correcta
if (iInt.compareTo(jInt)==0)
System.out.println("Son iguales");
else
System.out.println("No son iguales");
84 - 130
Tema 12. Programación orientada a objetos: polimorfismo
85 - 130
Tema 12. Programación orientada a objetos: polimorfismo
Provee una serie de métodos para manipular los datos de tipo Character. En la siguiente
tabla aparecen algunos de estos métodos.
86 - 130
Tema 12. Programación orientada a objetos: polimorfismo
16 Resumen herencia-interfaz-polimorfismo.
http://es.wikipedia.org/wiki/Polimorfismo_%28inform%C3%A1tica%29
87 - 130
Tema 12. Programación orientada a objetos: polimorfismo
● Una subclase tiene una relación “es un” con la superclase que extiende.
● Una clase tiene una relación “es un” con la interface que implementa.
88 - 130
Tema 12. Programación orientada a objetos: polimorfismo
Consiste en crear variables (referencias) de una superclase o de una interface y utilizar estas
variables para apuntar a objetos de subclases (clases que extienden la superclase) o clases que
implementan la interface.
Subclase
89 - 130
Tema 12. Programación orientada a objetos: polimorfismo
- Para comprobar en tiempo de ejecución cual es la clase real del objeto apuntado por
referencia se utiliza el operador instanceof.
- Posteriormente ha de realizarse un casting.
90 - 130
Tema 12. Programación orientada a objetos: polimorfismo
Versión 1.0
Una tienda virtual en Internet se dedica a la venta de productos de alimentación, ropa y electrónica.
Cada producto se caracteriza por un precio, un nombre y un código de barras. El precio del producto
debe ser positivo, si fuera negativo se inicializará con el valor 0.
Los productos de alimentación tienen a su vez una fecha de caducidad (atributo de tipo Calendar).
Los productos electrónicos tienen un plus adicional por tener todos 3 años de garantía.
Los productos de ropa tienen como característica el material en que han sido elaborados.
Cada venta que se realiza tiene un código de venta (número secuencial) y puede tener varios productos
(lista de productos). En esta versión no se tiene en cuenta las unidades de cada producto.
Se pide:
1. Realizar un diagrama UML donde se vean las relaciones entre clases, junto a los atributos y
métodos de cada una.
3. Realiza la prueba de cada clase (pruebas de unidad). En sistemas complejos que incluyen
muchas clases es conveniente antes de realizar la aplicación probar todas las clases.
En esta versión se añaden productos a una venta (lista de productos de la venta), se deja para
otras versiones la posibilidad de eliminar productos de dicha lista.
91 - 130
Tema 12. Programación orientada a objetos: polimorfismo
1. Realizar un diagrama UML donde se vean las relaciones entre clases, junto a los atributos y métodos
de cada una.
Producto.java
Alimentacion.java (Ver Anexo Tratamiento de Fechas)
Electronica.java
Ropa.java
Venta.java
PruebaProducto.java
PruebaAlimentacion.java
PruebaElectronica.java
PruebaRopa.java
PruebaVenta.java
92 - 130
Tema 12. Programación orientada a objetos: polimorfismo
Recoge los productos correspondientes a una venta y al final visualice la lista de la compra
correspondiente a dicha venta. Una venta puede tener uno o varios productos de alimentación,
ropa y/o electrónica.
Algoritmo
instanciar objeto Venta
// escribir menú
escribir "1. Comprar Alimento"
escribir "2. Comprar Ropa"
escribir "3. Comprar Electrónica");
escribir "0. Finalizar Compra");
escribir "Elija opción: ");
leer tipoAccion
// entramos en el cuerpo del programa, salimos cuando ya no realizamos más compras
mientras (tipoAccion !=0)
//pedimos datos generales del producto
escribir "Introducir Código de Barras: "
leer codigoBarras
escribir “Introducir Nombre del producto: "
leer nombre
escribir "Introducir Precio del producto: "
leer precio
//pedimos datos concretos según el tipo de producto
según (tipoAccion)
caso1: escribir "Introducir Fecha Caducidad"
leer fecha (dia/mes/anyo)
instanciar objeto fecha
venta.incluirEnListaCompra(instanciar objeto Alimentacion)
// break
caso2: escribir "Introducir Material: "
leer material
venta.incluirEnListaCompra( instanciar objeto Ropa)
//break
caso3: escribir "Introducir Plus de Garantía: "
leer plusGarantia
venta.incluirEnListaCompra( instanciar objeto Electrónica)
fin_según
//escribir Menú y pedir opción
escribir "1. Comprar Alimento"
escribir "2. Comprar Ropa"
escribir "3. Comprar Electrónica");
escribir "0. Finalizar Compra");
escribir "Elija opción: ");
leer tipoAccion
fin_mientras
Escribir "Su lista de la compra es: ", codventa, listaCompra //método toString() del objeto Venta
Fin_Algoritmo
93 - 130
Tema 12. Programación orientada a objetos: polimorfismo
Modifica el algoritmo para que se puedan hacer varias ventas, al finalizar la venta se muestra la lista de
compras y se consulta al usuario si desea hacer otra venta.
El método toString de la clase Alimentación deberá visualizar de forma correcta la fecha. Realiza las
pruebas correspondientes.
Fuente:
http://hopzone.com.es/KIMERAWEB/java/tema11.php
http://carloszuluaga.wikidot.com/articulos:manejo-de-fechas-en-java-ii
http://chuwiki.chuidiang.org/index.php?title=Clase_Calendar_de_Java
Clase Calendar
La clase Calendar surgió para cubrir las carencias de la clase Date en el tratamiento de fechas.
Calendar es una clase abstracta, por lo que no podemos utilizar el operador new para crear objetos de la
misma.
Una subclase de Calendar representa una fecha de acuerdo a las reglas de un calendario específico.
GregorianCalendar es una subclase concreta de Calendar. La clase java.util.GregorianCalendar es una
implementación del calendario gregoriano que es usado en casi todo el mundo (es el que conocemos).
Futuras subclases podrían representar varios tipos de calendarios usados en diferentes lugares del
mundo.
A través del método estático getInstance() crearemos un objeto de una subclase de Calendar (gracias al
polimorfismo es totalmente transparente para el programador la clase GregorianCalendar, a la que
pertenece el objeto) que representa la hora y fechas actuales.
94 - 130
Tema 12. Programación orientada a objetos: polimorfismo
Utilizando el método get() podemos recuperar de manera individual cada uno de los campos que
componen la fecha, indicando el campo concreto que se quiere obtener.
import java.util.Calendar;
El mes no cuenta desde el 1, sino desde el 0 (cero) así que hay que sumar 1 para una compresión lógica.
La clase Calendar tiene un único método get para obtener todos sus datos para lo cual se ayuda de una
serie de atributos constantes (static final int ) de la clase Calendar, los más importantes son:
1 YEAR: Año.
2 MONTH: Mes.
5 DATE, DAY_OF_MONTH: Día del mes.
7 DAY_OF_WEEK: Día de la semana entre 1 (SUNDAY) y 7
(SATURDAY).
10 HOUR: Hora antes o después del medio día (en intervalos de
12 horas).
11 HOUR_OF_DAY: Hora absoluta del día (en intervalos de 24 horas).
12 MINUTE: El minuto dentro de la hora.
13 SECOND: El segundo dentro del minuto.
Ejemplo2. Cambia el ejemplo anterior para obtener la fecha de hoy en el formato: “Mérida, a 27 de 03
de 2017”.
95 - 130
Tema 12. Programación orientada a objetos: polimorfismo
La fecha (cal) se puede cambiar con el método set(int atributo, int valor)
atributo es una de las constante mencionadas anteriormente (DAY_OF_MONTH, MONTH, YEAR, …).
Como la idea es que no nos sepamos que entero está asociado a que valor, la clase Calendar nos proporciona una
serie de constantes que nos ayudarán a encontrar dichos valores.
Por ejemplo:
cal.set(Calendar.DAY_OF_MONTH, 11);
cal.set(Calendar.MONTH, 10);
cal.set(Calendar.YEAR, 2011);
Los meses también se pueden referenciar con su literal (JANUARY, MARCH, JUNE, DECEMBER, ...)
por ejemplo
cal.set(Calendar.MONTH, Calendar.JANUARY)
GregorianCalendar
El ejemplo anterior se podría haber hecho creando un objeto del tipo GregorianCalendar con la fecha
requerida.
Esta clase es una clase concreta de Calendar y que por otro lado es el sistema de calendario estándar en
el mundo, al menos en el mundo occidental que comprende Europa, Norte, Centro y SurAmérica y
muchos otros países.
http://docs.oracle.com/javase/7/docs/api/java/util/GregorianCalendar.html
96 - 130
Tema 12. Programación orientada a objetos: polimorfismo
GregorianCalendar()
Ejemplos:
Pruébalo.
fecha.get(Calendar.DAY_OF_MONTH)
fecha.get(Calendar.MONTH)
fecha.get(Calendar.YEAR)
fecha.get(Calendar.HOUR_OF_DAY )
fecha.get(Calendar.MINUTE )
fecha.get(Calendar.SECOND)
97 - 130
Tema 12. Programación orientada a objetos: polimorfismo
Realizar operaciones como sumar o restar días no es algo que dependa directamente de Calendar sino
más bien de una subclase de esta que implemente algún tipo de calendario.
Es con esta clase con la que podemos sumar 2, 3 ó 300 días a una fecha sin preocuparnos por
desbordamientos o recalcular meses o años, pues ella lo hace automáticamente tomando en cuenta las
reglas del calendario gregoriano.
De igual forma podemos obtener información como el día de la semana o la semana del año que fue
una fecha determinada.
Anteriormente vimos los métodos set() y get() de la clase Calendar para obtener fechas y los datos de
esas fechas, ahora veremos los métodos add() y roll() que nos permiten avanzar un tiempo exacto sobre
los datos obtenidos anteriormente.
El método add
atributo número entero o una de las constante mencionadas anteriormente (DAY_OF_MONTH, MONTH,
YEAR, HOUR_OF_DAY , MINUTE, SECOND,...)
valor es la cantidad que se le quiere sumar.
Ejemplo4. Resta a la fecha actual 24 horas, 2 minutos y 45 segundos. Muestra la fecha actual y la nueva
fecha.
98 - 130
Tema 12. Programación orientada a objetos: polimorfismo
El método roll
Esté método tiene un funcionamiento similar a add() excepto por que no modifica ningún otro
atributo, es decir, cuando el atributo dado por CONSTANTE llega a su límite inferior o superior
cambia al límite contrario pero sin modificar sus atributos siguientes.
Pruébalo:
System.out.println(cal.getTime());
cal.roll(Calendar.MONTH, 20);
System.out.println(cal.getTime());
Si queremos calcular la diferencia entre dos fechas concretas, sin utilizar librerías externas, tenemos que
hacer el cálculo en milisegundos.
Calendar tiene un método getTimeInMilis() que nos devuelve el número de milisegundos que han
pasado desde el 1 de Enero de 1970 a las 00:00:00 hasta la fecha/hora representada por nuestra
instancia de Calendar. Si tenemos dos fecha/hora como Calendar, la diferencia entre ellas en
milisegundos se puede calcular fácilmente:
99 - 130
Tema 12. Programación orientada a objetos: polimorfismo
A partir de aquí es fácil convertir esos milisegundos de diferencia a cualquier otra unidad que nos
interese, como número de días, de horas, etc. Por ejemplo, para pasar los milisegundos a días debemos
• dividir por 1000 para pasar los milisegundos a segundos
• después dividir por 60 para pasar los segundos a minutos
• después dividir por 60 para pasar los minutos a horas
• después dividir por 24 para pasar las horas a días
El siguiente código nos daría el número de días entre ambas fechas
Comparar fechas
if (fecha1.equals(fecha2))
System.out.println("Iguales");
else
System.out.println("Diferentes");
y el método compareTo
if (fecha1.compareTo(fecha2)==0)
System.out.println("Las fechas son iguales");
else if (fecha1.compareTo(fecha2)<0)
System.out.println("fecha1 es menor");
else
System.out.println("fecha1 es mayor");
100 - 130
Tema 12. Programación orientada a objetos: polimorfismo
– Producto.
El método debe devolver el importe del producto
– Venta.
El método debe calcular (devolver) la suma de los importes de todos los productos de la venta.
101 - 130
Tema 12. Programación orientada a objetos: polimorfismo
102 - 130
Tema 12. Programación orientada a objetos: polimorfismo
@Override
public float calcularImporte(){
float suma=0;
for(Valorable productoActual :listaCompra){
suma+=productoActual.calcularImporte();
}
return suma;
//también se podría realizar el tratamiento polimórfico con Producto
}
}
….
@Override
public float calcularImporte(){
return super.calcularImporte()+plusGarantia;
}
}
103 - 130
Tema 12. Programación orientada a objetos: polimorfismo
En las anteriores versiones cuando se desea comprar de un producto dos o más unidades se debe
incluir en la lista de la compra varias veces el producto.
En la versión 3.0 se deberá permitir a la hora de comprar un producto indicar el número de unidades
que se desean comprar.
Realiza un diagrama UML, la creación y/o modificación de las clases para cumplir los nuevos
requerimientos.
A tener en cuenta:
Esto implica que se ha de definir una variable donde guardar el número de unidades a comprar
“unidadesVendidas”.
El número de unidades del producto que se desean comprar debe de pedirse al mismo tiempo que
pedimos los valores de los atributos del producto correspondiente.
La aplicación recoge una lista de productos (carrito de la compra) y después nos muestra un ticket con
los productos elegidos y el importe. Debemos por tanto, guardar el producto y las unidades vendidas
para poder obtener el ticket.
104 - 130
Tema 12. Programación orientada a objetos: polimorfismo
Solución 1
Se añadirán (clase Venta) los métodos para el tratamiento del arrayList de unidadesVendidas, y se
procesarían (se recorren) los dos array en paralelo.
Guardamos en un sólo arrayList el producto (objeto de tipo producto) y las unidades vendidas.
- productoVendido: Producto
- unidadesVendidas: int
La clase Venta contiene ahora una colección (arrayList) de objetos del tipo LineaDeVenta. Un objeto
LineaDeVenta tiene la información del producto y las unidades.
105 - 130
Tema 12. Programación orientada a objetos: polimorfismo
Diagrama UML
106 - 130
Tema 12. Programación orientada a objetos: polimorfismo
LineaDeVenta
//constructor
public LineaDeVenta(Producto productoVendido, int unidadesVendidas) {
this.productoVendido = productoVendido;
this.unidadesVendidas = unidadesVendidas;
}
// métodos establecer y obtener
public int getUnidadesVendidas() {
return unidadesVendidas;
}
@Override
public float calcularImporte(){
return productoVendido.calcularImporte()* unidadesVendidas;
//return getProductoVendido().calcularImporte()* unidadesVendidas;
}
El método calcularImporte actúa de forma polimórfica “en dependiendo” del tipo de producto
comprado, los productos de alimentación y ropa heredan el método de la clase Producto y los de
electrónica tienen su propio método (método sobre-escrito).
107 - 130
Tema 12. Programación orientada a objetos: polimorfismo
Las superclase abstrata Producto y las subclases Alimentación, Ropa y Electronica no se ven afectadas.
// en la clase Producto
public float calcularImporte(){
return precio;
}
// en la clase Electronica
public float calcularImporte(){
return super.calcularImporte()+plusGarantia;
}
Venta
El arrayList listaCompra que era una colección de objetos de tipo Producto, ahora es una colección de
objetos de tipo LineaVenta
108 - 130
Tema 12. Programación orientada a objetos: polimorfismo
for(Valorable lineaActual:listaCompra){
suma+=lineaActual.calcularImporte();
}
return suma;
}
// método ticketDeCompra
public String ticketDeCompra(){
String ticket="";
for(LineaDeVenta lineaActual:listaCompra){
ticket+=lineaActual.getProductoVendido().getNombre();
ticket+='\t';
ticket+=lineaActual.getProductoVendido().calcularImporte();
ticket+='\t';
ticket+=lineaActual.getUnidadesVendidas();
ticket+='\t';
ticket+=lineaActual.calcularImporte();
ticket+='\n';
}
ticket+=" Importe total "+this.calcularImporte();
return ticket;
}
109 - 130
Tema 12. Programación orientada a objetos: polimorfismo
CarritoDeLaCompra
. . .
. . .
venta.incluirEnListaCompra(linea);
venta.incluirEnListaCompra(new LineaDeVenta(new
Alimentacion(codigoBarras,nombre,precio,caducidad),unidades));
Igual para los productos del tipo de la clase Ropa y de la clase Electronica.
110 - 130
Tema 12. Programación orientada a objetos: polimorfismo
Cambiar el ticket de la compra para que aparezca en el nombre del producto (cuando sea ropa) el
material de que está hecha la prenda.
111 - 130
Tema 12. Programación orientada a objetos: polimorfismo
Solución propuesta
// método ticketDeCompra
public String ticketDeCompra(){
String ticket="";
for(LineaDeVenta lineaActual:listaCompra){
ticket+=lineaActual.getProductoVendido().getNombre();
ticket+='\t';
ticket+=lineaActual.getProductoVendido().calcularImporte();
ticket+='\t';
ticket+=lineaActual.getUnidadesVendidas();
ticket+='\t';
ticket+=lineaActual.calcularImporte();
ticket+='\n';
}
ticket+=" Importe total "+this.calcularImporte();
return ticket;
}
112 - 130
Tema 12. Programación orientada a objetos: polimorfismo
Observaciones.
Otra forma:
113 - 130
Tema 12. Programación orientada a objetos: polimorfismo
1- Eliminar una linea de venta (LineaDeVenta) a través del nombre del producto.
Para las dos acciones (borrar o modificar una linea de venta) se deberá pedir al usuario el nombre del
producto que se desea borrar o modificar.
114 - 130
Tema 12. Programación orientada a objetos: polimorfismo
Propuesta de solución
nombreIterator.remove();
115 - 130
Tema 12. Programación orientada a objetos: polimorfismo
116 - 130
Tema 12. Programación orientada a objetos: polimorfismo
if (respuesta=='s'|| respuesta=='S') {
System.out.println("Introduzca el nombre del producto que deseas borrar");
nombre=teclado.next();
//definir un objeto de tipo iterator
//recorrer la colección y buscar el objeto (lineaVenta) del producto
// al encontrar el objeto linea de venta con el producto de nombre igual al introducido,
// borra objeto
}
117 - 130
Tema 12. Programación orientada a objetos: polimorfismo
118 - 130
Tema 12. Programación orientada a objetos: polimorfismo
Una empresa gestiona el alquiler de un conjunto de inmuebles que son de su propiedad. Cada inmueble
puede ser un local comercial, oficina o un piso.
Los datos de un inmueble son dirección, dimensión y alquilado (nos informa si el inmueble se
encuentra alquilado). Para el caso de pisos si está o no amueblado. Para el caso de los locales
comerciales si dispone de salida de humos y de licencia para negocios de restauración.
Cualquier persona que tenga una nómina o un aval bancario puede alquilar alguno de los pisos o locales
que no estén ya alquilados, y posteriormente desalquilarlo. Los datos requeridos para el contrato son
fecha de contrato, duración en meses, datos del inquilino (nombre y dni) y del inmueble. Además en el
contrato se fija la fianza y la renta mensual.
Se debe gestionar los movimientos bancarios que se producen asociados a cada oficina, piso o local.
Todos los movimientos bancarios hacen referencia a un determinado inmueble, tienen un concepto y
una cantidad (importe).
Un gasto está asociado a un inmueble determinado y se indicará el tipo de gasto al que pertenece entre
los que se tienen estipulados.
Existe dos tipos de gastos: los imputables al inquilino (luz, gas, etc..) y los no imputables a los inquilinos
(que serían las reparaciones y gastos de mantenimiento).
tipoMovimiento: TipoMovimiento
Cada mes se generan los recibos para cada uno de los inmuebles contratados.
El recibo especifica el inmueble (piso, local u oficina) a que pertenece, la fecha de emisión, la renta, el
agua, la luz, portería, …. la renta se cargará con un IVA del 21%.
GestionarInmuebles: es una aplicación que emite los recibos de los inmuebles contratados en un
determinado mes, coge la información de los movimientos de una cuenta bancaria ( numero de cuenta
y una colección de movimientos).
Ejemplo de ejecución:
119 - 130
Tema 12. Programación orientada a objetos: polimorfismo
En la cultura popular, divide y vencerás hace referencia a un refrán que implica resolver un problema difícil, dividiéndolo
en partes más simples tantas veces como sea necesario, hasta que la resolución de las partes se torna obvia. La solución del
problema principal se construye con las soluciones encontradas.
En las ciencias de la computación, el término divide y vencerás hace referencia a uno de los más importantes paradigmas
de diseño algorítmico. El método está basado en la resolución recursiva de un problema dividiéndolo en dos o más
subproblemas de igual tipo o similar. El proceso continúa hasta que éstos llegan a ser lo suficientemente sencillos como
para que se resuelvan directamente. Al final, las soluciones a cada uno de los subproblemas se combinan para dar una
solución al problema original.
Fuente: http://es.wikipedia.org/wiki/Algoritmo_divide_y_vencer%C3%A1s
Fase I
Una empresa gestiona el alquiler de un conjunto de inmuebles que son de su propiedad. Cada inmueble
puede ser un local comercial, oficina o un piso.
Los datos de un inmueble son dirección, dimensión y alquilado (nos informa si el inmueble se
encuentra alquilado). Para el caso de pisos si está o no amueblado. Para el caso de los locales
comerciales si dispone de salida de humos y de licencia para negocios de restauración.
Prueba los requerimientos anteriores desde una nueva clase GestionarInmuebles (que contiene el
método main()), crea los 3 tipos de inmueble y visualiza su contenido, como indica la figura.
120 - 130
Tema 12. Programación orientada a objetos: polimorfismo
Diagrama UML
121 - 130
Tema 12. Programación orientada a objetos: polimorfismo
Fase II
Una empresa gestiona el alquiler de un conjunto de inmuebles que son de su propiedad. Cada inmueble
puede ser un local comercial, oficina o un piso.
Los datos de un inmueble son dirección, dimensión y alquilado (nos informa si el inmueble se
encuentra alquilado). Para el caso de pisos si está o no amueblado. Para el caso de los locales
comerciales si dispone de salida de humos y de licencia para negocios de restauración.
Cualquier persona que tenga una nómina o un aval bancario puede alquilar alguno de los pisos o locales
que no estén ya alquilados, y posteriormente desalquilarlo. Los datos requeridos para el contrato son
fecha de contrato, duración en meses, datos del inquilino (nombre y dni) y del inmueble. Además en el
contrato se fija la fianza y la renta mensual.
Prueba los requerimientos anteriores desde una nueva clase GestionarInmuebles, crea 3 o más
contratos y visualiza su ejecución como indica la figura.
Uso de enumerados
122 - 130
Tema 12. Programación orientada a objetos: polimorfismo
Diagrama UML
123 - 130
Tema 12. Programación orientada a objetos: polimorfismo
Fase III
Se debe gestionar los movimientos bancarios que se producen asociados a cada oficina, piso o local.
Todos los movimientos bancarios hacen referencia a un determinado inmueble, tienen un concepto y
una cantidad (importe).
Un gasto está asociado a un inmueble determinado y se indicará el tipo de gasto al que pertenece entre
los que se tienen estipulados.
Existe dos tipos de gastos: los imputables al inquilino (luz, gas, etc..) y los no imputables a los inquilinos
(que serían las reparaciones y gastos de mantenimiento).
tipoMovimiento: TipoMovimiento
124 - 130
Tema 12. Programación orientada a objetos: polimorfismo
Listado de movimientos:
1. 15-2-2013 GASTO_IMPUTABLE Recibo Gas 65.0€. Inmueble:Velazquez 31 2ºA Mérida
2. 15-3-2013 GASTO_NO_IMPUTABLE Comunidad de vecinos 150.0€. Inmueble:Velazquez 31 2ºA Mérida
3. 15-4-2013 GASTO_IMPUTABLE Recibo Luz 70.0€. Inmueble:Velazquez 31 2ºA Mérida
125 - 130
Tema 12. Programación orientada a objetos: polimorfismo
Fase IV
Cada mes se generan los recibos para cada uno de los inmuebles contratados.
El recibo especifica el inmueble (piso, local u oficina) a que pertenece, la fecha de emisión, la renta, el
agua, la luz, portería, la actualización del IPC anual, …. la renta se cargará con un IVA del 21%.
Ejemplo de recibo
Primera:
126 - 130
Tema 12. Programación orientada a objetos: polimorfismo
En la clase contrato:
movimientosInmuebleMes.add(movimientoActual);
}
return movimientosInmuebleMes;
}
Segunda:
Recuerda: pág.68
127 - 130
Tema 12. Programación orientada a objetos: polimorfismo
Fase V
1º Se desea saber si el recibo que se emite se encuentra o no pagado, dicha información es externa a las
clases implementadas y no se encuentra guardada en ningún sitio. Lógicamente cualquier aplicación de
gestión inmobiliaria deberá guardar esta información.
2º Los pisos pagan todos los conceptos anteriores. Las oficinas pagan además limpieza. Los locales
comerciales no pagan portería y si pagan el impuesto mensual de vado.
Los movimientos recogen los ingresos y gastos de los inmuebles, pero en ningún caso se ha tenido en
cuenta que determinado concepto (gasto) sólo es aplicable a un determinado inmueble.
128 - 130
Tema 12. Programación orientada a objetos: polimorfismo
Una empresa gestiona el alquiler de un conjunto de inmuebles que son de su propiedad. Cada inmueble
puede ser un local comercial, oficina o un piso.
Los datos de un inmueble son dirección, dimensión y alquilado (nos informa si el inmueble se
encuentra alquilado). Para el caso de pisos si está o no amueblado. Para el caso de los locales
comerciales si dispone de salida de humos y de licencia para negocios de restauración.
Cualquier persona que tenga una nómina o un aval bancario puede alquilar alguno de los pisos o locales
que no estén ya alquilados, y posteriormente desalquilarlo. Los datos requeridos para el contrato son
fecha de contrato, duración en meses, datos del inquilino (nombre y dni) y del inmueble. Además en el
contrato se fija la fianza y la renta mensual.
Cada mes se generan los recibos para cada uno de los inmuebles, el cual lleva asociado un número de
recibo que es único para cada contrato.
El recibo especifica el piso o local a que pertenece, la fecha de emisión, la renta, el agua, la luz, portería,
la actualización del IPC anual e importe de IVA(21%). Además, para cada recibo se desea saber si está o
no cobrado.
Los pisos pagan todos los conceptos anteriores. Las oficinas pagan además limpieza. Los locales
comerciales no pagan portería y si pagan el impuesto mensual de vado.
Se debe gestionar los movimientos bancarios que se producen asociados a cada edificio, piso o local.
Todos los movimientos bancarios hacen referencia a un determinado inmueble, tienen un concepto y
una cantidad (importe).
Un gasto está asociado a un inmueble determinado y se indicará el tipo de gasto al que pertenece entre
los que se tienen estipulados.
Existe dos tipos de gastos: los imputables al inquilino (luz, gas, etc..) y los no imputables a los inquilinos
(que serían las reparaciones y gastos de mantenimiento).
Un ingreso está asociado a un inmueble determinado y se indicará el tipo de ingreso al que pertenece,
como en el caso de los gastos. (Ejemplos de ingresos son precisamente los recibos que se cobran cada
mes a los inquilinos o la fianza aportada al firmar el contrato).
Basándose en los gastos e ingresos que se deducen de los movimientos bancarios, la aplicación deberá
ser capaz de ocuparse de la gestión económica generando los informes que indican el beneficio que se
obtiene de cada inmueble.
GestionarInmuebles (que contiene el método main()) realizará las siguientes acciones: Cartera de
inmuebles (creación de tres inmuebles), cartera de inquilinos (creación de tres inquilinos) , contratos
(creación de tres contratos ), registro de movimientos bancarios (creación de varios movimientos
bancarios) y emisión de recibos según mes.
129 - 130
Tema 12. Programación orientada a objetos: polimorfismo
130 - 130