Typecasting es uno de los conceptos más importantes que básicamente se ocupa de la conversión de un tipo de datos a otro tipo de datos implícita o explícitamente. En este artículo, se analiza el concepto de encasillamiento de objetos.
Al igual que los tipos de datos, los objetos también se pueden encasillar. Sin embargo, en los objetos, solo hay dos tipos de objetos, es decir, objeto principal y objeto secundario. Por lo tanto, el encasillamiento de objetos básicamente significa que un tipo de objeto (es decir) es hijo o padre de otro. Hay dos tipos de encasillamiento. Están:
- Upcasting: Upcasting es el encasillamiento de un objeto secundario a un objeto principal . El upcasting se puede hacer implícitamente. Upcasting nos brinda la flexibilidad de acceder a los miembros de la clase principal, pero no es posible acceder a todos los miembros de la clase secundaria mediante esta función. En lugar de todos los miembros, podemos acceder a algunos miembros específicos de la clase secundaria. Por ejemplo, podemos acceder a los métodos anulados.
- Downcasting: Del mismo modo, downcasting significa encasillar un objeto principal en un objeto secundario . El downcasting no puede ser implícito.
La siguiente imagen ilustra el concepto de upcasting y downcasting:
Ejemplo: Sea una clase padre. Puede haber muchos hijos de un padre. Tomemos a uno de los niños en consideración. El hijo hereda las propiedades del padre. Por lo tanto, existe una relación «es-un» entre el niño y el padre. Por lo tanto, el hijo se puede convertir implícitamente en el padre. Sin embargo, un padre puede o no heredar las propiedades del hijo. Sin embargo, podemos forzar la conversión de un padre a un hijo, lo que se conoce como downcasting . Después de que definamos este tipo de conversión explícitamente, el compilador verifica en segundo plano si este tipo de conversión es posible o no. Si no es posible, el compilador lanza una excepción ClassCastException .
Entendamos el siguiente código para entender la diferencia:
Java
// Java program to demonstrate // Upcasting Vs Downcasting // Parent class class Parent { String name; // A method which prints the // signature of the parent class void method() { System.out.println("Method from Parent"); } } // Child class class Child extends Parent { int id; // Overriding the parent method // to print the signature of the // child class @Override void method() { System.out.println("Method from Child"); } } // Demo class to see the difference // between upcasting and downcasting public class GFG { // Driver code public static void main(String[] args) { // Upcasting Parent p = new Child(); p.name = "GeeksforGeeks"; //Printing the parentclass name System.out.println(p.name); //parent class method is overriden method hence this will be executed p.method(); // Trying to Downcasting Implicitly // Child c = new Parent(); - > compile time error // Downcasting Explicitly Child c = (Child)p; c.id = 1; System.out.println(c.name); System.out.println(c.id); c.method(); } }
GeeksforGeeks Method from Child GeeksforGeeks 1 Method from Child
Una figura ilustrativa del programa anterior:
Del ejemplo anterior podemos observar los siguientes puntos:
- Sintaxis de Upcasting:
Parent p = new Child();
- La actualización se realizará internamente y, debido a la actualización, el objeto solo puede acceder a los miembros de la clase principal y a los miembros especificados de la clase secundaria (métodos anulados, etc.), pero no a todos los miembros.
// This variable is not // accessible p.id = 1;
- Sintaxis de Downcasting:
Child c = (Child)p;
- El downcasting debe realizarse externamente y, debido al downcasting, un objeto secundario puede adquirir las propiedades del objeto principal.
c.name = p.name; i.e., c.name = "GeeksforGeeks"