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
instanceof
asociado 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
AppCompra
formado por las siguientes clases:- Clase abstracta llamada
Producto
con el atributoprotected
gasto
de tipodouble
y el método abstractogastoConIva()
que no recibirá parámetros pero devolverá un tipodouble
. - Clase
Leche
, que hereda deProducto
, con el atributo privadolitros_leche
de tipo entero, que implementa el métodogastoConIva()
, el cual devolverágasto
de tipodouble
. - Clase
Salmón
, que hereda deProducto
, con el atributo privadokilos_salmon
de tipodouble
, que implementa el métodogastoConIva()
, el cual devolverágasto
de tipodouble
. - Clase
Whisky
, que hereda deProducto
, con el atributo privadolitros_whisky
de tipo entero, que implementa el métodogastoConIva()
, el cual devolverágasto
de 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
main
de la claseAppCompra
:- Crea, mediante upcasting, un objeto
p1
deProducto
instanciando al constructorLeche
, otro objetop2
deProducto
instanciando al constructorSalmón
y un tercerop3
deProducto
instanciando al constructorWhisky
. - A continuación, debe invocarse el método
gastoConIva
aplicado ap1
y mostrar por pantalla su gasto. - Seguidamente debe invocarse el método
gastoConIva
aplicado ap2
y mostrar su gasto. - Finalmente debe invocarse el método
gastoConIva
aplicado ap3
y mostrar su gasto
- Crea, mediante upcasting, un objeto
- Clase abstracta llamada