Sobrecarga de constructores en Java

Requisito previo: constructor , sobrecarga en Java

Además de sobrecargar métodos, también podemos sobrecargar constructores en java. El constructor sobrecargado se llama en función de los parámetros especificados cuando se ejecuta new .

¿Cuándo necesitamos la sobrecarga de constructores?

A veces existe la necesidad de inicializar un objeto de diferentes maneras. Esto se puede hacer mediante la sobrecarga del constructor. Por ejemplo, la clase Thread tiene 8 tipos de constructores. Si no queremos especificar nada sobre un subproceso, simplemente podemos usar el constructor predeterminado de la clase Subproceso; sin embargo, si necesitamos especificar el nombre del subproceso, podemos llamar al constructor parametrizado de la clase Subproceso con argumentos de string como este:

Thread t= new Thread (" MyThread "); 

Tomemos un ejemplo para comprender la necesidad de sobrecarga del constructor. Considere la siguiente implementación de una clase Box con un solo constructor que toma tres argumentos.

// An example class to understand need of
// constructor overloading.
class Box
{
    double width, height,depth;

    // constructor used when all dimensions
    // specified
    Box(double w, double h, double d)
    {
        width = w;
        height = h;
        depth = d;
    }

    // compute and return volume
    double volume()
    {
        return width * height * depth;
    }
}

Como podemos ver, el constructor Box() requiere tres parámetros. Esto significa que todas las declaraciones de objetos Box deben pasar tres argumentos al constructor Box(). Por ejemplo, la siguiente declaración no es válida actualmente:

Box ob = new Box();

Dado que Box() requiere tres argumentos, es un error llamarlo sin ellos. Supongamos que simplemente queremos un objeto de caja sin dimensión inicial, o queremos inicializar un cubo especificando solo un valor que se usaría para las tres dimensiones. A partir de la implementación anterior de la clase Box, estas opciones no están disponibles para nosotros.

Este tipo de problemas de diferentes formas de inicializar un objeto se pueden resolver mediante la sobrecarga del constructor. A continuación se muestra la versión mejorada de la clase Box con sobrecarga del constructor.

// Java program to illustrate
// Constructor Overloading
class Box
{
    double width, height, depth;
  
    // constructor used when all dimensions
    // specified
    Box(double w, double h, double d)
    {
        width = w;
        height = h;
        depth = d;
    }
  
    // constructor used when no dimensions
    // specified
    Box()
    {
        width = height = depth = 0;
    }
  
    // constructor used when cube is created
    Box(double len)
    {
        width = height = depth = len;
    }
  
    // compute and return volume
    double volume()
    {
        return width * height * depth;
    }
}
  
// Driver code
public class Test
{
    public static void main(String args[])
    {
        // create boxes using the various
        // constructors
        Box mybox1 = new Box(10, 20, 15);
        Box mybox2 = new Box();
        Box mycube = new Box(7);
  
        double vol;
  
        // get volume of first box
        vol = mybox1.volume();
        System.out.println(" Volume of mybox1 is " + vol);
  
        // get volume of second box
        vol = mybox2.volume();
        System.out.println(" Volume of mybox2 is " + vol);
  
        // get volume of cube
        vol = mycube.volume();
        System.out.println(" Volume of mycube is " + vol);
    }
}

Producción:

Volume of mybox1 is 3000.0
Volume of mybox2 is 0.0
Volume of mycube is 343.0

Usando this() en la sobrecarga del constructor

Esta referencia() se puede usar durante la sobrecarga del constructor para llamar implícitamente al constructor predeterminado desde el constructor parametrizado. Tenga en cuenta que this() debe ser la primera declaración dentro de un constructor.

// Java program to illustrate role of this() in
// Constructor Overloading
class Box
{
    double width, height, depth;
    int boxNo;
  
    // constructor used when all dimensions and
    // boxNo specified
    Box(double w, double h, double d, int num)
    {
        width = w;
        height = h;
        depth = d;
        boxNo = num;
    }
  
    // constructor used when no dimensions specified
    Box()
    {
        // an empty box
        width = height = depth = 0;
    }
  
    // constructor used when only boxNo specified
    Box(int num)
    {
        // this() is used for calling the default
        // constructor from parameterized constructor
        this();
  
        boxNo = num;
    }
  
    public static void main(String[] args)
    {
        // create box using only boxNo
        Box box1 = new Box(1);
  
        // getting initial width of box1
        System.out.println(box1.width);
    }
}

Producción:

0.0

Como podemos ver en el programa anterior, llamamos al constructor Box(int ​​num) durante la creación del objeto usando solo el número de caja. Al usar esta declaración() dentro de él, el constructor predeterminado (Box()) se llama implícitamente desde él, lo que inicializará la dimensión de Box con 0.

Nota: la llamada del constructor debe ser la primera declaración en el cuerpo del constructor. Por ejemplo, el siguiente fragmento no es válido y arroja un error de tiempo de compilación.

Box(int num)
{
    boxNo = num;

    /* Constructor call must be the first
       statement in a constructor */
    this();  /*ERROR*/
}

Puntos importantes a tener en cuenta al realizar la sobrecarga de constructores:

  • La llamada al constructor debe ser la primera declaración del constructor en Java.
  • Si hemos definido un constructor parametrizado, el compilador no creará un constructor predeterminado. y viceversa, si no definimos ningún constructor, el compilador crea el constructor predeterminado (también conocido como constructor sin argumentos) de forma predeterminada durante la compilación
  • La llamada al constructor recursivo no es válida en java.

Sobrecarga de constructores vs sobrecarga de métodos

Estrictamente hablando, la sobrecarga de constructores es algo similar a la sobrecarga de métodos. Si queremos tener diferentes formas de inicializar un objeto usando un número diferente de parámetros, entonces debemos sobrecargar el constructor como lo hacemos con la sobrecarga de métodos cuando queremos diferentes definiciones de un método basadas en diferentes parámetros.

Este artículo es una contribución de Gaurav Miglani . Si te gusta GeeksforGeeks y te gustaría contribuir, también puedes escribir un artículo usando write.geeksforgeeks.org o enviar tu artículo por correo a review-team@geeksforgeeks.org. Vea su artículo que aparece en la página principal de GeeksforGeeks y ayude a otros Geeks.

Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 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 *