En Java creamos objetos todos los días y para ellos usamos constructores. Todos estamos muy habituados a programarlos pero siempre hay algunos bordes que se nos escapan, vamos a revisarlos. Supongamos que tenemos la siguiente clase:
package com.arquitecturajava; public class Persona { private String nombre; public String getNombre() { return nombre; } public void setNombre(String nombre) { this.nombre = nombre; } }
Java Constructores por defecto
¿Tiene esta clase algún constructor?. La respuesta es sí toda clase Java si no se le incluye ningún constructor el compilador añade un constructor por defecto. Así pues el código para el compilador sería el siguiente:
package com.arquitecturajava; public class Persona { private String nombre; public Persona() { } public String getNombre() { return nombre; } public void setNombre(String nombre) { this.nombre = nombre; } }
Como vemos para el compilador existe un constructor por defecto vacío. ¿Ahora bien y si el código de nuestra clase incluyera un constructor con un parámetro?
package com.arquitecturajava; public class Persona { private String nombre; public Persona(String nombre) { this.nombre = nombre; } public String getNombre() { return nombre; } public void setNombre(String nombre) { this.nombre = nombre; } }
En ese caso Java no añade el constructor por defecto. Así pues en ambos casos tenemos un único constructor.
Java constructores y super()
Las dudas con los constructores aparecen ligadas a las jerarquías de clases y a la palabra super(). Supongamos que tenemos la siguiente jerarquía:
En este caso podemos tener dos clases con el siguiente código por simplificar al máximo :
package com.arquitecturajava; public class Persona { private String nombre; public String getNombre() { return nombre; } public void setNombre(String nombre) { this.nombre = nombre; } }
package com.arquitecturajava; public class Deportista extends Persona{ }
Aunque en el código no aparezcan constructores existen dos constructores por defecto uno en cada clase (Persona,Deportista) con el siguiente código:
Persona.java
public Persona() { super(); }
Deportista.java
public Deportista() { super(); }
Como podemos ver todos los constructores llaman por defecto al constructor de la clase superior a través de una llamada a super() (en este caso al constructor por defecto). Esto es debido a que los constructores no se heredan entre jerarquías de clases. Por lo tanto la palabra super() siempre es la primera línea de un constructor e invoca al constructor de la clase superior que comparta el mismo tipo de parametrización.
Aunque nosotros no pongamos la palabra super() esta siempre será añadida salvo que nosotros la añadamos. Por ejemplo si nuestros constructores tienen parámetros las claúsulas super que deberemos construir serán las siguientes entre Persona y Deportista para que el código compile:
package com.arquitecturajava; public class Persona { public Persona(String nombre) { super(); this.nombre = nombre; } private String nombre; public String getNombre() { return nombre; } public void setNombre(String nombre) { this.nombre = nombre; } }
package com.arquitecturajava; public class Deportista extends Persona{ public Deportista(String nombre) { super(nombre); } }
Ya que sino el compilador añadirá super() por defecto y el código no compilará al carecer la clase Persona de un constructor por defecto.
Usando this()
La otra posibilidad a super() es el uso de this() en la primera linea de un constructor. Esto lo que hace es invocar a otro constructor que este en la misma clase y que soporte el conjunto de parámetros que le pasamos.
package com.arquitecturajava; public class Deportista extends Persona{ private String deporte; public String getDeporte() { return deporte; } public Deportista(String nombre, String deporte) { this(nombre); this.deporte = deporte; } public void setDeporte(String deporte) { this.deporte = deporte; } public Deportista(String nombre) { super(nombre); // TODO Auto-generated constructor stub } }
El uso de this() y de super() es excluyente o usamos uno u otro.
Buen aporte, muchas gracias.
De nada
Entonces , en el primer ejemplo no le añade super() , faltaría decir que el compilador lo añade , me refiero cuando emes la clase persona sola.
Si efectivamente, de persona haría super a object
[…] artículos relacionados: Java this vs this() , Java Constructores this() y super() , Java interface y […]
[…] artículos relacionados: Java y Constructores , Java 8 Lambda , Java […]
[…] artículos relacionados: Java this vs super() , Java equals vs […]
Buenas !!
Gracias por la explicación
Quería a ser posible pedirte algo.
¿ Puedes poner o indicarme algún lugar dónde explique o pueda ver como usar la palabra clave ‘this’ dentro de los parametros de un metodo de instancia de una clase Java para hacer referencia al objeto de la propía clase Java ?
Tengo una idea aproximada de lo que es pero no encuentro ejemplos ilustrativos de como usarse , el correcto uso de ello o de código en si que muestre tal acción.
Gracias por su atención.
Atentamente un seguidor.
[…] artículos relacionados : Java super() y this() , Java […]
[…] artículos relacionados: Java equals y hashcode , this() y super, java fluid […]
Tengo unas preguntas: en el caso del primer super() el que esta dentro de desportista Al especificar super() lo que hacemos es llamar al constructor de la clase superior que en este caso es la clase object correcto? Si no especificamos super() por defecto el compilador añade un super() que lo que hace es llamar al constructor de la clase superior que es object verdad? luego no haria falta espeficiar el primer super no? no acabo de ver claro y la diferencia (a mi me compila). para finalizar cuando en un comentario dices: Si ejecutará otro constructor de la clase… Read more »
super siempre es implicito aunque no lo pongas 🙂 , salvo en el caso de que uses this() en la primera línea del constructor en ese caso se delegara en el constructor que corresponda y este llamara a super
Te faltó mencionar que la visibilidad del constructor por defecto es solo dentro del package que contiene la clase, mientras que si se define un constructor por defecto manualmente es visible en toda la aplicación.
Saludos, buen blog.-
gracias por el aporte 🙂
[…] artículos relacionados: Entendiendo los constructores en Java ,El concepto de Java Interface ,Java […]
Cecilio un saludo,
En el ultimo ejemplo dice que this() y super() con mutuamente excluyentes, pero tambien dices que this() ejecutará otro constructor de la clase.
Me quede en un loop allí, ese ejemplo me parece que ambos constructores se van a ejecutar, es así?
Si ejecutará otro constructor de la clase que no sea en el que estas . Este otro constructor será el que llame a super 🙂
Buena explicación !!! Por cierto, ¿podrías hacer un articulo explicando las diferencias entre un JavaBean, un POJO, un DTO y un VO ? asi como saber cuando se debe usar cada uno, se te agradeceria !!!
Saludos
Lo tienes en un video del blog 🙂 https://www.arquitecturajava.com/pojos-vo-dto-y-javabeans/
Gracias 😀
de nada 🙂