Conversiones entre objetos (casting)¶
Java admite la conversión de tipos con ciertas limitaciones. Consideremos una jerarquía de herencia como la que vemos en el siguiente diagrama de clases, sobre el que vamos a analizar las posibilidades de conversión de tipos de distintas formas.
Upcasting¶
El upcasting es el proceso de convertir un objeto de una subclase en un objeto de su superclase. Este tipo de conversión es implícito y seguro en Java porque cualquier instancia de una subclase es también una instancia de su superclase. Esto permite tratar a un objeto como una instancia de su clase padre
Downcasting¶
El downcasting es el proceso inverso: convertir una referencia de superclase a una referencia de subclase. Este tipo de conversión debe ser explícito en Java, y solo es seguro si el objeto que se está convirtiendo es realmente una instancia de la subclase. Si no lo es, se generará una excepción ClassCastException.
Casting en horizontal¶
Se trataría de poner lo que está a un lado al otro lado, esto no es posible de ningún modo.
Implementación de casting¶
Profesor p1; //p1 es tipo Profesor. Admite ser Profesor, ProfesorTitular o ProfesorInterino
ProfesorInterino p44 = new ProfesorInterino(); //p44 es ProfesorInterino.
p1 = p44; // Conversión hacia arriba: sin problema. Ahora p1 que es tipo profesor, almacena un profesor interino
p44 = p1 // ERROR en la conversión hacia abajo.
Determinación del tipo de variables
La palabra clave instanceof, todo en minúsculas, sirve para verificar el tipo de una variable. La sintaxis que emplearemos para instanceof y sus normas de uso serán las siguientes:
- a. Sólo se pueden comparar instancias que relacionen dentro de la jerarquía de tipos (en cualquier dirección) pero no objetos que no relacionen en una jerarquía. Es decir, no podemos comparar profesores con taxis por ejemplo, porque no relacionarán dentro de una jerarquía.
- b. Solo se puede usar
instanceofasociado a un condicional.
if (profesor43 instanceof ProfesorInterino) {
…
} else {
…
}
Actividad¶
-
PR 716 (RA7/ CE7a CE7b CE7c CE7d CE7e CE7f CE7g CE7h CE7i CE7j / IC2 / 5p) Realiza un programa de nombre
AppCompraformado por las siguientes clases:- Clase abstracta llamada
Productocon el atributoprotectedgastode tipodoubley el método abstractogastoConIva()que no recibirá parámetros pero devolverá un tipodouble. - Clase
Leche, que hereda deProducto, con el atributo privadolitros_lechede tipo entero, que implementa el métodogastoConIva(), el cual devolverágastode tipodouble. - Clase
Salmón, que hereda deProducto, con el atributo privadokilos_salmonde tipodouble, que implementa el métodogastoConIva(), el cual devolverágastode tipodouble. - Clase
Whisky, que hereda deProducto, con el atributo privadolitros_whiskyde tipo entero, que implementa el métodogastoConIva(), el cual devolverágastode tipodouble. -
Existe polimorfismo en el método
gastoConIva(), pues realizará las siguientes operaciones en función del producto:- Producto Precio unidad IVA Operación realizada en el método gastoConIva()
- Leche 1.95/litro Superreducido (4%) gasto = (double) litros_leche1.951.04
- Salmón 11.85/kilo Reducido (8%) gasto = kilos_salmon11.85 1.08
- Whisky 11.90/litro Normal (21%) gasto = (doublé) litros_whisky11.901.21
-
En el
mainde la claseAppCompra:- Crea, mediante upcasting, un objeto
p1deProductoinstanciando al constructorLeche, otro objetop2deProductoinstanciando al constructorSalmóny un tercerop3deProductoinstanciando al constructorWhisky. - A continuación, debe invocarse el método
gastoConIvaaplicado ap1y mostrar por pantalla su gasto. - Seguidamente debe invocarse el método
gastoConIvaaplicado ap2y mostrar su gasto. - Finalmente debe invocarse el método
gastoConIvaaplicado ap3y mostrar su gasto
- Crea, mediante upcasting, un objeto
- Clase abstracta llamada