¿Qué es un constructor en Java?

Si en el artículo anterior te expliqué qué era un objeto, en este vamos a hablar de qué es un constructor en Java y qué características tiene.

More...

¿Qué diferencia hay entre un método y un constructor en Java?

Aunque son similares, tanto la función de un método como su signatura son diferentes a los de un constructor. Volvamos de nuevo al ejemplo del artículo anterior, la clase Lampara:

¿Qué ocurre si ejecutas este código?

Si tu respuesta es que creas un objeto de tipo Lampara de color rojo, te equivocas: en este ejemplo, Lampara(String color) es un método, y no un constructor.

¿Cuál es la diferencia? Que un constructor en Java nunca especifica un valor de devolución. Como ves, en el método del ejemplo se especifica void. Presta atención, porque el hecho de que un método pueda tener el mismo nombre que la clase que lo contiene puede dar lugar a confusión. No es código bien escrito, por confuso, pero es válido, y puede aparecer en el examen.

Punto 1: un constructor en Java nunca especifica un valor de devolución.

Compártelo

¿Qué es un constructor explícito?

Quizá recuerdes que en el artículo anterior te planteé, como ejercicio, que averiguaras cuántos objetos se creaban en el código que te mostraba. Es posible que observaras que, aunque el código compilaba a la perfección y los objetos se instanciaban, no había ningún constructor a la vista.

Esto se debe a que una clase en Java siempre ha de tener un constructor. Así, si tú no lo creas de manera explícita, la clase crea un constructor implícito, que ni acepta parámetros ni realiza otra función más que la de instanciar los objetos. Una clase sin constructor es, pues, igual que una clase con el siguiente constructor:

Ten en cuenta que, en cuanto una clase contiene un constructor en Java, el constructor implícito deja de existir. Es decir, si el constructor de la clase Lampara tiene un parámetro, ya no podremos instanciar un objeto de tipo Lampara sin ningún parámetro, a no ser que creemos otro constructor que no acepte parámetros.

Sí, una clase con dos constructores compila y se ejecuta. Y ahora es posible que te hagas la siguiente pregunta:

¿Cuántos constructores puede contener una clase?

El número de constructores que puede contener una clase en Java es ilimitado, siempre y cuando su signatura sea distinta. Es decir, han de ser constructores sobrecargados, que acepten distintos parámetros.

Punto 2: los constructores se pueden sobrecargar.

Compártelo

Veamos varios casos que puedes encontrarte, ya sea en el examen o en el mundo real:

Constructores independientes

En este caso, cada constructor es capaz de instanciar un objeto distinto.

En el caso del primer objeto instanciado, lampara, la variable mColor toma el valor predeterminado que, en este caso (al ser String un objeto) es null.

Constructores en cascada

En este otro caso, coexisten varios constructores al igual que en el caso anterior, pero cada uno requiere un parámetro más que el anterior. Así, si instancias un objeto con el menor número de parámetros posible, cada constructor va a inicializar una variable por sí mismo y va a enviar al siguiente constructor las variables ya inicializadas mediante la palabra clave this()

¿Un poco confuso? Déjame que te ponga un ejemplo:

Cada vez que he instanciado un objeto de tipo Lampara, he introducido un parámetro nuevo. En el primer objeto se han utilizado los tres constructores; en el segundo, solo dos; en el último, solo un constructor.

¿Qué es this() y cómo se utiliza?

Como ves, he utilizado this() para pasar de un constructor a otro los parámetros necesarios. Lo único que tienes que saber es que this(), si se utiliza, siempre ha de ser la primera línea dentro del constructor. El constructor puede contener más código, pero this() ha de estar siempre en primer lugar.

Además, this() solo se puede utilizar en un constructor, no en un método.

¿Y si, en lugar de this(), utilizo new para instanciar un objeto utilizando el otro constructor?

Veamos un ejemplo, para que quede claro de a qué me refiero:

Como ves, el resultado es muy distinto al anterior. Al utilizar new Lampara(), lo que hacemos es crear otro objeto distinto, que de inmediato se descarta, ya que no se guarda en ninguna parte. Así, en los dos primeros objetos instanciados sus variables toman los valores predeterminados (null y false), y es el tercer objeto el único que se instancia con los valores introducidos.

Constructores que requieren los mismos parámetros, pero en distinto orden

Bueno, esto ya va a mala intención, pero sí: pueden coexistir dos o más constructores que requieran los mismos parámetros, siempre y cuando los parámetros estén en distinto orden. Tenlo en cuenta para el examen.

Otras características del constructor en Java

Los constructores pueden ser...

  • check
    public
  • check
    private
  • check
    protected

Los constructores NO pueden ser...

  • check
    static
  • check
    final
  • check
    abstract
  • check
    synchronized o native (estos dos no entran en el examen OCA, pero es bueno saberlo de todas formas).

El siguiente artículo será más práctico, de manera que crearemos por fin ese objeto de tipo Lampara y te explicaré qué es la encapsulación y cómo definir las características y comportamientos de los objetos, como ya te prometí en el artículo anterior.

Más adelante, tocaré el tema del orden de inicialización, es decir, qué ocurre dentro de una clase cuando se instancia. Échale un vistazo a la herencia, porque también hablaremos del orden en el que se ejecutan los constructores cuando una clase hereda de otra.

¡Vaya, un montón de información! Te recomiendo que te suscribas, si quieres seguir aprendiendo y no perderte nada :).

Ejercicios recomendados

Instancia clases, crea objetos con varias variables y varios constructores. Puedes tomar como punto de partida la clase Lampara​ y modificarla las veces que quieras.

Cuando me estaba preparando para el OCA, siempre intentaba imaginarme con qué podrían sorprenderme en el examen; qué trampas me podrían colocar. De ahí, ese punto que aparece más arriba sobre constructores con los mismos parámetros en distinto orden 🙂 ¿Qué otros ejemplos enrevesados se te ocurren a ti? ¡Espero tu respuesta en los comentarios!

Deja una respuesta 3 comentarios