Upcasting Vs Downcasting en Java

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: 
 

  1. 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.
  2. 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:
 

Upcasting-Vs-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();
    }
}
Producción

GeeksforGeeks
Method from Child
GeeksforGeeks
1
Method from Child

Una figura ilustrativa del programa anterior:
 

Upcasting-Vs-Downcasting1

Del ejemplo anterior podemos observar los siguientes puntos: 
 

  1. Sintaxis de Upcasting: 
     
Parent p = new Child();
  1. 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; 
  1. Sintaxis de Downcasting: 
     
Child c = (Child)p;
  1. 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"

Publicación traducida automáticamente

Artículo escrito por sofiaa y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *